如何在Yocto项目中为SD卡镜像预安装nano编辑器?
在Yocto(基于OpenSTLinux)中为SD卡预安装nano的问题排查与解决
背景操作流程
我基于OpenSTLinux Yocto项目(Poky等基础项目也适用),按以下步骤制作了可正常启动的SD卡镜像:
DISTRO=openstlinux-weston MACHINE=stm32mp1 source layers/meta-st/scripts/envsetup.sh bitbake st-image-weston cd <build>/tmp-glibc/deploy/image/stm32mp1/scripts/ ./create_sdcard_from_flashlayout.sh ../flashlayout_st-image-weston/optee/FlashLayout_sdcard_stm32mp157f-ev1-optee.tsv dd ....
后续需要在镜像中预安装nano编辑器,于是创建了自定义镜像,操作如下:
- 在
bitbake.conf末尾添加自定义层引用:
include ${COREBASE}/../mylayer/conf/layer.conf
- 自定义层
layers/mylayer/conf/layer.conf内容:
# We have a conf and classes directory, add to BBPATH curPATH = "${COREBASE}/../mylayer" BBPATH .= ":${curPATH}" # We have a recipes-* directories, add to BBFILES BBFILES += "${curPATH}/*/*.bb \ ${curPATH}/*.bb \ ${curPATH}/*/*.bbappend \ ${curPATH}/*.bb \ ${curPATH}/*.bbapend"
- 自定义镜像配方
layers/mylayer/image/myimage.bb内容:
SUMMARY = "MyLayer weston image" LICENSE = "Proprietary" include ${COREBASE}/../meta-st/meta-st-openstlinux/recipes-st/images/st-image-weston.bb inherit core-image features_check # let's make sure we have a good image... REQUIRED_DISTRO_FEATURES = "wayland" IMAGE_LINGUAS = "en-us" IMAGE_FEATURES += "\ splash \ package-management \ ssh-server-dropbear \ hwcodecs \ tools-profile \ eclipse-debug \ " # # INSTALL addons # CORE_IMAGE_EXTRA_INSTALL += " \ resize-helper \ \ packagegroup-framework-core-base \ packagegroup-framework-tools-base \ \ packagegroup-framework-core \ packagegroup-framework-tools \ \ packagegroup-framework-core-extra \ \ ${@bb.utils.contains('COMBINED_FEATURES', 'optee', 'packagegroup-optee-core', '', d)} \ ${@bb.utils.contains('COMBINED_FEATURES', 'optee', 'packagegroup-optee-test', '', d)} \ \ ${@bb.utils.contains('COMBINED_FEATURES', 'tpm2', 'packagegroup-security-tpm2', '', d)} \ \ packagegroup-st-demo \ \ nano\ "
问题现象
执行bitbake myimage构建成功,但制作的SD卡启动后,nano未安装:
$ nano nano: not found
已完成的排查
- 将
nano替换为随机名称(如randomname)时构建失败,证明自定义层已被Yocto解析,且nano包被正确识别。 - 单独执行
bitbake nano构建成功,但devtool build nano和devtool deploy-target -Ss nano root@<ip of my device>执行失败。
解决方法
1. 检查SD卡制作是否使用了新构建的自定义镜像
这是最常见的疏漏:制作SD卡时,仍使用了原st-image-weston的flashlayout文件,而非新构建的myimage对应的文件。
正确的SD卡制作命令应指向myimage的flashlayout目录:
cd <build>/tmp-glibc/deploy/image/stm32mp1/scripts/ ./create_sdcard_from_flashlayout.sh ../flashlayout_myimage/optee/FlashLayout_sdcard_stm32mp157f-ev1-optee.tsv
2. 修正自定义层配置的拼写错误
在layer.conf中存在两处错误:
- 重复添加了
${curPATH}/*.bb bbapend是拼写错误,应为bbappend
修正后的BBFILES配置:
BBFILES += "${curPATH}/*/*.bb \ ${curPATH}/*.bb \ ${curPATH}/*/*.bbappend"
3. 调整镜像配方的包安装变量优先级
由于自定义镜像include了原st-image-weston.bb,可能存在变量覆盖问题。尝试将nano直接追加到IMAGE_INSTALL(而非CORE_IMAGE_EXTRA_INSTALL),确保包被强制加入镜像:
在myimage.bb的包安装部分修改:
# 可替换原CORE_IMAGE_EXTRA_INSTALL中的nano,或直接追加 IMAGE_INSTALL += "nano"
4. 清理构建缓存后重新构建
缓存可能导致旧镜像内容被复用,执行以下命令清理并重新构建:
bitbake -c clean myimage bitbake myimage
5. 验证镜像包清单
构建完成后,查看镜像的包清单文件build/tmp-glibc/deploy/image/stm32mp1/myimage.rootfs.manifest,搜索nano确认其是否被包含。如果清单中存在nano但SD卡中没有,再检查SD卡制作流程是否正确。
内容的提问来源于stack exchange,提问作者Adrian Maire
相关产品推荐
相关产品推荐

