如何制作和挂载erofs格式vendor镜像
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)
# We just build this directly to the install location.
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]
### build completed successfully (04:10 (mm:ss)) ####
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
#
# To call this script, make sure mkfs.erofs is somewhere in PATH
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进行许可 | 转载请注明原文链接 - 如何制作和挂载erofs格式vendor镜像
你好,请教一下,上面的方法在P上system和vendor都是正常的。但是在Q上system也是正常的,但是vendor mount和数据读取都是正常的,但是好像相关的overlayfs出现了问题:
(7)[1:init]init: starting service 'overlay_mount_euclid'...
(7)[1:init]init: starting service 'mount_euclid'...
(7)[1:init]init: processing action (post-fs-data) from (/vendor/etc/init/shsusrd.rc:12)
(6)[571:logd.auditd]type=1400 audit(41037.571:56): avc: denied { getattr } for comm="time_daemon" name="/" dev="dm-0" ino=0 scontext=u:r:time_daemon:s0 tcontext=u:object_r:unlabeled:s0 tclass=filesystem permissive=1
(4)[801:self-init]overlayfs: at least 2 lowerdir are needed while upperdir nonexistent
......
(5)[619:sscrpcd]overlayfs: failed to get metacopy (-1)
有没有思路啊?
google改过overlayfs,可能是erofs还不支持,可以跟下这个错误看看,or 提给erofs的作者咨询下。
您好!我们现在也遇到了“overlayfs: failed to get metacopy (-1)”这个问题,请问您现在解决了吗?是否是现在的erofs还不支持google改过的overlayfs
可能还不支持。
Android 11 编译vendor erofs镜像开机出现如下错误自启动,这是selinux问题吗?源码中搜不到这个错误信息。
[ 9.135475] .(3)[1:init]init 19: [9131][0]processing action (early-init) from (/vendor/etc/init/hw/init.modem.rc:7)
[ 9.141516] .(0)[1:init]init 19: [9137][0]processing action (ro.product.cpu.abilist32=* && early-init) from (/vendor/etc/init/boringssl_self_test.rc:2)
[ 9.144783] .(0)[1:init]init 19: [9137][0]Command 'exec_start boringssl_self_test32_vendor' action=ro.product.cpu.abilist32=* && early-init (/vendor/etc/init/boringssl_self_test.rc:3) took 1ms and failed: Could not start exec service: File /vendor/bin/boringssl_self_test32(labeled "u:object_r:unlabeled:s0") has incorrect label or no domain transition from u:r:init:s0 to another SELinux domain defined. Have you configured your service correctly? https://source.android.com/security/selinux/device-policy#label_new_services_and_address_denials
[ 9.150934] .(0)[1:init]init 19: [9147][0]Clear action queue and start shutdown trigger
[ 9.152070] .(0)[1:init]init 19: [9147][0]Entering shutdown mode
[ 9.153072] .(0)[1:init]init 19: [9147][0]processing action (shutdown_done) from (:0)
[ 9.154305] .(0)[1:init]init 19: [9147][0]Reboot start, reason: reboot,boringssl-self-check-failed, reboot_target:
直接用工具转的erofs镜像不存在unlabled标签问题,但是按照上述方案制作的android erofs镜像出现unlabled标签问题怎么解?有大神指导下吗?
您好,我付钱了怎么看不到付费内容
sorry,估计是后台排版问题,现在好了,也同步发到你邮箱了。
好的~非常感谢!
overlayfs: failed to get metacopy (-1)这个问题更新最新erofs可以解决吧
我没遇到这个问题,可以试试or到上游去看下。
这里,我统一说明下,EROFS已经合入Android上游了,如果想用,可以直接参考。
上传的链接能否发下,按照本文方法在android 11 编译出的erofs镜像uid gid信息都显示overflowid ls -Z显示unlabled导致无法开机,有人遇到这个问题吗?跪求大神支持!