Buildroot包管理

Posted

技术标签:

【中文标题】Buildroot包管理【英文标题】:Buildroot package management 【发布时间】:2013-07-15 20:22:46 【问题描述】:

我正在使用 buildroot 创建一个在我的 ARM 平台上运行的 rootfs。

我想在我的平台上有一个包管理器来轻松安装包,比如 ubuntu 中的 apt-get。

我找到了 opkg,可以简单地将其添加到 buildroot 构建中,但我找不到任何有关如何查找存储库的信息。

另外,在网上阅读了一些关于此的内容,我还了解到 buildroot 不包含包管理器。 opkg 不是包管理器吗?或者只是某种前端来获取包?

我不太了解包管理器的组成部分,也找不到任何相关信息。

有人能解释一下实现这种管理器真正需要什么,或者在哪里可以找到这些信息?

【问题讨论】:

【参考方案1】:

opkg 不是包管理器吗?或者只是某种前端来获取包?

opkg 基于ipkg。看起来它试图提供apt-get的所有功能。

有人能解释一下实现这种管理器真正需要什么,或者在哪里可以找到这些信息?

包管理器提供许多不同的功能。随着它们的发展,为最终用户增加了不同层次的易用性。通常,它们从 Linux desktopserver 空间开始,并已移植到 嵌入式 系统中使用。

一些差异; 嵌入式系统通常是单任务。包管理系统允许用户挑选安装什么。通常,嵌入式系统可能不想让用户挑选包。当然,这取决于应用程序。

一些包管理功能,

    构建和修补。 包依赖和包数据库。 包迁移。 包专业化。 自动下载 最小化下载时间/带宽。

Rpmdpkgipkg 通常仅履行第 1-4 项。 Buildroot 甚至不这样做,只有第一项是真正相关的。原因是 Buildroot 旨在为永远不会更新的固定系统构建软件。拥有网络更新包迁移的文件系统是没有意义的,因为设备中没有网络连接或外部存储。此外,Buildroot 尽量做到最小化,这些额外的功能是有代价的。

LTIB提供系统创建项目1-3,但不提供网络下载。此外,开箱即用,它在 RPM 大小方面效率很低。第 4 项,导致典型的 develdeploy 包。为了构建一个库,您需要头文件来编译依赖包。典型的 LTIB rpm 包含所有头文件。制作排除这些 headersman 页面等的 子包 是一件容易的事。

OpenWrt 适用于 routers,但如果您需要 graphicssound 和其他功能,这些软件包可能会不可用。有各种文件系统构建器,但由于变化的数量,每个都有成本和收益。正如有许多 Linux desktop服务器发行版 一样,也有许多具有不同包管理选项的 根文件系统 构建器。您必须评估您的应用程序和系统的优势。

【讨论】:

对于第 6 项,请参阅 bsdiff、deltaRPM 和 Courgette。 android 是一个完整的she-bang,没有任何灵活性。 感谢您完整而清晰的回答。我必须纠正您的一些问题:buildroot 可以配置为包含 ipkg/opkg。这两个似乎都有您上面描述的 1-5 个功能。困难的是找到与所需架构兼容的包存储库。我找到了一个适合我的,但我觉得这很幸运。我也同意你的观点,通常嵌入式系统不会实现这样的包管理工具。有关信息,我想实现它只是为了加速开发,我将删除它以用于生产。 我不是想说 buildroot 没有 ipkg/opkg;我不知道。所以感谢您的澄清。我只是说要做到这一点,你需要 opkg 远程服务器端;就像apt-get 一样,您的软件包来自 Ubuntu 服务器。因此,即使您在 Ubuntu 上有 apt-get,您的 Linux PC 上也没有服务器代码/基础设施。当然,那个buildroot只有有限数量的用户程序 嗯,你的 buildroot 一定和我记得的不一样。我以为只是busybox加上compilers;但我想我只将它用于 initramfs 系统。这就是为什么我说它只执行第 1 项(至少没有 ipkg/opkg)。所以在查看最新网页后可能不正确。【参考方案2】:

我发现无艺术的噪音答案非常有用。所以我会尝试在这里介绍一些不同的东西。

首先,所有二进制文件都有库依赖项。如果您查看 CentOS/RHEL/Oracle Linux 的库文件名和目录,您会发现它与基于 Debian 的发行版完全不同。即,如果您将二进制文件从一个复制到另一个,它将不起作用。

看Debian“/bin/ls”:

ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007ffc269b0000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fb8f3fa2000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb8f3bd8000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fb8f3968000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb8f3764000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fb8f41c4000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb8f3547000)

还有OracleLinux的“/bin/ls”:

ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007ffe8999b000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f9831e8e000)
    libcap.so.2 => /lib64/libcap.so.2 (0x00007f9831c89000)
    libacl.so.1 => /lib64/libacl.so.1 (0x00007f9831a80000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f98316b3000)
    libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f9831451000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f983124d000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f98320b5000)
    libattr.so.1 => /lib64/libattr.so.1 (0x00007f9831048000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f9830e2c000)

据我所知,有两大类发行版:基于 Debian 和基于 Redhat。 (ipkg、opkg、dpkg都是debian,yum/rpm是Redhat用的)

并且包管理器应该了解文件系统设计并将相关文件复制到正确的目录中。

Buildroot 可以构建得如此精简,以至于您的整个“操作系统”只包含几个最小的用户空间文件,或者没有任何正在运行的守护程序。如果你知道怎么做,几乎所有东西都是可配置的。

并引用:https://buildroot.org/downloads/manual/manual.html#faq-no-binary-packages

结论是,添加对已安装文件的跟踪以在未选择包时将其删除,或者生成二进制包的存储库,这是很难可靠实现的,并且会增加很多复杂性。

buildroot 设计的另一个优点是没有相互破坏的二进制库,因为它总是从头开始重建:

另一方面,通过一次升级整个根文件系统映像来进行完整的系统升级,可以保证部署到嵌入式系统的映像确实是经过测试和验证的映像。

【讨论】:

以上是关于Buildroot包管理的主要内容,如果未能解决你的问题,请参考以下文章

buildroot opencv3 python包构建错误的目标?

buildroot管理uboot+kernel+rootfs

buildroot 添加带有子模块的包

Buildroot 软件包依赖项

Buildroot 工具链 - 只需要构建一次

瑞芯微RV1126 BuildRoot开发学习笔记