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=falseSSTAR_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_asystem_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的某个特定阶段被挂载。