我在 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
我没有使用过多架构系统,所以可能还有比我这里建议的更好的方法。我还没有测试过我的建议,我不确定它是否与多架构的一些特性相冲突。
- 创建一个控制文件
equivs-control make.control
- 编辑控制文件:设置
Package: make
、Architecture: armhf
、Depends: make:amd64
和Multi-Arch: foreign
。您可能还想设置Version
为匹配 amd64 make 版本。 - 创建虚拟包:
equivs-build make.control
- 在 chroot 中安装虚拟包
如果这不满足 dpkg,另一种可行但不太方便的方法是不在 chroot 内安装 amd64 make,而是使主机根在 chroot 内可用(使用绑定挂载,请参阅在 chroot 监狱内提供 /bin 和 /lib例如),或者至少是make
二进制文件及其依赖项(其中make
只是 libc)。将安装二进制文件的目录添加到 PATH 中。如上所述创建一个虚拟包,但只需声明make
已安装,不要放置任何Depends
或Multi-Arch
标头。
答案2
此消息的意思是“如果安装了两个同名的不同架构包,则它们需要是完全相同的版本。”
这是因为它们都提供了/usr/share/doc/.../changelog.Debian
其他一些文件,如果两者都安装相同的文件,那么这里的文件冲突是可以接受的。
但这不起作用make
,因为两个包都提供不同的/usr/bin/make
.
我相信您可以使用允许 dpkg 根据到(从)状态--auto-deconfigure
设置软件包,这将导致它们重新运行,并且允许卸载以支持.make
unpacked
installed
postinst
make:amd64
make:armhf