تكوين الجهاز

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

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

تعيينات الملف

بالنسبة لنظام التشغيل Android 4.2.2 والإصدارات الأقدم، يحدد ملف التكوين 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 والإصدارات الأقدم

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

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

قد توفر الأجهزة وحدة تخزين خارجية عن طريق محاكاة نظام ملفات غير حساس لحالة الأحرف وغير مسموح به ومدعوم بوحدة تخزين داخلية. يتم توفير أحد التطبيقات الممكنة من خلال البرنامج الخفي FUSE في 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 أيضًا إلى نفس الموقع، ربما من خلال رابط رمزي. إذا قام جهاز بضبط موقع وحدة التخزين الخارجية بين تحديثات النظام الأساسي، فيجب إنشاء روابط رمزية بحيث تستمر المسارات القديمة في العمل.

أندرويد 6.0

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

  • تمت إزالة تراكب الموارد storage_list.xml ولم يعد مستخدمًا بواسطة إطار العمل. يتم الآن تكوين أجهزة التخزين ديناميكيًا عند اكتشافها بواسطة vold .
  • تمت إزالة متغيرات البيئة EMULATED_STORAGE_SOURCE/TARGET ولم تعد تستخدمها Zygote لتكوين نقاط التثبيت الخاصة بالمستخدم. بدلاً من ذلك، يتم الآن فرض فصل المستخدم باستخدام معرفات GID الخاصة بالمستخدم، ويتم تثبيت التخزين المشترك الأساسي في مكانه بواسطة 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 للكشف عن أنواع أنظمة الملفات قبل التثبيت، ويمكن للمستخدمين اختيار تنسيق الوسائط عندما يكون نظام الملفات غير مدعوم.