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的拆分规则:
如果你的需求是把uEnv.txt放到独立boot分区(绝大多数嵌入式场景的常规做法),不需要打进rootfs,那不用改上述拆分配置,只需要把uEnv.txt加入ROOTFS_BOOT_SPLIT = "0"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
相关产品推荐
相关产品推荐

