Android Fstab配置说明
1. 概述¶
本文档介绍了在SigmaStar Android平台如何配置fstab。
2. fstab介绍¶
2.1. 基本介绍¶
fstab是Unix或类Unix的系统配置文件,fstab文件中记录了系统的分区挂载相关的信息,例如设备节点、挂载点、挂载参数等。fstab会被“mount”命令读取,例如当执行“mount -a”时,mount命令会将fstab中的所有entry都挂载起来。
fstab详细介绍请参考维基百科:https://en.wikipedia.org/wiki/Fstab
2.2. 基本格式¶
# Android fstab file. #<dev> <mnt_point> <type> <mnt_flags options> <fs_mgr_flags> /dev/block/platform/soc/soc:emmc/by-name/system /system ext4 ro,barrier=1,inode_readahead_blks=8 wait,slotselect,first_stage_mount /dev/block/platform/soc/soc:emmc/by-name/vendor /vendor ext4 ro,barrier=1,inode_readahead_blks=8 wait,slotselect,first_stage_mount /dev/block/platform/soc/soc:emmc/by-name/odm /odm ext4 ro,barrier=1,inode_readahead_blks=8 wait,slotselect,first_stage_mount /dev/block/platform/soc/soc:emmc/by-name/factory /mnt/factory ext4 nosuid,nodev,nodiratime,noatime,errors=panic latemount,wait /dev/block/platform/soc/soc:emmc/by-name/userdata /data ext4 nosuid,nodev,nodiratime,noatime,errors=panic latemount,wait,formattable,resize,quota/dev/block/platform/soc/soc:emmc/by-name/misc /misc emmc defaults defaults /dev/block/platform/soc/soc:emmc/by-name/cache /cache ext4 noatime,nosuid,nodev,nodelalloc,nomblk_io_submit,errors=panic latemount,wait,check,formattable /dev/block/zram0 none swap defaults zramsize=25% /devices/platform/soc/*Sstar-ehci-1/* auto auto defaults voldmanaged=udisk:auto
每一行为一个条目,该条目完整描述了mount
命令挂载一个分区所需的所有参数,其中:
说明 | |
---|---|
dev | 需要被挂载的块设备文件节点 |
mnt_point | 挂载到的目录,例如vendor分区的挂载点是/vendor |
type | 文件系统类型,例如ext4、f2fs、swap等 |
mnt_flags | 分区挂载相关参数,例如ro即挂载为只读,启用barrier功能 |
fs_mgr_flags | Android fs_mgr模块相关参数,例如slotselect即存在A/B分区、first_stage_mount即在first_stage_init将其挂载 |
3. fstab的配置¶
3.1. fstab所在位置与编译配置¶
以当前lunch的device为pioneer5_sdp-userdebug为例,其device目录在:
<AOSP>/device/sigmastar/pioneer5
其product目录在:
<AOSP>/device/sigmastar/pioneer5/pioneer5_sdp
目前我们将搭配各种设定配置(AVB、动态分区)的fstab都放到了platform device目录,以当前pioneer5为例:
~/workspace/AOSP$ ls -1 device/sigmastar/pioneer5/fstab.sstar* device/sigmastar/pioneer5/fstab.sstar device/sigmastar/pioneer5/fstab.sstar.nonavb device/sigmastar/pioneer5/fstab.sstar.nondynamic device/sigmastar/pioneer5/fstab.sstar.nondynamic.nonavb
在device-common.mk或device.mk会根据当前配置选中fstab,例如:
# device/sigmastar/pioneer5/device-common.mk # Install fstab and package_file.txt ifeq ($(SSTAR_ENABLE_DYNAMIC_PARTITIONS),true) PRODUCT_USE_DYNAMIC_PARTITIONS := true ifeq ($(SSTAR_ENABLE_AVB),true) PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/fstab.sstar:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/first_stage_ramdisk/fstab.sstar \ $(LOCAL_PATH)/fstab.sstar:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.sstar \ TARGET_RECOVERY_FSTAB := $(LOCAL_PATH)/fstab.sstar else PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/fstab.sstar.nonavb:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/first_stage_ramdisk/fstab.sstar \ $(LOCAL_PATH)/fstab.sstar.nonavb:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.sstar \ TARGET_RECOVERY_FSTAB := $(LOCAL_PATH)/fstab.sstar.nonavb endif # SSTAR_ENABLE_AVB else ifeq ($(SSTAR_ENABLE_AVB),true) PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/fstab.sstar.nondynamic:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/first_stage_ramdisk/fstab.sstar \ $(LOCAL_PATH)/fstab.sstar.nondynamic:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.sstar \ TARGET_RECOVERY_FSTAB := $(LOCAL_PATH)/fstab.sstar.nondynamic else PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/fstab.sstar.nondynamic.nonavb:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/first_stage_ramdisk/fstab.sstar \ $(LOCAL_PATH)/fstab.sstar.nondynamic.nonavb:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.sstar \ TARGET_RECOVERY_FSTAB := $(LOCAL_PATH)/fstab.sstar.nondynamic.nonavb endif # SSTAR_ENABLE_AVB endif # SSTAR_ENABLE_DYNAMIC_PARTITIONS
以SSTAR_ENABLE_AVB=false
且SSTAR_ENABLE_DYNAMIC_PARTITIONS=false
为例:
- 拷贝当前目录的fstab.sstar.nodynamic.nonavb到vendor ramdisk中的/first_stage_ramdisk/fstab.sstar
- 拷贝当前目录的fstab.sstar.nodynamic.nonavb到vendor中的/etc/fstab.sstar
- 设定Recovery的fstab是当前目录的fstab.sstar.nodynamic.nonavb
编译AOSP之后可以看到:
~/workspace/AOSP/out/target/product/pioneer5_sdp$ find vendor vendor_ramdisk -name fstab* vendor/etc/fstab.sstar vendor_ramdisk/first_stage_ramdisk/fstab.sstar
这两个文件在开发板的对应路径也可以看到。
3.2. fstab中的一些常见配置说明¶
3.2.1. dev的配置¶
例如2.2章中条目中的dev的前缀:/dev/block/platform/soc/soc:emmc/by-name,该目录是ueventd创建的,目录中以分区名创建链接文件:
在设定dev
时无需考虑AB分区的情况,以system为例,即存在system_a
和system_b
时,system条目中的dev
也是写成/dev/block/platform/soc/soc:emmc/by-name/system
即可,该分区是否是AB分区是通过fs_mgr_flags
中是否有slotselect
决定的,至于最后是选/dev/block/platform/soc/soc:emmc/by-name/system_a
还是/dev/block/platform/soc/soc:emmc/by-name/system_b
挂载到/system是由bootloader传过来的cmdline参数androidboot.slot_suffix
决定的,该命令行参数会自动由bootloader的A/B流程状态机设定,无需手动取设定。
3.2.2. type的配置¶
这个跟烧录到该分区的镜像格式有关,例如system、vendor、data一般是ext4或者f2fs。又例如misc分区没有文件系统,于是标记为emmc用于直接读写。
3.2.3. fs_mgr_flags的配置¶
slotselect:用于标记这个条目在挂载时需要在dev尾部追加cmdline参数androidboot.slot_suffix中的字串。
avb:标记该分区是否受avb保护,ab后面不带任何参数即代表其直接使用vbmeta分区中的vbmeta。如果要指定其使用的vbmeta在其他分区,可以指定avb=<分区名>
。
frist_stage_mount和late_mount:标识了该条目在init的某个特定阶段被挂载。