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