即使使用 Multi-Arch,APT 版本也會在不同架構之間發生衝突:相同嗎?
使用 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” armhf包與非 rpi1 arm64包衝突。但這意味著它正在比較兩種不同架構的包版本!
apt-get 的錯誤消息可能會產生誤導,所以為了讓我的系統進入類似於 bamarni 的 Debian Pi64(multiarch 工作的地方)的狀態,我可以嘗試從https://packages 等連結下載一些非 rpi1 armhf 包。 debian.org/stretch/armhf/libgcc1/download一旦我替換了 libgcc1:armhf、gcc-6-base:armhf、libc6:armhf、libatomic1:armhf 等,基本衝突就會消失,我可以安裝 libgcc1:arm64 gcc-6 -base:arm64 libc6:arm64 通過 apt。但是,這不是一個很好的解決方案,因為在此過程中我可能失去了 ARMv6 兼容性和其他 Raspbian 特定的修改。
上述情況仍然可能意味著 Raspbian 包中還隱藏著一些可疑的東西。我的下一個測試是使用 Raspbian *.deb 文件,除了使用腳本我重新打包它們以刪除
+rpi1
每個控製文件中的版本文本部分。一旦我這樣做並重新安裝這些包,與 arm64 包的衝突就會消失。這再次表明 APT 正在比較兩種不同架構的軟體包版本。當我
apt-cache show
在其中任何一個上執行時,他們都會Multi-Arch: same
用正確的對應Architecture:
行說。據我了解,它只關心在Multi-Arch: foreign
or的情況下跨不同架構的版本Multi-Arch: allowed
。這裡發生了什麼?似乎 APT 在不應該比較不同架構的包版本時,這會導致虛假衝突。我想知道 multiarch 在 bamarni 的 Pi64 或 Ubuntu MATE(或大多數 i386+x86_64 系統)上是否正常工作這一事實部分是幸運的,因為這些系統在 32 位和 64 位上具有通常一致的軟體包版本。
這是多架構規範的強制要求:
多架構包需要保持同步;即,隱含的
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 <plugwash@raspbian.org> at Wed, 11 May 2016 20: * Disable testsuite. -- Raspbian forward porter <root@raspbian.org> Thu, 01 Mar 2018 00:03:02 +0000
現在
/usr/share/doc/gcc-6-base/changelog.Debian.gz
不再相同。如果我們要並排安裝軟體包的 Debian Stretch 和 Raspbian Stretch 版本,應該保留哪個版本的文件?沒有辦法決定,所以包裝系統完全禁止這種情況。