前置知识
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 开源项目--存储。