分类
- 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 设备的定义如下:
i.MX8MPlus挂载外部SD卡挂载实例
不能照搬例程https://source.android.com/devices/storage/config
正确的fstab项应该如下所示,去除最后的“encryptable=userdata”,我们需要的就是便携式设备。
/devices/platform/soc@0/30800000.bus/30b50000.mmc/mmc_host* auto auto defaults voldmanaged=sdcard1:auto