Yocto 4.0构建时container-image.bb中do_pull_image的sudo执行失败
问题:Yocto 4.0移植container-image时sudo命令执行失败
环境与核心报错
- 硬件:iMX系列板卡
- Yocto版本:4.0
- 移植目标:meta-embedded-containers中的container-image配方
- 执行
bitbake embedded-container-image时触发核心错误:
sudo: /yocto-bsp/build/tmp/hosttools/sudo must be owned by uid 0 and have the setuid bit set
同时伴随pidof: not found的依赖缺失警告。
已尝试的无效操作
- 修改
/yocto-bsp/build/tmp/hosttools/sudo(符号链接)的所有权和权限 - 使用fakeroot
- 在bb文件中手动替换sudo路径
- 清理并重新构建配方
解决方案
1. 修复pidof依赖缺失
pidof来自procps包,两种解决方式二选一:
- 在
container-image.bb中添加原生依赖:DEPENDS += "procps-native" - 替换
pidof为系统自带的pgrep(无需额外依赖),修改do_pull_image函数中的相关行:# 替换原有pidof调用 [ -n "$(pgrep dockerd)" ] && sudo kill "$(pgrep dockerd)" && sleep 5 # 末尾的kill命令也替换 sudo kill "$(pgrep dockerd)"
2. 解决sudo权限问题(核心)
Yocto构建环境中的tmp/hosttools/sudo是符号链接,无法直接设置setuid位,推荐两种方案:
方案A:配置构建用户免密sudo
- 使用
visudo编辑/etc/sudoers,添加构建用户的免密规则:your_build_user ALL=(ALL) NOPASSWD: ALL - 在
container-image.bb的do_pull_image函数中,将所有sudo替换为主机系统的sudo路径(如/usr/bin/sudo)
方案B:让构建用户无需sudo执行docker命令
- 将构建用户加入docker组:
sudo usermod -aG docker your_build_user - 重启shell生效后,删除do_pull_image函数中所有命令的
sudo前缀,直接调用dockerd、docker命令
3. 修复mount-noauto的QA警告
在mount-noauto_1.0.bb配方中添加特性检查继承:
inherit features_check
4. (可选)优化dockerd启动路径
将do_pull_image中的绝对路径替换为Yocto变量,提升兼容性:
# 替换原有dockerd启动行 sudo /usr/bin/dockerd --storage-driver vfs --data-root "${WORKDIR}/docker-store" &
验证步骤
- 清理构建缓存:
bitbake -c cleansstate container-image - 重新构建:
bitbake embedded-container-image
内容的提问来源于stack exchange,提问作者attdone
相关产品推荐
相关产品推荐

