apt - 安装来自外部架构的 noarch 包依赖项

apt - 安装来自外部架构的 noarch 包依赖项

在低端设备上运行 Debian-11-amd64 我更喜欢安装 32 位版本的 chromium 浏览器以节省一些 RAM(已调用dpkg --add-architecture i386):

apt install chromium:i386

工作正常。现在我还想安装与arch无关的语言包:

$ apt install chromium-l10n
The following additional packages will be installed:
  chromium chromium-common chromium-sandbox
Suggested packages:
  chromium-shell chromium-driver
The following packages will be REMOVED:
  chromium:i386 chromium-common:i386 chromium-driver:i386 chromium-sandbox:i386
The following NEW packages will be installed:
  chromium chromium-common chromium-l10n chromium-sandbox
0 upgraded, 4 newly installed, 4 to remove and 5 not upgraded.

因此,apt想要安装64位软件包版本,删除32位版本。不太好。

我试过

$ apt install chromium-l10n:i386
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Package chromium-l10n:i386 is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Package 'chromium-l10n:i386' has no installation candidate

以及一些固定变体/etc/apt/preferences.d/mychrome-i386

Package: chromium-l10n
Pin: release o=security.debian.org_debian-security_dists_bullseye-security_non-free_binary-i386_Packages
Pin-Priority: 900

这一切都不起作用。如何才能做到这一点(通过合理的努力)?

谢谢
第谷

答案1

可以使用更通用(比 OP 的)方法来防止重新安装amd64具有 Pin 优先级的变体,例如确保/etc/apt/preferences.d/local-chromium.prefamd64版本不会重新安装:

Package: chromium:amd64
Pin: origin *
Pin-Priority: -1

这不会改变可安装内容的优先级,除非它会阻止安装amd64变体,只留下i386变体作为选择。

这是可选的,因为下面所做的更改不会发生这种情况。发现新版本时的标准升级不会使用apt upgrade(但可能会使用apt full-upgrade)。无论如何,当将来从 Debian n 实际升级到 Debian n+1 时,所有这些设置都会以某种方式发生冲突:最好删除冲突的软件包,并在 Debian 版本更改后重新安装它们。


Multi-Arch: foreign

关键要素是让依赖系统将不同(外部)架构中的包视为本机包。显然,只有当实际包的行为或 API 允许这样做时才应该这样做。

Debian 维基百科多架构 HOWTO 讲述:

  • 如果一个包被标记为“Multi-Arch:foreign”,那么它可以满足不同体系结构的包的依赖关系(例如,“debhelper:amd64”将满足任何体系结构包对 debhelper 的依赖关系)。

关于 Ubuntu 的更多参考多架构规范(Debian 在之前的链接中引用):

Multi-Arch: foreign

  • 包裹是不是可共同安装和应该允许满足另一个体系结构的包的依赖关系,而不是它自己的体系结构。

[...]

出于同样的原因,我曾经对 Firefox 做过 OP 所做的事情:在低端系统上节省内存。更改必须在“主”二进制包中完成,而不是在依赖它的包中完成。此外,当包发生更改时,在保持相同版本时,依赖关系算法将优先选择存储库源而不是已安装的源,但由于依赖原因不会这样做。它总是会写包已保留,并且如果保留包,则不会轻易可见,因为有新版本可用但无法安装,或者因为有相同版本可用。这可以通过稍微增加包版本来解决。

此方法在某些包(包括chromiumfirefox-esrthunderbird)上工作正常,但在其他包上可能会失败,特别是如果它们依赖于本身具有相同类型问题的非库包,或者未正确适应 Multiarch 的库(可以说是一个错误:一个)应该期望运行时库是Multi-Arch: same可共同安装的)。

目标是:

  • 将包设置为Multi-Arch: foreign这样,依赖于它的其他包将被视为本机,并且不会再尝试拉取其他架构。

  • 可选:增加其版本号

    这将有助于了解新的实际版本何时发布,并且应该再次执行此操作。

  • 如果之前的步骤已完成,则此步骤是强制性的:将包设置为提供自身,并使用先前(实际)版本进行版本控制

    ...防止由于版本而不是体系结构而再次出现依赖性问题。

没有简单的工具可以完成这样的改变。我个人直接编辑了该/var/lib/dpkg/status文件,该文件是所有已安装软件包的数据库。那里的一个错误可能会损坏整个系统安装。下面是一个较长但安全的方法:下载二进制包,解压它,根据需要对其进行编辑,然后将其重新打包到备用二进制包中,然后安装它。

一切都应该以用户身份完成(尽管fakeroot可以用于重新包装部分,只要人们了解它的使用方式:一次)。

mkdir /tmp/repack
cd /tmp/repack
apt-get download chromium:i386
dpkg-deb --raw-extract chromium_*_i386.deb chromium

编辑文件chromium/DEBIAN/control

  • 添加(例如在Architecture: i386条目下方)Multi-Arch:条目:

    Multi-Arch: foreign
    
  • 编辑Version:条目

    通过在其后面附加 a 来更改版本.0。例如,今天在 Debian 12 上,它看起来像:

    Version: 119.0.6045.123-1~deb12u1.0
    
  • 编辑Provides:条目(在没有它的包上,添加它):

    在其末尾附加, chromium (= ACTUALVERSION)ACTUALVERSION 替换为不附加的实际版本.0。例如,今天在 Debian 12 上,该行将如下所示:

    Provides: gnome-www-browser, www-browser, chromium (= 119.0.6045.123-1~deb12u1)
    

将更改后的包重新打包到新.deb文件中:

dpkg-deb --build chromium/ chromium.deb

并以(真实)root用户身份重新安装它,可能会连同其他软件包一起安装(在将来的升级中应该自动拉取这些软件包):

apt-get install ./chromium.deb chromium-l10n

如果版本没有升级,--reinstall可能需要。

每次 Debian 发布新版本时都必须再次执行此操作。当未来的apt upgrade命令告诉我们chromium:i386将保留而不是升级时,应该检测到这一点。


实际测试是在 Debian 12 上编写的。

相关内容