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

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

  1. 使用visudo编辑/etc/sudoers,添加构建用户的免密规则:
    your_build_user ALL=(ALL) NOPASSWD: ALL
    
  2. 在container-image.bb的do_pull_image函数中,将所有sudo替换为主机系统的sudo路径(如/usr/bin/sudo)

方案B:让构建用户无需sudo执行docker命令

  1. 将构建用户加入docker组:
    sudo usermod -aG docker your_build_user
    
  2. 重启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" &

验证步骤

  1. 清理构建缓存:bitbake -c cleansstate container-image
  2. 重新构建:bitbake embedded-container-image

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:26:58