Bitbake能否同时运行同一配方的两个任务?Yocto构建137报错排查
Yocto构建失败返回码137及任务并行异常问题解决
返回码137的本质
返回码137意味着Bitbake进程被SIGKILL信号强制终止,99%的原因是内存耗尽触发了系统OOM Killer。别被虚拟机24GB内存的配置迷惑:
- 容器可能有独立的内存配额限制,哪怕宿主机内存充足,容器内内存不够也会触发OOM。
- Chromium这类大配方的构建本身内存消耗极高,8核并行会进一步推高内存峰值,很容易突破容器的内存上限。
快速修复
- 降低并行构建数:用
bitbake -j4(甚至-j2)启动构建,减少同时运行的任务数量,压低内存峰值。 - 调整容器内存配额:给容器分配至少16GB以上内存(Chromium构建建议20GB+),取消不必要的内存限制。
- 启用swap:在容器或宿主机上配置swap分区,虽然会减慢构建速度,但能避免OOM导致的强制终止。
同一配方任务并行的异常
Bitbake绝对不允许同一配方的do_package和do_populate_sysroot并行执行——Yocto的默认任务依赖链里,do_populate_sysroot是do_package的前置任务,必须先完成do_populate_sysroot,do_package才能启动。
出现这种异常,原因无非这几个:
- 配方依赖被篡改:
chromium-ozone-wayland.bb或它继承的类文件里,有人手动移除了do_package对do_populate_sysroot的依赖。 - 构建缓存损坏:之前的构建缓存出问题,导致Bitbake解析依赖链时出错。
- CI与开发机版本不一致:CI环境的Bitbake/Yocto版本和你本地开发机不一样,版本差异导致依赖解析逻辑出错。
排查步骤
- 检查配方依赖:打开
chromium-ozone-wayland.bb及相关.bbclass,确认do_package的依赖列表里包含do_populate_sysroot(Yocto默认会自动添加,除非被手动覆盖)。 - 清理缓存:执行
bitbake -c cleanall chromium-ozone-wayland,彻底清理该配方的所有缓存后重新构建。 - 对齐版本:把CI环境的Yocto分支、Bitbake版本调整成和你开发机完全一致,排除版本差异的影响。
总结
先解决OOM问题(返回码137),这是构建直接挂掉的核心原因;同一配方任务并行是异常现象,大概率是依赖解析或环境不一致导致的,同步排查修复即可。
内容的提问来源于stack exchange,提问作者Matheus Resende
相关产品推荐
相关产品推荐

