拒绝来自外国架构的软件包的最佳方法?

拒绝来自外国架构的软件包的最佳方法?

问题

在 Ubuntu 或 Debian 上阻止安装来自外部架构的软件包的最佳方法是什么,或者更好的方法是首先防止添加该外部架构?

语境

我维护包含整个工具链的 Docker 镜像,用于交叉编译,这样人们就可以用最少的设置来交叉编译代码。这些镜像基于 Ubuntu(或 Debian),因此用户可以安装任何 C 或 C++ 依赖项来交叉编译他们的代码。但是,对于某些目标,例如arm-unknown-linux-gnueabihf,它是一个硬浮点 ARMv6 目标(这是 Rust 目标三重),外部架构似乎兼容但实际上并不兼容。armhf外部架构是为 ARMv7-A 编译的,因此与 ARMv6 平台不兼容,但大多数用户并不知道这一点。

这尤其糟糕,因为任何针对这些系统库构建和链接的代码都会在没有任何警告的情况下进行编译和链接,但无法在本机硬件上运行。除非用户正在使用 Qemu 针对特定 CPU 或在本机硬件上作为其管道的一部分积极测试其代码,否则他们会在最糟糕的时候检测到这一点。

由于我们无法在不进行重大更改的情况下放弃我们的 Debian 或 Ubuntu 映像库,并且用户仍然需要安装与架构无关的实用程序,例如 Ninja 或 Meson 构建系统,因此我们不能简单地说使用系统包管理器对于所有映像都是禁止的。

我们目前正在考虑使用带有包固定的通配符来防止为所有 -architecture 包找到安装目标armhf(保存到/etc/apt/preferences.d/all-packages):

Package: *:armhf
Pin: release *
Pin-Priority: -1

我相信这是最好的解决方案,因为我没有找到任何方法可以阻止将外部架构本身添加到源中。我相信没有办法阻止dpkg --add-architecture armhf,因此通过包固定阻止这些包是最好的解决方案。

有更好的方法吗?我们正在将这些镜像部署给大量用户,并且这些镜像用于众多 CI 管道:我们宁愿不发生意外中断,也不愿得到不够全面的解决方案。

脚注

† 是的,这可以撤消,因为只需删除此文件并重新更新源即可删除通过固定阻止的任何软件包。这应该需要有人积极尝试安装不兼容的软件包,或者基本上需要有一定经验并能理解其行为后果的人。

相关内容