如何让 APT 相信跨架构包是手动安装的?

如何让 APT 相信跨架构包是手动安装的?

我在 amd64 机器上有一个 qemu-armhf chroot 环境(主要用于编译 Raspberry Pi 代码)。因此,它可以运行 armhf 和 amd64 二进制文件,但后者速度更快。

为了获得更好的速度,我在 chroot 中安装了某些软件包(例如 make)的 amd64 版本。这工作得很好,直到我需要 apt-get 一些其他的 armhf 包,并且它恰好将 make 列为依赖项,于是我得到了这个:

The following packages have unmet dependencies:
 build-essential : Depends: make but it is not going to be installed
 dpkg-dev : Depends: make but it is not going to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

如果我尝试建议的命令,那么它会说它想要安装make:armhf和卸载make:amd64。我不希望它这样做。我如何告诉 APTmake:armhf已经安装(因为我希望用它make:amd64来满足依赖关系)而不实际安装它?

我尝试使用apt-mark manual make,但它说它没有安装。


我知道这可能不是正确的方法,但我一直在查看该/var/lib/dpkg/status文件,试图弄清楚它认为包定义是如何工作的,并尝试欺骗它同意 make:amd64 满足 make:也有armhf。

我特别注意到“libbz2-1.0”是一个被列为已安装两次的软件包;曾经作为:

Architecture: armhf
Multi-Arch: same
Pre-Depends: multiarch-support

并一度为:

Architecture: amd64
Multi-Arch: foreign
Pre-Depends: multiarch-support

因此,我尝试类似地复制“make”的条目,设置上面的所有这些值。但现在APT只是说“make”和“make:amd64”是冲突的。为什么make的时候有冲突,而libbz2-1.0的时候却没有冲突? (我希望这不是特殊情况下的库;这看起来应该是一个错误。)


这个答案,我尝试构建一个虚拟包equivs并安装它(在删除上面的手动摆弄之后),但安装它会产生以下错误:

# dpkg -i /var/cache/apt/archives/make_3.81-8.2_amd64.deb (real amd64 make)
# dpkg -i make_3.81-8.2_armhf.deb (fake armhf depends on the above)
Preparing to replace make 3.81-8.2 (using make_3.81-8.2_armhf.deb) ...
Unpacking replacement make ...
dpkg: dependency problems prevent configuration of make:
 make depends on make:amd64 (= 3.81-8.2).

所以问题再次看起来像是它认为 make:armhf 是替代品对于 make:amd64,我不知道如何告诉它我希望这两个包共存。 (例如,两个 libbz2 包共存的想法似乎没有问题。)

答案1

我没有使用过多架构系统,所以可能还有比我这里建议的更好的方法。我还没有测试过我的建议,我不确定它是否与多架构的一些特性相冲突。

您可以使用当量创建虚拟包仅用于依赖项。

  1. 创建一个控制文件equivs-control make.control
  2. 编辑控制文件:设置Package: makeArchitecture: armhfDepends: make:amd64Multi-Arch: foreign。您可能还想设置Version为匹配 amd64 make 版本。
  3. 创建虚拟包:equivs-build make.control
  4. 在 chroot 中安装虚拟包

如果这不满足 dpkg,另一种可行但不太方便的方法是不在 chroot 内安装 amd64 make,而是使主机根在 chroot 内可用(使用绑定挂载,请参阅在 chroot 监狱内提供 /bin 和 /lib例如),或者至少是make二进制文件及其依赖项(其中make只是 libc)。将安装二进制文件的目录添加到 PATH 中。如上所述创建一个虚拟包,但只需声明make已安装,不要放置任何DependsMulti-Arch标头。

答案2

此消息的意思是“如果安装了两个同名的不同架构包,则它们需要是完全相同的版本。”

这是因为它们都提供了/usr/share/doc/.../changelog.Debian其他一些文件,如果两者都安装相同的文件,那么这里的文件冲突是可以接受的。

但这不起作用make,因为两个包都提供不同的/usr/bin/make.

我相信您可以使用允许 dpkg 根据到(从)状态--auto-deconfigure设置软件包,这将导致它们重新运行,并且允许卸载以支持.makeunpackedinstalledpostinstmake:amd64make:armhf

相关内容