إعداد الجهاز

تتم إدارة مساحة التخزين الخارجية من خلال مجموعة من خدمة vold init وخدمة النظام StorageManagerService. يعالج نظام vold عملية تركيب وحدات التخزين الخارجية المضمّنة، والذي يؤدي بدوره عمليات الإعداد لتجهيز الوسائط قبل عرضها للتطبيقات.

ملاحظة: في الإصدار 8.0 من نظام التشغيل Android، تمت إعادة تسمية فئة MountService إلى StorageManagerService.

عمليات ربط الملفات

بالنسبة إلى الإصدار 4.2.2 من نظام التشغيل Android والإصدارات الأقدم، يحدِّد ملف الإعدادات vold.fstab الخاص بالجهاز عمليات الربط من أجهزة sysfs إلى نقاط تثبيت ملف النظام، ويتّبع كل سطر التنسيق التالي:

dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
  • label: تصنيف مستوى الصوت
  • mount_point: مسار نظام الملفات الذي يجب تثبيت وحدة التخزين عليه
  • partition: رقم القسم (بدءًا من 1) أو "تلقائي" للقسم الأول القابل للاستخدام.
  • sysfs_path: مسار واحد أو أكثر من مسارات sysfs للأجهزة التي يمكنها توفير نقطة تثبيت هذه يجب فصلها بمسافات، ويجب أن يبدأ كل منها برمز /.
  • flags: قائمة اختيارية مفصولة بفواصل للعلامات، يجب ألا تحتوي على /. تشمل القيم المحتمَلة nonremovable وencryptable.

في إصدارات Android 4.3 والإصدارات الأحدث، تم توحيد ملفات fstab المختلفة التي تستخدمها init وvold و recovery في ملف /fstab.<device>. بالنسبة إلى مجلدات التخزين الخارجية التي تديرها vold، يجب أن يكون للعناصر الشكل التالي:

<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
  • src: مسار ضمن sysfs (يتم تثبيته عادةً في ‎ /sys) للجهاز الذي يمكنه توفير نقطة الربط يجب أن يبدأ المسار بـ /.
  • mount_point: مسار نظام الملفات الذي يجب تثبيت وحدة التخزين عليه
  • type: نوع نظام الملفات على وحدة التخزين بالنسبة إلى البطاقات الخارجية، يكون هذا عادةً vfat.
  • mnt_flags: تتجاهل Vold هذا الحقل ويجب ضبطه على defaults
  • fs_mgr_flags: يتجاهل Vold أي أسطر في ملف fstab المُدمَج التي لا تتضمّن العلامة voldmanaged= في هذا الحقل. يجب أن يلي هذا العلامة تصنيف يصف البطاقة ورقم القسم أو الكلمة auto. في ما يلي مثال: voldmanaged=sdcard:auto. تشمل العلامات الأخرى المحتملة nonremovable encryptable=sdcard وnoemulatedsd وencryptable=userdata.

تفاصيل الضبط

تتم معالجة تفاعلات التخزين الخارجي على مستوى الإطار العمل وما فوقه من خلال StorageManagerService. بسبب تغييرات الضبط في Android 6.0 (مثل إزالة تراكب المورد storage_list.xml)، تم تقسيم تفاصيل الضبط إلى فئتين.

الإصدار 5.x من Android والإصدارات الأقدم

يحدِّدملف storage_list.xml الخاص بالجهاز ، والذي يتم توفيره عادةً من خلال تراكب frameworks/base، سمات وحدات التخزين والقيود المفروضة عليها. يحتوي عنصر <StorageList> على عنصر <storage> واحد أو أكثر، ويجب وضع علامة "أساسية" على عنصر واحد بالضبط. تشمل سمات <storage> ما يلي:

  • mountPoint: مسار نظام الملفات لهذا التثبيت
  • storageDescription: مورد سلسلة يصف عملية التثبيت هذه
  • primary: صحيح إذا كان هذا التثبيت هو وحدة التخزين الخارجية الأساسية.
  • removable: صحيح إذا كان هذا الجهاز يشتمل على وسائط قابلة للإزالة، مثل بطاقة SD مادّية.
  • emulated: صحيح إذا كان هذا التثبيت محاكيًا ومستندًا إلى وحدة التخزين الداخلية، ربما باستخدام برنامج FUSE الخدمي
  • mtp-reserve: عدد وحدات التخزين بالكيلوبايت التي يجب أن يحجزها بروتوكول MTP لمساحة التخزين الخالية لا يتم استخدامها إلا عند وضع علامة على عملية التثبيت على أنّها محاكاة.
  • allowMassStorage: صحيح إذا كان يمكن مشاركة هذا الجهاز المُثبَّت عبر مساحة تخزين USB.
  • maxFileSize: الحد الأقصى لحجم الملف بالكيلوبايت

