Konfiguracja urządzenia

Pamięci zewnętrznej zarządza kombinacja usługi vold init i usługi StorageManagerService system. Zarządzanie woluminami zewnętrznych nośników danych jest obsługiwane przez vold, który wykonuje operacje wstępnego przygotowania nośnika przed udostępnieniem go aplikacjom.

Uwaga: w Androidzie 8.0 klasa MountService została przemianowana na StorageManagerService.

Mapowania plików

W przypadku Androida 4.2.2 i starszych plik konfiguracji vold.fstab na urządzeniu określa mapowania urządzeń sysfs na punkty montowania w systemie plików. Każdy wiersz ma taki format:

dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
  • label: etykieta woluminu.
  • mount_point: ścieżka systemu plików, w którym należy zamontować wolumin.
  • partition: numer partycji (liczony od 1) lub „auto” w przypadku pierwszej dostępnej partycji.
  • sysfs_path: co najmniej 1 ścieżka sysfs do urządzeń, które mogą udostępniać ten punkt zamontowania. muszą być oddzielone spacjami i każdy z nich musi zaczynać się od /.
  • flags: opcjonalna lista flag oddzielonych przecinkami, która nie może zawierać /. Możliwe wartości to nonremovable i encryptable.

W wersjach Androida 4.3 i nowszych różne pliki fstab używane przez init, vold i recovery zostały scalone w pliku /fstab.<device>. W przypadku zewnętrznych woluminów pamięci masowej zarządzanych przez vold wpisy powinny mieć następujący format:

<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
  • src: ścieżka w sysfs (zwykle zamontowana w katalogu /sys) do urządzenia, które może udostępnić punkt zamontowania. Ścieżka musi się zaczynać od /.
  • mount_point: ścieżka systemu plików, w którym należy zamontować wolumin.
  • type: typ systemu plików na woluminie. W przypadku kart zewnętrznych jest to zwykle vfat.
  • mnt_flags: Vold ignoruje to pole i powinno być ustawione na defaults
  • fs_mgr_flags: Vold ignoruje wszystkie wiersze w zjednoczonym pliku fstab, które nie zawierają w tym polu flagi voldmanaged=. Po tym fragmencie musi nastąpić etykieta opisująca kartę oraz numer partycji lub słowo auto. Oto przykład: voldmanaged=sdcard:auto. Inne możliwe flagi to nonremovable, encryptable=sdcard, noemulatedsd i encryptable=userdata.

Szczegóły konfiguracji

Interakcje z zewnętrznym urządzeniem do przechowywania danych na poziomie lub powyżej poziomu ram są obsługiwane przez StorageManagerService. Z powodu zmian konfiguracji w Androidzie 6.0 (np. usunięcia zasobów z pliku storage_list.xml) szczegóły konfiguracji zostały podzielone na 2 kategorie.

Android 5.x i starsze

Plik konfiguracji storage_list.xml, który dotyczy konkretnego urządzenia, jest zwykle udostępniany za pomocą nakładki frameworks/base i określa atrybuty oraz ograniczenia urządzeń pamięci masowej. Element <StorageList> zawiera co najmniej 1 element <storage>, z których dokładnie 1 powinien być oznaczony jako element główny. Atrybuty <storage> to:

  • mountPoint: ścieżka do systemu plików tego zasobu.
  • storageDescription: zasób ciągu znaków opisujący ten punkt zaczepienia.
  • primary: wartość true, jeśli ten punkt dokowania jest podstawowym zewnętrznym miejscem na dane.
  • removable: wartość true, jeśli ten punkt zamontowania ma wymienny nośnik, np. kartę SD.
  • emulated: wartość prawda, jeśli ten punkt zamontowania jest emulowany i obsługiwany przez pamięć wewnętrzną, możliwie przy użyciu demona FUSE.
  • mtp-reserve: liczba MB wolnego miejsca na dane, które MTP powinno zarezerwować. Jest używany tylko wtedy, gdy punkt dokowania jest oznaczony jako emulowany.
  • allowMassStorage: wartość true (prawda), jeśli ten punkt zamontowania można udostępnić przez interfejs pamięci masowej USB.
  • maxFileSize: maksymalny rozmiar pliku w MB.

