پیکربندی دستگاه

فضای ذخیره‌سازی خارجی با ترکیبی از سرویس اولیه vold و سرویس سیستم StorageManagerService مدیریت می‌شود. vold نصب حجم‌های ذخیره‌سازی خارجی فیزیکی را مدیریت می‌کند، و عملیات آماده‌سازی را برای آماده کردن رسانه قبل‌از نمایش آن به برنامه‌ها انجام می‌دهد.

توجه: در Android 8.0، کلاس MountService به StorageManagerService تغییر نام داده است.

نگاشت‌های فایل

برای Android نسخه ۴.۲.۲ و نسخه‌های قدیمی‌تر، فایل پیکربندی vold.fstab ویژه دستگاه، نگاشت‌های دستگاه‌های sysfs به نقاط نصب سیستم فایل را تعریف می‌کند و هر خط از این قالب پیروی می‌کند:

dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
  • ‫label: برچسب میزان صدا.
  • ‫mount_point: مسیر سیستم فایل که حجم باید در آن نصب شود.
  • partition: شماره پارتیشن (مبنای ۱)، یا «خودکار» برای اولین پارتیشن قابل‌استفاده.
  • ‫sysfs_path: یک یا چند مسیر sysfs به دستگاه‌هایی که می‌توانند این نقطه نصب را ارائه دهند. با فاصله از هم جدا شده باشند و هرکدام باید با / شروع شود.
  • ‫flags: فهرست اختیاری پرچم‌ها که با کاما از هم جدا شده‌اند، نباید حاوی / باشد. مقادیر ممکن شامل nonremovable و encryptable است.

برای نسخه‌های Android 4.3 و بالاتر، فایل‌های fstab مختلفی که توسط init،‏ vold، و بازیابی استفاده می‌شوند در فایل /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)، جزئیات پیکربندی به دو دسته تقسیم می‌شوند.

‫Android 5.x و نسخه‌های قدیمی‌تر

فایل پیکربندی storage_list.xml مختص دستگاه که معمولاً ازطریق رونهاد frameworks/base ارائه می‌شود، ویژگی‌ها و محدودیت‌های دستگاه‌های ذخیره‌سازی را تعریف می‌کند. عنصر <StorageList> شامل یک یا چند عنصر <storage> است که دقیقاً یکی از آن‌ها باید به‌عنوان اصلی علامت‌گذاری شود. مشخصه‌های <storage> عبارت‌اند از:

  • ‫mountPoint: مسیر سیستم فایل این نصب.
  • ‫storageDescription: منبع رشته‌ای که این سوار کردن را توصیف می‌کند.
  • ‫primary: اگر این محل نصب فضای ذخیره‌سازی خارجی اصلی باشد، درست است.
  • removable: اگر این نصب دارای رسانه قابل‌حذف باشد، مثل کارت SD فیزیکی، درست است.
  • emulated: اگر این سوار کردن شبیه‌سازی شده باشد و توسط فضای ذخیره‌سازی داخلی پشتیبانی شود، احتمالاً بااستفاده از شبح FUSE، مقدار true خواهد بود.
  • ‫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 نیز باید به همان مکان، احتمالاً ازطریق پیوند نمادین، منتهی شود. اگر دستگاهی مکان فضای ذخیره‌سازی خارجی را بین به‌روزرسانی‌های پلاتفرم تغییر دهد، باید پیوندهای نمادین ایجاد شود تا مسیرهای قدیمی همچنان کار کنند.

Android 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 قالب‌بندی شده است. ‫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 برای تشخیص انواع سیستم فایل قبل‌از نصب استفاده می‌کند و کاربران می‌توانند انتخاب کنند که رسانه را درصورت پشتیبانی نشدن از سیستم فایل قالب‌بندی کنند.