Yocto定制构建:如何生成差异极小的安装版与消费版镜像?
差异镜像构建最优方案及weston.ini修改问题解决
一、先解决weston.ini修改不生效的问题
你之前用do_install_append没生效,核心原因是image recipe的do_install阶段早于weston包的配置文件安装时序,后续weston包的安装会覆盖你修改的文件。推荐两种可靠的解决方式:
方式1:文件替换法
- 在
image-installer.bb所在的recipes-core/images目录下,创建files子目录,把修改好的weston_for_installer.ini放入其中。 - 在
image-installer.bb中添加以下代码:
# 让bitbake优先查找当前目录下的files文件夹 FILESEXTRAPATHS:prepend := "${THISDIR}/files:" # 添加要替换的文件到源码路径 SRC_URI += "file://weston_for_installer.ini" # 在镜像预处理阶段替换配置文件(所有包安装完成后执行) IMAGE_PREPROCESS_COMMAND += "installer_replace_weston_config;" installer_replace_weston_config() { # 复制文件到目标路径,设置正确权限 install -m 0644 ${WORKDIR}/weston_for_installer.ini ${IMAGE_ROOTFS}${sysconfdir}/xdg/weston/weston.ini }
方式2:sed动态修改法
如果不想维护整个配置文件,只想修改特定行,用IMAGE_PREPROCESS_COMMAND确保在所有包安装完成后执行修改:
IMAGE_PREPROCESS_COMMAND += "installer_patch_weston_config;" installer_patch_weston_config() { # 在[shell]段后追加panel-position配置 sed -i "/\[shell\]/apanel-position=none" ${IMAGE_ROOTFS}${sysconfdir}/xdg/weston/weston.ini }
二、差异镜像的最优构建方案
为了减少重复代码、降低维护成本,建议采用基础镜像+差异继承的结构:
1. 创建基础镜像recipe
在recipes-core/images下新建image-base.bb,存放两个版本共有的配置:
inherit core-image # 两个版本都需要安装的包(示例) IMAGE_INSTALL += "weston bash coreutils ..." # 其他公共配置,比如文件系统、启动项等 ...
2. 消费版镜像(image-consumer.bb)
直接继承基础镜像,仅添加消费版特有的密码配置:
require image-base.bb # 设置消费版的root和普通用户密码 EXTRA_USERS_PARAMS = "usermod -P consumer_root_pass root; usermod -P consumer_user_pass user;"
3. 安装版镜像(image-installer.bb)
继承基础镜像,添加安装版的密码和weston配置:
require image-base.bb # 设置安装版的root和普通用户密码 EXTRA_USERS_PARAMS = "usermod -P installer_root_pass root; usermod -P installer_user_pass user;" # 以下是weston.ini的修改(二选一即可) # 方式1:文件替换 FILESEXTRAPATHS:prepend := "${THISDIR}/files:" SRC_URI += "file://weston_for_installer.ini" IMAGE_PREPROCESS_COMMAND += "installer_replace_weston_config;" installer_replace_weston_config() { install -m 0644 ${WORKDIR}/weston_for_installer.ini ${IMAGE_ROOTFS}${sysconfdir}/xdg/weston/weston.ini } # 方式2:sed修改(注释掉方式1后启用) # IMAGE_PREPROCESS_COMMAND += "installer_patch_weston_config;" # installer_patch_weston_config() { # sed -i "/\[shell\]/apanel-position=none" ${IMAGE_ROOTFS}${sysconfdir}/xdg/weston/weston.ini # }
三、构建命令
分别执行以下命令构建对应版本:
bitbake image-consumer # 构建消费版 bitbake image-installer # 构建安装版
内容的提问来源于stack exchange,提问作者Egor
相关产品推荐
相关产品推荐

