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

Yocto构建时recipe安装文件到/boot目录失效如何解决

配置错误点与修复方法

你的配置存在3个核心问题,按影响优先级排序:

  • 变量拼写错误
    代码里写的${base_prefex}是拼写错误,Yocto内置的基础路径前缀变量正确名称是${base_prefix}。拼写错误后这个变量会被解析为空字符串,拼接后实际安装路径变成${D}/boot,虽然路径偏差不大,但属于明显的书写错误。
  • 未提前创建目标安装目录
    install命令默认不会自动递归创建不存在的父目录,复制文件前如果${D}${base_prefix}/boot目录不存在,文件复制操作会直接失败。
  • 核心原因:Yocto默认将/boot目录从rootfs镜像中剥离
    几乎所有主流BSP的默认配置里,/boot是独立分区的挂载点,所有安装到${D}/boot路径下的文件,默认不会被打包进rootfs镜像,而是会被单独收集用于生成独立的boot分区镜像(常见格式如boot.vfat、boot.ext4),直接解压检查rootfs镜像自然找不到目标文件。
    如果你确实需要把uEnv.txt放到rootfs内的/boot目录,需要在镜像配置文件(local.conf或者自定义镜像recipe)中添加配置,取消/boot的拆分规则:
    ROOTFS_BOOT_SPLIT = "0"
    
    如果你的需求是把uEnv.txt放到独立boot分区(绝大多数嵌入式场景的常规做法),不需要打进rootfs,那不用改上述拆分配置,只需要把uEnv.txt加入IMAGE_BOOT_FILES变量即可,示例:
    IMAGE_BOOT_FILES += "uEnv.txt"
    
  • 补充说明:你提到把文件安装到${D}${sysconfdir}即/etc路径下也找不到,是因为你修改的是u-boot相关recipe,默认配置下u-boot包不会被安装到rootfs中(多数场景u-boot会直接烧写到存储裸分区,不需要作为rootfs内的软件包存在),你需要确认镜像配置里通过IMAGE_INSTALL添加了对应u-boot包,否则即使do_install阶段把文件放对了路径,包没被纳入镜像安装列表,文件最终也不会出现在rootfs里。

修正后的recipe参考

SRCREV = "48cabcbc64484ca6c201746e526a11b4b43eb359"

FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

SRC_URI += "file://0001-uEnv.patch file://0002-disable-boot-interrupt.patch file://uEnv.txt"
# Yocto 3.2+版本用FILES:${PN}语法,旧版本改回FILES_${PN}即可
FILES:${PN} += "/boot/uEnv.txt"

do_install_append() {
    # 先递归创建目标目录
    install -d ${D}${base_prefix}/boot
    # uEnv.txt是普通文本配置文件,用0644权限即可,不需要可执行权限
    install -m 0644 ${WORKDIR}/uEnv.txt ${D}${base_prefix}/boot/
}

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:48:25