Debian 与所需软件包的循环依赖

Debian 与所需软件包的循环依赖

由于各种原因,我正在手动构建 rootfs(不使用debootstrapmultistrap),但我不会详细讨论。

我正在以“未打包”状态将所需的 deb 提取到 rootfs(dpkg与 custom--instdir和 一起使用)。--admindir我计划稍后 chroot 进入系统并按dpkg --configure <packagename>拓扑顺序运行每个包。

Priority: required全新安装 Debian 需要两个必需的 ( ) 软件包, libc6(这里) 和libgcc1这里)。两人对彼此都有着严格的要求。

因此,我无法dpkg --configure <packagename>在一个包上运行,因为它抱怨另一个包仍处于需要配置的“未打包”状态。

死锁。这是有道理的。

这怎么可能?标准 Ubuntu/Debian 安装程序 ISO 如何处理这个问题?

与此同时,我正在运行dpkg --configure -a,它似乎正确配置了每个包,但我不确定它是如何做到的,并且它选择配置包的拓​​扑顺序不正确。

理想情况下,我想要一个第 2 阶段脚本,它为每个包运行 preinst 脚本,然后单独配置该包。像这样的东西。

# Optional, if the preinst exists for the package.
DPKG_MAINTSCRIPT_NAME=preinst DPKG_MAINTSCRIPT_ARCH=amd64 DPKG_MAINTSCRIPT_PACKAGE=apt /var/lib/dpkg/info/<packagename>.preinst install
# Required, for every package.
dpkg --configure <packagename>
# ...repeated for each package, in topological order.

解决这个问题的方法debootstrapmultistrap解决方法是它们不用于dpkg进行配置。他们手动运行 preinst/postinst 并更新/var/lib/dpkg/status数据库,但每个脚本都有自己的问题,我不会讨论。

答案1

引导 Debian 系统不属于 Debian 政策的范围。这些机制目前在各种引导程序中进行编码,以包含包中不存在的所有隐式信息,例如 Essential:yes 包之间的依赖关系。这是一个问题,因为我们需要在每个新的引导程序中复制所有这些,并且它很脆弱,因为对伪必要包集的更改可能会破坏这些假设。

我们正在努力改进这一点https://wiki.debian.org/Teams/Dpkg/Spec/InstallBootstrap。您可能想查看 mmdebstrap,它尝试使用库存工具并尽可能多地卸载它们以及包元数据,因此在某种程度上,它是上述提案的 PoC 实现。

我建议使用 mmdebstrap,但如果这不是一个选项,并且您仍在尝试重新实现引导程序,您可能需要检查各种现有引导程序的源以获取这些隐式详细信息。

相关内容