Android P环境,mkfs.erofs is required firstly. Let’s build vendor.img with erofs format.
build process for vendor with ext4 看下vendor image with ext4过程:
core/main.mk:1111:vendorimage: $(INSTALLED_VENDORIMAGE_TARGET)
INSTALLED_VENDORIMAGE_TARGET := $(BUILT_VENDORIMAGE_TARGET) $(INSTALLED_VENDORIMAGE_TARGET) : $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_VENDORIMAGE_FILES) $(INSTALLED_FILES_FILE_VENDOR) $(BUILD_IMAGE_SRCS) $(DEPMOD) $(BOARD_VENDOR_KERNEL_MODULES) $(build-vendorimage-target)
BUILT_VENDORIMAGE_TARGET := $(PRODUCT_OUT) /vendor.img define build-vendorimage-target $(call pretty,"Target vendor fs image: $(INSTALLED_VENDORIMAGE_TARGET) ") @mkdir -p $(TARGET_OUT_VENDOR) @mkdir -p $(vendorimage_intermediates) && rm -rf $(vendorimage_intermediates) /vendor_image_info.txt $(call generate-userimage-prop-dictionary, $(vendorimage_intermediates) /vendor_image_info.txt, skip_fsck=true) $(if $(BOARD_VENDOR_KERNEL_MODULES) , \ $(call build-image-kernel-modules,$(BOARD_VENDOR_KERNEL_MODULES) ,$(TARGET_OUT_VENDOR) ,vendor/,$(call intermediates-dir -for,PACKAGING,depmod_vendor) )) $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS) ,$(p) :) $$PATH \ build/make/tools/releasetools/build_image.py \ $(TARGET_OUT_VENDOR) $(vendorimage_intermediates) /vendor_image_info.txt $(INSTALLED_VENDORIMAGE_TARGET) $(TARGET_OUT) $(hide) $(call assert-max-image-size,$(INSTALLED_VENDORIMAGE_TARGET) ,$(BOARD_VENDORIMAGE_PARTITION_SIZE) ) endef
制作img的工具:
ifeq ($(INTERNAL_USERIMAGES_USE_EXT) ,true)INTERNAL_USERIMAGES_DEPS := $(SIMG2IMG) INTERNAL_USERIMAGES_DEPS += $(MKEXTUSERIMG) $(MAKE_EXT4FS) $(E2FSCK) ifeq ($(TARGET_USERIMAGES_USE_F2FS) ,true)INTERNAL_USERIMAGES_DEPS += $(MKF2FSUSERIMG) $(MAKE_F2FS) endif endif
工具定义:
./core/config.mk:668:MKEXTUSERIMG := $(HOST_OUT_EXECUTABLES)/mkuserimg_mke2fs.sh
用build/make/tools/releasetools/build_image.py去生成:
def BuildImage (in_dir, prop_dict, out_file, target_out=None ): """Build an image to out_file from in_dir with property prop_dict.
if image_filename == "system.img" : mount_point = "system" elif image_filename == "system_other.img" : mount_point = "system_other" elif image_filename == "userdata.img" : mount_point = "data" elif image_filename == "cache.img" : mount_point = "cache" elif image_filename == "vendor.img" : mount_point = "vendor" elif image_filename == "oem.img" : mount_point = "oem" elif image_filename == "product.img" : mount_point = "product" else : print ("error: unknown image file name " , image_filename, file=sys.stderr) sys.exit(1 ) image_properties = ImagePropFromGlobalDict(glob_dict, mount_point) if not BuildImage(in_dir, image_properties, out_file, target_out):
ok,下来就可以添加了。
add support for erofs image @@ -1095,6 +1095,11 @@ ifneq ($(filter $(BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE) $(BOARD_VENDORIMAGE_FILE_ INTERNAL_USERIMAGES_DEPS += $(MAKE_SQUASHFS) $(MKSQUASHFSUSERIMG) $(IMG2SIMG) endif +INTERNAL_USERIMAGES_SPARSE_EROFS_FLAG := -s +ifneq ($(filter $(BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE) $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE) $(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE) ,erofs) ,)+INTERNAL_USERIMAGES_DEPS += $(MAKE_EROFS) $(MKEROFSUSERIMG) $(IMG2SIMG) +endif + INTERNAL_USERIMAGES_BINARY_PATHS := $(sort $(dir $(INTERNAL_USERIMAGES_DEPS) ) ) ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT) .PRODUCT_SUPPORTS_VERITY)) @@ -1162,6 +1167,7 @@ $(if $(BOARD_OEMIMAGE_EXTFS_INODE_COUNT) ,$(hide) echo "oem_extfs_inode_count=$(B $(if $(BOARD_OEMIMAGE_EXTFS_RSV_PCT) ,$(hide) echo "oem_extfs_rsv_pct=$(BOARD_OEMIMAGE_EXTFS_RSV_PCT) " >> $(1) ) $(if $(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG) ,$(hide) echo "extfs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG) " >> $(1) ) $(if $(INTERNAL_USERIMAGES_SPARSE_SQUASHFS_FLAG) ,$(hide) echo "squashfs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_SQUASHFS_FLAG) " >> $(1) ) +$(if $(INTERNAL_USERIMAGES_SPARSE_EROFS_FLAG) ,$(hide) echo "erofs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_EROFS_FLAG) " >> $(1) )
build/make/core/config.mk:
MKF2FSUSERIMG := $(HOST_OUT_EXECUTABLES) /mkf2fsuserimg.sh +MAKE_EROFS := $(HOST_OUT_EXECUTABLES) /mkfs.erofs +MKEROFSUSERIMG := $(HOST_OUT_EXECUTABLES) /mkerofsimage.sh SIMG2IMG := $(HOST_OUT_EXECUTABLES) /simg2img$(HOST_EXECUTABLE_SUFFIX)
build/make/tools/releasetools/build_image.py:
@@ -597 ,6 +597 ,20 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None ): if "timestamp" in prop_dict: build_command.extend(["-T" , str (prop_dict["timestamp" ])]) build_command.extend(["-L" , prop_dict["mount_point" ]]) + elif fs_type.startswith("erofs" ): + build_command = ["mkerofsimage.sh" ] + build_command.extend([in_dir, out_file]) + if "erofs_sparse_flag" in prop_dict: + build_command.extend([prop_dict["erofs_sparse_flag" ]]) + build_command.extend(["-m" , prop_dict["mount_point" ]]) + if target_out: + build_command.extend(["-d" , target_out]) + if fs_config: + build_command.extend(["-C" , fs_config]) + if "selinux_fc" in prop_dict: + build_command.extend(["-c" , prop_dict["selinux_fc" ]]) + if "erofs_compressor" in prop_dict: + build_command.extend(["-z" , prop_dict["erofs_compressor" ]]) else : print ("Error: unknown filesystem type '%s'" % (fs_type)) return False @@ -704 ,6 +718 ,7 @@ def ImagePropFromGlobalDict(glob_dict, mount_point ): common_props = ( "extfs_sparse_flag" , "squashfs_sparse_flag" , + "erofs_sparse_flag" , "selinux_fc" ,
system/extras添加erofs_utils:
tj@ubuntu:~/work/code/system/extras/erofs_utils$ ls Android.mk mkerofsimage.sh mkfs.erofs
mkerofsimage.sh主要参考ext4,squashfs:
MAKE_EROFS_CMD="mkfs.erofs $OUTPUT_FILE $SRC_DIR /" echo $MAKE_EROFS_CMD $MAKE_EROFS_CMD SPARSE_SUFFIX=".sparse" if [ "$SPARSE " = true ]; then img2simg $OUTPUT_FILE $OUTPUT_FILE$SPARSE_SUFFIX if [ $? -ne 0 ]; then exit 4 fi mv $OUTPUT_FILE$SPARSE_SUFFIX $OUTPUT_FILE fi
项目启用BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE
为erofs, build is ok:
[ 99% 7719/7720] Installed file list: out/.../installed-files-vendor.txt [100% 7720/7720] Target vendor fs image: out/.../vendor.img ... mkfs.erofs out/.../vendor.img out/.../vendor/ c_version: [0.1 Jul 9 2019 03:24:50] c_img_path: [out/.../vendor.img] c_src_path: [out/.../vendor] c_dbg_lvl: [ 0] c_dry_run: [ 0] c_alg_name: [ none] c_compr_maxsz: [ 921600] c_compr_lvl: [ 0] c_compr_boundary: [ 128] c_compr_ratio_limit: [ 100]
QCOM P vendor mount移到了dts下,ext4改为erofs后可以mount ok。
[ 11.566421 ] erofs: mounted on /dev/block/platform/soc/7824900. sdhci/by-name/vendor with ... [ 11.569767 ] init: [libfs_mgr]__mount(source=/dev/block/platform/soc/7824900. sdhci/by-name/vendor,target=/vendor,type=erofs)=0 : Success
权限问题,待check。
ps: squashfs也是只读文件系统,提个patch给维护人Phillip,半天不回,算了,懒得看了。。。
mkerofsimage.sh参考实现:
#!/bin/bash function usage () {cat <<EOT Usage: ${0##*/} SRC_DIR OUTPUT_FILE [-s] [-m MOUNT_POINT] [-d PRODUCT_OUT] [-C FS_CONFIG ] [-c FILE_CONTEXTS] [-z COMPRESSOR] EOT } echo "in mkerofsimage.sh PATH=$PATH " if [ $# -lt 2 ]; then usage exit 1 fi SRC_DIR=$1 if [ ! -d $SRC_DIR ]; then echo "Can not find directory $SRC_DIR !" exit 2 fi OUTPUT_FILE=$2 shift ; shift SPARSE=false if [[ "$1 " == "-s" ]]; then SPARSE=true shift ; fi MOUNT_POINT= if [[ "$1 " == "-m" ]]; then MOUNT_POINT=$2 shift ; shift fi PRODUCT_OUT= if [[ "$1 " == "-d" ]]; then PRODUCT_OUT=$2 shift ; shift fi FS_CONFIG= if [[ "$1 " == "-C" ]]; then FS_CONFIG=$2 shift ; shift fi FILE_CONTEXTS= if [[ "$1 " == "-c" ]]; then FILE_CONTEXTS=$2 shift ; shift fi COMPRESSOR="lz4" COMPRESSOR_OPT="-Xhc" if [[ "$1 " == "-z" ]]; then COMPRESSOR=$2 COMPRESSOR_OPT= shift ; shift fi OPT="" if [ -n "$MOUNT_POINT " ]; then OPT="$OPT -mount-point $MOUNT_POINT " fi if [ -n "$PRODUCT_OUT " ]; then OPT="$OPT -product-out $PRODUCT_OUT " fi if [ -n "$FS_CONFIG " ]; then OPT="$OPT -fs-config-file $FS_CONFIG " fi if [ -n "$FILE_CONTEXTS " ]; then OPT="$OPT -context-file $FILE_CONTEXTS " fi MAKE_EROFS_CMD="mkfs.erofs $OUTPUT_FILE $SRC_DIR /" echo $MAKE_EROFS_CMD $MAKE_EROFS_CMD if [ $? -ne 0 ]; then exit 4 fi SPARSE_SUFFIX=".sparse" if [ "$SPARSE " = true ]; then img2simg $OUTPUT_FILE $OUTPUT_FILE$SPARSE_SUFFIX if [ $? -ne 0 ]; then exit 4 fi mv $OUTPUT_FILE$SPARSE_SUFFIX $OUTPUT_FILE fi
版权声明: 本站所有文章均采用 CC BY-NC-SA 4.0 CN 许可协议。转载请注明原文链接!