OpenEmbedded构建目录空间清理及BitBake依赖优化咨询
一、清理无用文件的实用方法
构建目录越用越大是常态,下面这些方法都是实际用下来有效的空间释放技巧:
BitBake自带清理命令:
- 清理单个配方的构建产物:
bitbake -c clean <recipe-name>,适合修改某个配方后快速清理旧产物 - 彻底清理单个配方的sstate缓存与构建目录:
bitbake -c cleansstate <recipe-name>,如果某个配方构建出问题,用这个做彻底重建最靠谱 - 极端清理(连源码包都删除):
bitbake -c cleanall <recipe-name>,谨慎使用——它会删掉对应配方下载的源码,下次构建得重新下载 - 批量清理所有配方产物:
bitbake world -c clean,耗时极长,除非你要彻底重建整个项目,否则不推荐
- 清理单个配方的构建产物:
清理sstate缓存(空间占用大头):
sstate是共享构建缓存,时间久了会堆积大量旧版本缓存文件。推荐用官方工具oe-sstate-cleaner,它能自动识别并删除当前构建不需要的sstate文件,命令简单直接:oe-sstate-cleaner --delete这个操作能释放大量空间,且不会影响当前项目的构建依赖。
清理下载的源码包:
downloads/目录会存储所有下载的源码包,如果你确定某些包不会再用到,可以手动删除。或者用bitbake -c cleanall针对特定配方删除源码,但记得保留常用包,避免重复下载浪费时间。手动清理临时构建目录:
tmp/和tmp-glibc/下的work/目录是每个配方的构建工作区,如果你已经完成某个配方的构建且不需要调试,可以删掉对应work/<架构>/<配方名>/<版本>的目录。另外deploy/目录里的旧镜像、包也可以手动清理,只保留你需要的版本。
二、避免配方重复复制依赖的配置
BitBake的sstate机制就是用来解决重复构建和依赖复制问题的,只要配置正确,不同配方就能共享已构建好的依赖:
首先确保
conf/local.conf里开启了sstate共享:SSTATE_DIR ?= "${TOPDIR}/tmp-glibc/sstate-cache" # 若有本地sstate镜像源,可添加以下配置 # SSTATE_MIRRORS ?= "file://.* file://${TOPDIR}/sstate-cache/PATH"这样所有配方都会共用同一个sstate缓存目录,无需重复构建和复制依赖。
另外推荐开启
rm_work特性,它会在配方构建完成后自动删除临时工作文件,只保留必要产物,能大幅缩小tmp/目录的体积:INHERIT += "rm_work"注意:如果需要调试某个配方,得临时注释掉这个配置——它会删掉构建过程中的中间文件,没法排查问题。
三、只保留单个指定任务需要的内容
如果想彻底清理掉某个目标任务(比如构建特定镜像)不需要的所有内容,可以按以下步骤操作:
- 先确保你已经成功构建了目标任务(比如
bitbake core-image-minimal)。 - 用
oe-sstate-cleaner清理未被依赖的sstate文件,它会自动分析当前构建的依赖链,只保留必要缓存:oe-sstate-cleaner --remove-unreferenced - 若要进一步清理
work/目录,可以手动删除目标任务不依赖的配方对应的工作目录,但这个需要你清楚目标任务的依赖关系,不如sstate-cleaner操作方便。
内容的提问来源于stack exchange,提问作者eri

