Внешнее хранилище управляется комбинацией службы 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
.)
- Разработчики могут продолжать строить пути динамически или статически в зависимости от своего варианта использования. Включение UUID в путь идентифицирует каждую карту, чтобы сделать ее более понятной для разработчиков. (Например,
-
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
для определения типов файловых систем перед монтированием, и пользователи могут выбрать форматирование носителя, когда файловая система не поддерживается.