如何获取Yocto最近一次构建的所有包列表用于生成SBOM
以下方法均可自动过滤tmp/pkgdata目录中的历史残留包,准确返回本次构建纳入的所有包(包含命中sstate缓存、无需重新编译的包):
直接读取镜像构建生成的manifest文件
这是零配置、最简便的方案。每次镜像构建完成后,Yocto会在tmp/deploy/images/<目标机器名>/路径下生成和镜像同名的.manifest文件,例如core-image-base-qemux86-64.manifest。文件逐行记录本次最终纳入镜像的软件包及对应版本,格式为包名 版本号,内容是rootfs打包阶段实时生成的,和最终烧录镜像的内容完全一致,不会包含已经移除的历史残留包,拿到包名后可以直接匹配pkgdata下的元数据生成SBOM。用官方自带的
oe-pkgdata-util工具查询
不要手动遍历pkgdata目录,官方提供的pkgdata操作工具会自动关联本次构建的依赖数据库,过滤掉无效的历史残留条目。在构建目录下执行如下命令即可列出指定镜像关联的所有有效包:oe-pkgdata-util list-pkgs -i <你的镜像名称>追加参数还能直接获取SBOM需要的其他信息:加
--deps可输出包间依赖关系,加-v可输出版本、适配架构等信息,省去手动解析pkgdata零散文件的麻烦。开启buildhistory功能获取可追溯的包清单
如果需要长期维护SBOM、对比不同构建版本的包差异,可以在conf/local.conf中添加以下配置开启构建历史记录:INHERIT += "buildhistory" BUILDHISTORY_COMMIT = "1"开启后每次构建都会自动更新
buildhistory/images/<目标机器名>/<镜像名>/latest/installed-packages.txt,文件内记录本次构建的所有有效包、版本、架构、安装大小信息,还会通过git自动记录每次构建的清单变更,不会留存历史无效数据。从rootfs构建日志提取原始包列表
如果需要校验前面几种方式拿到的清单准确性,可以查看对应镜像工作目录下的rootfs任务日志,路径为tmp/work/<目标机器名>/<镜像名>/<镜像版本>/temp/run.do_rootfs,日志里记录了rootfs打包阶段实际拉取安装的所有包列表,是构建过程中生成的原始记录,不存在历史残留问题,适合做结果校验。
注意:
tmp/pkgdata是全局包元数据缓存目录,只要在当前构建目录下构建过的包,元数据都会永久留存,不会因为包从构建配置中移除就自动删除,任何直接遍历该目录获取包列表的方式都会混入过期数据,不建议使用。
内容的提问来源于stack exchange,提问作者Dave

