Конфигурация устройства

Внешнее хранилище управляется комбинацией службы vold init и системной службы StorageManagerService . Монтированием физических томов внешнего хранилища занимается vold , который выполняет промежуточные операции для подготовки носителя перед тем, как предоставить его приложениям.

Примечание. В Android 8.0 класс MountService был переименован в StorageManagerService .

Сопоставления файлов

Для Android 4.2.2 и более ранних vold.fstab файл конфигурации vold.fstab для конкретного 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) детали конфигурации разделены на две категории.

Android 5.x и более ранние версии

storage_list.xml конфигурации storage_list.xml для конкретного storage_list.xml , обычно предоставляемый через наложение frameworks/base , определяет атрибуты и ограничения устройств хранения. Элемент <StorageList> содержит один или несколько элементов <storage> , ровно один из которых должен быть помечен как основной. Атрибуты <storage> включают:

  • mountPoint : путь к файловой системе этого монтирования.
  • storageDescription : строковый ресурс, описывающий это крепление.
  • primary : true, если это монтирование является основным внешним хранилищем.
  • removable : истина, если это крепление имеет съемный носитель, например физическую SD-карту.
  • emulated : true, если это монтирование эмулируется и поддерживается внутренней памятью, возможно, с использованием демона FUSE.
  • mtp-reserve : количество МБ хранилища, которое MTP должен зарезервировать для бесплатного хранения. Используется только тогда, когда mount помечена как эмулированная.
  • allowMassStorage : true, если к этому монтированию можно предоставить общий allowMassStorage через запоминающее устройство USB.
  • maxFileSize : максимальный размер файла в МБ.

Устройства могут предоставлять внешнее хранилище, имитируя нечувствительную к регистру файловую систему без прав доступа, поддерживаемую внутренним хранилищем. Одна из возможных реализаций предоставляется демоном FUSE в system/core/sdcard , который может быть добавлен как сервис init.rc конкретного 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 ресурса storage_list.xml было удалено и больше не используется платформой. Устройства хранения теперь настраиваются динамически при обнаружении vold .
  • EMULATED_STORAGE_SOURCE/TARGET среды EMULATED_STORAGE_SOURCE/TARGET были удалены и больше не используются Zygote для настройки пользовательских точек монтирования. Вместо этого разделение пользователей теперь осуществляется с помощью пользовательских GID, а основное общее хранилище монтируется на место с помощью vold во время выполнения.
    • Разработчики могут продолжать строить пути динамически или статически в зависимости от своего варианта использования. Включение UUID в путь идентифицирует каждую карту, чтобы сделать ее более понятной для разработчиков. (Например, /storage/ABCD-1234/report.txt явно отличается от /storage/DCBA-4321/report.txt .)
  • init.rc запрограммированные службы FUSE были удалены из файлов init.rc конкретных init.rc и вместо vold при необходимости динамически разветвляются из 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 для определения типов файловых систем перед монтированием, и пользователи могут выбрать форматирование носителя, когда файловая система не поддерживается.