You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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编辑器,于是创建了自定义镜像,操作如下:

  1. 在bitbake.conf末尾添加自定义层引用:
include ${COREBASE}/../mylayer/conf/layer.conf
  1. 自定义层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"
  1. 自定义镜像配方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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 06:55:39