前置知識
External Storage(外部存儲)
分類
-
traditional storage(傳統存儲)
- portable storage(便攜式存儲): SD卡或USB設備。
- emulated storage(模擬存儲):將部分內部存儲暴露於模擬層來實現存儲。
-
adoptable storage(可合並的存儲設備)
這種存儲設備是指可以像內部存儲設備那樣進行加密和格式化的物理介質(例如 SD 卡或 USB 設備)。
fstab配置
android的 external storage 由Vold 和 StroageManagerService
共同管理。
‼️ 在 Android 8.0 中,
MountService
類已更名為StorageManagerService
。
Android 4.3 及更高版本,init、vold 和 recovery 所使用的各種 fstab 文件在 /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
會忽略此字段中不包含voldmanaged=
標記的統一的 fstab 中的任何行。該標記必須后跟描述卡的標簽,以及分區號或字詞auto
。例如:voldmanaged=sdcard:auto
。其他可能的標記有nonremovable
、encryptable=sdcard
、noemulatedsd
和encryptable=userdata
。
對於adoptable storage,需要在fstab中通過在fs_mgr_flags
中 設置encryptable=userdata
顯式說明。如果沒有這個flag,都會被vold當做便攜式設備處理。
/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
。
在Vold創建存儲卷時,我們就能看到相關的代碼了。
在 fstab
中,具有 voldmanaged
屬性的存儲設備默認被視為便攜式設備,除非定義了其他屬性(如 encryptable=userdata
)。例如,典型的 USB OTG 設備的定義如下:
/devices/*/xhci-hcd.0.auto/usb* auto auto defaults voldmanaged=usb:auto
該平台在裝載之前使用 blkid
檢測文件系統類型,用戶可以選擇在文件系統不受支持時將媒體格式化。
RK平台的 fstab 文件
# Android fstab file.
#<src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>
# The filesystem that contains the filesystem checker binary (typically /system) cannot
# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
/dev/block/by-name/oem /oem ext4 ro,noatime,nodiratime,noauto_da_alloc wait,check
/dev/block/by-name/cache /cache ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard wait,check
/dev/block/by-name/metadata /metadata ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard wait
/dev/block/by-name/misc /misc emmc defaults defaults
/devices/platform/*usb* auto vfat defaults voldmanaged=usb:auto
/dev/block/zram0 none swap defaults zramsize=50%
# For sdmmc
/devices/platform/fe320000.dwmmc/mmc_host* auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
說明
本文大多數內容摘選自Android 開源項目--存儲。