Urządzenia mogą udostępniać pamięć zewnętrzną, emulując system plików bez rozróżniania wielkości liter i bez uprawnień, który jest obsługiwany przez pamięć wewnętrzną. Jedną z możliwych implementacji jest demon FUSE w system/core/sdcard, który można dodać jako usługę init.rc na konkretnym urządzeniu:

# virtual sdcard daemon running as media_rw (1023)
service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023
    class late_start

Gdzie source_path to kopia zapasowa pamięci wewnętrznej, a dest_path to docelowy punkt podłączenia.

Podczas konfigurowania skryptu init.rc dla konkretnego urządzenia zmienna środowiskowa EXTERNAL_STORAGE musi być zdefiniowana jako ścieżka do podstawowego zewnętrznego miejsca na dane. Ścieżka /sdcard musi też wskazywać tę samą lokalizację, prawdopodobnie za pomocą symbolicznego linku. Jeśli urządzenie zmienia lokalizację pamięci zewnętrznej między aktualizacjami platformy, należy utworzyć symboliczne linki, aby stare ścieżki nadal działały.

Android 6.0

Konfiguracja podsystemu pamięci jest teraz skoncentrowana w pliku fstab specyficznym dla urządzenia, a kilka starszych statycznych plików konfiguracyjnych/zmiennych zostało usuniętych, aby umożliwić bardziej dynamiczne działanie:

  • Nakładka zasobu storage_list.xml została usunięta i nie jest już używana przez framework. Urządzenia pamięci są teraz konfigurowane dynamicznie po wykryciu przez vold.
  • Zmienne środowiskowe EMULATED_STORAGE_SOURCE/TARGET zostały usunięte i nie są już używane przez Zygote do konfigurowania punktów zamontowania dla poszczególnych użytkowników. Zamiast tego stosujemy teraz wymuszoną separację użytkowników za pomocą identyfikatorów GID na poziomie użytkownika. Główna pamięć współdzielona jest montowana przez vold w czasie działania.
    • Deweloperzy mogą nadal tworzyć ścieżki dynamicznie lub statycznie w zależności od przypadku użycia. Uwzględnienie identyfikatora UUID na ścieżce pozwala zidentyfikować każdą kartę, aby ułatwić deweloperom jej zlokalizowanie. (na przykład /storage/ABCD-1234/report.txt to wyraźnie inny plik niż /storage/DCBA-4321/report.txt).
  • W przypadku potrzebnym dynamicznym odgałęzieniami z poziomu vold są teraz używane zamiast zakodowanych na stałe usług FUSE.init.rc

Oprócz tych zmian konfiguracji Android 6.0 zawiera też pojęcie „adoptable storage”. W przypadku urządzeń z Androidem 6.0 wszystkie nośniki fizyczne, które nie są obsługiwane, są traktowane jako przenośne.

Pamięć dostosowywana

Aby wskazać urządzenie z adoptowanym miejscem na dane w fstab, użyj atrybutu encryptable=userdata w polu fs_mgr_flags. Oto typowa definicja:

/devices/platform/mtk-msdc.1/mmc_host*           auto      auto     defaults
voldmanaged=sdcard1:auto,encryptable=userdata

Gdy urządzenie pamięci zostanie zaadoptowane, platforma usuwa jego zawartość i zapisuje tabelę partycji GUID, która definiuje 2 partycje:

  • mały pusty android_meta, który jest zarezerwowany do wykorzystania w przyszłości. Identyfikator GUID typu partycji to 19A710A2-B3CA-11E4-B026-10604B889DCF.
  • dużym partycji android_ext, która jest zaszyfrowana za pomocą dm-crypt i sformatowana za pomocą ext4 lub f2fs w zależności od możliwości jądra. Identyfikator GUID typu partycji to 193D1EA4-B3CA-11E4-B075-10604B889DCF.

Pamięć przenośna

W fstab urządzenia pamięci masowej z atrybutem voldmanaged są domyślnie uważane za przenośne, chyba że zdefiniowany jest inny atrybut, na przykład encryptable=userdata. Oto na przykład typowa definicja urządzeń USB OTG:

/devices/*/xhci-hcd.0.auto/usb*             auto            auto    defaults
                                                    voldmanaged=usb:auto

Platforma używa blkid do wykrywania typów systemów plików przed zamontowaniem, a użytkownicy mogą sformatować nośnik, jeśli system plików nie jest obsługiwany.