يمكن أن توفّر الأجهزة مساحة تخزين خارجية من خلال محاكاة نظام ملفات لا يراعي حالة الأحرف ولا يتطلب أذونات، ويتم الاحتفاظ بنسخة احتياطية منه في مساحة التخزين الداخلية. يقدّم برنامج FUSE daemon في system/core/sdcard أحد حلول التنفيذ المحتمَلة، ويمكن إضافته كخدمة init.rc خاصة بالجهاز:

# virtual sdcard daemon running as media_rw (1023)
service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023
    class late_start

حيث يكون source_path هو وحدة التخزين الداخلية الاحتياطية وdest_path هو نقطة الربط المستهدفة.

عند ضبط نص برمجي init.rc خاص بالجهاز، يجب تحديد متغيّر البيئة EXTERNAL_STORAGE كمسار إلى مساحة التخزين الخارجية الأساسية. يجب أيضًا أن يشير مسار /sdcard إلى الموقع الجغرافي نفسه، ربما من خلال رابط رمزي. إذا عدّل الجهاز موقع وحدة التخزين الخارجية بين تحديثات النظام الأساسي، يجب إنشاء روابط رمزية كي تستمر المسارات القديمة في العمل.

Android 6.0

يتم الآن ضبط الإعدادات في النظام الفرعي للتخزين فيملفfstab الخاص بالجهاز، وتم إزالة العديد من ملفات الإعدادات الثابتة السابقة/المتغيّرات لتوفير سلوك أكثر ديناميكية:

  • تمت إزالة تراكب الموارد storage_list.xml ولم يعُد إطار العمل يستخدمه. يتم الآن ضبط أجهزة التخزين بشكل ديناميكي عند رصدها من خلال vold.
  • تمت إزالة متغيّرات بيئة EMULATED_STORAGE_SOURCE/TARGET ولم تعُد تستخدمها أداة Zygote ل ضبط نقاط الربط الخاصة بالمستخدم. بدلاً من ذلك، يتم الآن فرض فصل المستخدمين باستخدام أرقام تعريف المجموعة الخاصة بالمستخدم، ويتم تثبيت مساحة التخزين المشتركة الأساسية في مكانها بواسطة vold أثناء التشغيل.
    • يمكن للمطوّرين مواصلة إنشاء المسارات بشكل ديناميكي أو ثابت استنادًا إلى حالة الاستخدام. يؤدي تضمين معرّف UUID في المسار إلى تحديد كل بطاقة لجعل الموقع الجغرافي أكثر وضوحًا للمطوّرين. (على سبيل المثال، من الواضح أنّ /storage/ABCD-1234/report.txt ملف مختلف عن /storage/DCBA-4321/report.txt).
  • تمت إزالة خدمات FUSE الثابتة من ملفات init.rc الخاصة بالأجهزة، ويتم إنشاء فروع منها ديناميكيًا من vold عند الحاجة.

بالإضافة إلى تغييرات الإعدادات هذه، يتضمّن نظام التشغيل Android 6.0 مفهوم مساحة التخزين القابلة للتخصيص. بالنسبة إلى أجهزة Android 6.0، يتم عرض أي وسائط مادية غير متوافقة على أنّها قابلة للنقل.

مساحة تخزين قابلة للاستخدام

للإشارة إلى جهاز تخزين قابل للاستبدال في fstab، استخدِم السمة encryptable=userdata في الحقل fs_mgr_flags. في ما يلي تعريف نموذجي:

/devices/platform/mtk-msdc.1/mmc_host*           auto      auto     defaults
voldmanaged=sdcard1:auto,encryptable=userdata

عند اعتماد جهاز تخزين، تمحو المنصة المحتوى وتكتب جدول تقسيم GUID الذي يحدِّد قسمَين:

  • قسم android_meta صغير فارغ محجوز للاستخدام في المستقبل رقم تعريف GUID لنوع القسم هو 19A710A2-B3CA-11E4-B026-10604B889DCF.
  • قسم android_ext كبير مشفَّر باستخدام dm-crypt ومصغَّر باستخدام ext4 أو f2fs استنادًا إلى إمكانات kernel رقم تعريف GUID لنوع القسم هو 193D1EA4-B3CA-11E4-B075-10604B889DCF.

وحدة تخزين محمولة

في fstab، تُعدّ أجهزة التخزين التي تحتوي على السمة voldmanaged قابلة للنقل تلقائيًا ما لم يتم تحديد سمة أخرى مثل encryptable=userdata. على سبيل المثال، إليك تعريفًا نموذجيًا لأجهزة USB OTG:

/devices/*/xhci-hcd.0.auto/usb*             auto            auto    defaults
                                                    voldmanaged=usb:auto

تستخدم المنصة blkid لرصد أنواع أنظمة الملفات قبل تركيبها، ويمكن للمستخدمين اختيار إعادة تنسيق الوسائط عندما يكون نظام الملفات غير متوافق.