使用 Raspbian 和 64 位内核,我从以下来源获取包:
deb [arch=armhf] http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi
deb http://deb.debian.org/debian stretch main contrib non-free
deb http://deb.debian.org/debian stretch-updates main contrib non-free
尝试安装最小依赖项来运行 gzip:arm64 之类的程序会报告冲突,例如:
libgcc1 : Breaks: libgcc1:arm64 (!= 1:6.3.0-18+rpi1+deb9u1) but 1:6.3.0-18+deb9u1 is to be installed
gcc-6-base:arm64 : Breaks: gcc-6-base (!= 6.3.0-18+deb9u1) but 6.3.0-18+rpi1+deb9u1 is to be installed
看起来像“+rpi1”臂氢夫软件包与非 rpi1 冲突ARM64包。但这意味着它正在比较包版本跨越两种不同的架构!
无论如何,apt-get 的错误消息可能会产生误导,因此为了使我的系统进入类似于 bamarni 的 Debian Pi64(多架构工作)的状态,我可以尝试从以下链接下载一些非 rpi1 armhf 软件包https://packages.debian.org/stretch/armhf/libgcc1/download一旦我替换了 libgcc1:armhf、gcc-6-base:armhf、libc6:armhf、libatomic1:armhf 等,基本冲突就会消失,我可以通过 apt 安装 libgcc1:arm64 gcc-6-base:arm64 libc6:arm64。然而,这不是一个很好的解决方案,因为在此过程中我可能失去了 ARMv6 兼容性和其他特定于 Raspbian 的修改。
上述情况仍然可能意味着 Raspbian 软件包中还隐藏着其他可疑的东西。我的下一个测试是使用 Raspbian *.deb 文件,除了使用脚本重新打包它们以删除+rpi1
每个控制文件中的版本文本部分。一旦我这样做并重新安装这些软件包,与arm64软件包的冲突就会消失。这再次表明 APT 正在比较两种不同体系结构的软件包版本。
当我运行apt-cache show
其中任何一个时,它们都会Multi-Arch: same
用正确的对应Architecture:
行表示。据我了解,在Multi-Arch: foreign
或 的情况下,它只会关心不同架构的版本Multi-Arch: allowed
。
这里发生了什么?看起来 APT 正在比较不同架构之间的软件包版本,但实际上它不应该这样做,这会导致虚假冲突。我想知道多架构在 bamarni 的 Pi64 或 Ubuntu MATE(或大多数 i386+x86_64 系统)上运行良好是否部分是因为这些系统在 32 位和 64 位上具有大致一致的软件包版本。
答案1
这是多架构规范强制要求:
多架构包需要保持同步;即,隐式
Breaks: ${self}:other (!= ${binary:Version})
.
原因是包总是在共享目录(/usr/share/doc
)中传送一些与架构无关的文件,因此包管理系统必须确保它们在跨架构之间是相同的。它通过跨架构强制执行相同的版本来实现这一点,即使使用 binNMU 也是如此。
在单个发行版中这并不是什么大问题,但在跨发行版中却是个问题。
具体来说,让我们考虑一下您的情况gcc-6-base
(因为那是文档所在的位置)。 Debian Stretch 版本将其变更日志安装在/usr/share/doc/gcc-6-base/changelog.Debian.gz
.为其他体系结构安装相同的软件包,使用相同的版本,安装相同的文件,因此虽然技术上存在冲突,但它会被忽略。然而,Raspbian 版本添加了以下条目:
gcc-6 (6.3.0-18+rpi1+deb9u1) stretch-staging; urgency=medium
[changes brought forward from 6.1.1-1+rpi1 by Peter Michael Green <[email protected]> at Wed, 11 May 2016 20:
* Disable testsuite.
-- Raspbian forward porter <[email protected]> Thu, 01 Mar 2018 00:03:02 +0000
现在/usr/share/doc/gcc-6-base/changelog.Debian.gz
不再相同了。如果我们要并行安装 Debian Stretch 和 Raspbian Stretch 版本的软件包,应该保留哪个版本的文件?没有办法决定,所以包装系统完全禁止这种情况。