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

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

توجه: در اندروید 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، ولد و بازیابی استفاده می‌شوند در فایل /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 : مسیر سیستم فایل این mount.
  • storageDescription : منبع رشته ای که این مانت را توصیف می کند.
  • primary : اگر این مانت حافظه خارجی اولیه باشد درست است.
  • removable : اگر این پایه دارای رسانه های قابل جابجایی باشد، مانند کارت SD فیزیکی، درست است.
  • emulated : اگر این مانت شبیه سازی شده باشد و توسط حافظه داخلی پشتیبانی می شود، احتمالاً با استفاده از دیمون FUSE درست است.
  • mtp-reserve : تعداد مگابایت فضای ذخیره‌سازی که MTP باید برای ذخیره‌سازی رایگان ذخیره کند. فقط زمانی استفاده می شود که mount به عنوان شبیه سازی شده علامت گذاری شده باشد.
  • 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 فرمت می‌شود. نوع پارتیشن 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 برای شناسایی انواع سیستم فایل قبل از نصب استفاده می‌کند و کاربران می‌توانند زمانی که فایل سیستم پشتیبانی نمی‌شود، فرمت رسانه را انتخاب کنند.