下面会一步步教你如何使用Yocto的动态rpm软件包管理功能,以及相应的dnf工具。
- 更改build/conf/local.conf,添加如下代码:
PACKAGE_CLASSES = "package_rpm"
PACKAGE_FEED_URIS = "http://<local-machine-ip>:5678"
EXTRA_IMAGE_FEATURES += " package-management "
- 选择一个镜像(rootfs)编译,比如 core-image-full
$ bitbake core-image-full
- 编译完成后,创建包索引:
$ bitbake package-index
- 创建一个简单的包管理服务器
$ cd build/tmp/deploy/rpm
$ python -m SimpleHTTPServer 5678 #python2
或者
$ python -m http.server 5678 #python3
- 把core-image-full镜像部署到相应的嵌入式目标板上后,启动系统然后更新包索引(请确保目标板和包管理服务器建立网络连接):
$ dnf makecache
- 此时,只有在包索引中列出的包可用,因此我们需要构建一些不同的东西,比如Vim:
$ bitbake vim
$ bitbake package-index
- 在目标板上面更新包索引并安装软件包:
$ dnf makecache
$ dnf info vim
$ dnf install vim
- 如果要删除软件包,使用如下命令:
$ dnf erase vim
为何这种动态包管理仅能用于开发阶段?
在开发阶段,我们更感兴趣的是安装软件包,这样就无需构建和更新整个镜像文件(rootfs),所以完全不担心该软件包将持续多长时间或提供给谁。但是,在使用过程中还有很多其他重要问题需要考虑,例如:
- HTTP 服务器是否安全?(本文中的服务器显然是不安全的)
- 包依赖关系链是否正确实现?
- 是否满足所有包版本的包依赖关系链?
- 如果一个软件包被更新,所有依赖关系链都必须更新吗?
在开发阶段,我们更多地考虑安装缺少的软件包。但是在产品生产和发布阶段,最重要的是正确和安全的更新软件包,显然本文中的方法并不是很适用。