Внешнее хранилище управляется с помощью комбинации службы 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) сведения о конфигурации разделены на две категории.
Android 5.x и более ранние версии
 Файл конфигурации storage_list.xml для конкретного устройства, обычно предоставляемый через оверлей frameworks/base , определяет атрибуты и ограничения устройств хранения. Элемент <StorageList> содержит один или несколько элементов <storage> , ровно один из которых должен быть помечен как основной. Атрибуты <storage> включают в себя:
-  mountPoint: путь к файловой системе этого монтирования.
-  storageDescription: строковый ресурс, описывающий это монтирование.
-  primary: true, если это монтирование является основным внешним хранилищем.
-  removable: true, если у этого монтирования есть съемный носитель, например физическая SD-карта.
-  emulated: true, если это монтирование эмулируется и поддерживается внутренней памятью, возможно, с использованием демона FUSE.
-  mtp-reserve: количество МБ хранилища, которое MTP должен зарезервировать для бесплатного хранения. Используется только в том случае, если монтирование помечено как эмулируемое.
-  allowMassStorage: true, если это монтирование можно использовать совместно через 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в зависимости от возможностей ядра. 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 для определения типов файловых систем перед монтированием, и пользователи могут выбрать форматирование носителя, если файловая система не поддерживается.
