Debian APT 3.0 的新功能

Debian 的高级软件包工具(APT)是一套在 Debian 和 Debian 衍生操作系统上处理软件包管理的实用程序。APT 最近进行了重大升级,升级到了 3.0 版,正好赶上计划于 2025 年发布的 Debian 13(“trixie”)。版本升级是有道理的;最新的 APT 改进了用户界面,改用 Sequoia 验证软件包签名,并包含了 solver3–一个旨在改进评估和解决软件包依赖性的新求解器。

APT 套件包括高级的 apt 命令行工具,以及大量低级实用程序,用于配置 APT、管理软件包或查询其内部数据库(称为缓存)。它还包括 libapt-pkg 软件包管理库,AptitudeNala 等 APT 替代前端都使用该库。反过来,APT 也依赖 dpkg 来实际处理 Debian 软件包文件(.debs)。所有 Debian 软件包管理工具之间的关系在 Debian FAQ 中都有详细描述。

更好的界面

APT 的第一个版本 0.0.1 于 1998 年由 Scott K. Ellis 发布。目前 APT 的开发工作主要由 Julian Andres Klode 负责。APT 3.0 是自 2020 年 3 月发布 2.0 版以来的首个重要版本。3.0 版于 4 月 4 日进入不稳定状态,并于 4 月 10 日进入测试阶段。Klode 将 3.0 系列献给在今年年初去世的 Debian 和 Ubuntu 开发人员 Steve Langasek(“vorlon”)。

 

元素周期表

3.0 系列的开发始于 2024 年 4 月的 2.9.0 版本。这次更新包括对 apt 界面的一些改动,这些改动关闭了乔伊-赫斯(Joey Hess)提出的一个存在十年之久的 bug。乔伊-赫斯(Joey Hess)提出的 bug 是要求 apt 提供更明确的信息,让用户知道在执行 “dist-upgrade ”等操作时,它会删除哪些软件包。他抱怨说,有关删除软件包的信息 “被埋没在大量其他数据中间,轻则被略过,重则直接从终端滚动掉”。

在 3.0 版中,apt 将输出整理成更易于阅读的部分,并增加了软件包的列式显示和彩色输出。例如,如下图底部窗格的截图所示,以前版本的 apt 会将所有信息集中在一起,形成难以阅读的文本块。apt 3.0 的输出(如顶部窗格所示)将信息放在逻辑块中,并在最后用红色突出显示软件包的移除,以帮助确保用户意识到他们即将执行一项潜在的破坏性操作。

图1:Debian APT 3.0 的新功能

3.0 分支还能自动调用传呼机,以执行 “apt search”、“apt show ”或 “apt policy ”等可能需要较长终端输出时间的命令。

DEB822 和 apt modernize-sources

Debian 一直在缓慢地转向 APT 数据源的新格式。大多数 Debian 用户都熟悉/etc/apt/sources.list 文件及其格式,它将软件包存档的所有信息都放在一行中,比如下面这个例子:

deb https://deb.debian.org/debian/ bookworm contrib main non-free non-free-firmware
deb-src https://deb.debian.org/debian/ bookworm contrib main non-free non-free-firmware

其中指定了归档类型(二进制包为 deb,源码包为 deb-src)、版本库 URL、发行版名称(此处为 bookworm),以及 contrib、main、non-free 等组件。2015 年,APT 1.1 增加了对新格式 DEB822 的支持,该格式取自互联网文本信息(邮件)的 RFC 822 标准。(在新格式下,相同的归档信息将出现在/etc/apt/sources.list.d/debian.sources文件中,如下所示:

    Types: deb deb-src
    URIs: https://deb.debian.org/debian
    Suites: bookworm
    Components: main contrib non-free non-free-firmware
    Architectures: amd64
    Enabled: yes
    Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

这样做的好处是使源代码格式更易读,并增加了选项功能。在本例中,“Enabled”(已启用)允许用户指定是否启用源代码,而无需在禁用时注释每一行。“Architectures”(架构)很简单,指定要下载的 CPU 架构。“Signed-By”(签名-作者)句子指定了用于签名压缩包中 Release 文件的 GnuPG 密钥。正如 sources.list manpage 所指出的,其目的是逐渐将 DEB822 作为默认格式,“因为它更易于创建、扩展和修改,无论是对人类还是机器都是如此”,并最终淘汰旧格式。

Klode 曾游说在 Debian 12 中改用 DEB822 类型的源文件,但这一改变并未实现。同样,至少在当前的 Debian 测试/trixie 安装中,Debian 13 也没有实现这一转变。不过,apt 增加了一个 modernize-sources 命令,可以将 sources.list 和其他 APT 数据源文件转换为 DEB822 格式。以 root 身份运行 “apt modernize-sources”,如果有未转换的文件,会显示一条信息,详细说明将要转换的文件,并询问用户是否继续。如果是,它将以 .bak 扩展名备份旧文件,并将文件写入 /etc/apt/sources.list.d/debian.sources。如果不是,命令将把以新格式写出的内容写入控制台,而不是替换文件。

Ubuntu 用户可能已经熟悉 DEB822 格式,因为 Ubuntu 在 24.04 “Noble Numbat ”版本中就开始使用该格式。

无论如何,旧格式可能还将使用一段时间。在讨论 Debian 12 默认使用 DEB822 源代码时,Klode 曾说过,取消对 sources.list 格式的支持最早也要到 2030 年。那是在 2021 年,其中包括首先在 trixie 中淘汰该格式。目前来看,最早也要到 Debian 14(“forky”)发布时才会废止该格式,而且该时间表尚未确定:但它不可能早于 2027 年发布。

新的solver

APT 在幕后处理软件包之间的依赖关系、冲突和交互,因此用户在安装软件时无需担心这些信息。如果用户想安装 Git,他们不需要知道它需要 GNU C 库、Perl、zlib 压缩库、PCRE2 和其他几个软件包。他们不需要知道这些软件包的依赖关系,也不需要提前知道系统中已安装的软件是否与他们想安装的软件冲突。

APT 使用其解算器来理清软件包之间的关系,并提供一个解决方案–如果在其可用的数据源中存在这样的解决方案的话–来安装提供 Git 或用户要求安装的任何软件所需的所有软件包。用户不需要知道这些软件包的依赖关系,也不需要知道依赖关系的依赖关系,等等。

2023 年,Klode 撰文介绍了 APT 的升级方法,以及在一个版本内的升级(例如,对已安装的 Debian 12 系统进行软件包更新)和从一个版本升级到下一个版本(例如,从 Debian 12 升级到 Debia 13)时,依赖关系解决的方式应如何不同。在一个版本中,APT 应尽量减少软件包的变化,但在升级到一个新版本时,APT 应尽量减少升级系统与新安装版本之间的差异。他提出的建议是,APT 解算器应该 “忘记 ”哪些软件包是自动安装的,而以正常化为目标。

例如,用户可能会使用 apt 在运行 Debian bookworm 的系统上安装自己最喜欢的编辑器。如果该操作会带来自动依赖关系,那么当系统升级到 trixie 时,先前版本的 APT 会设法保留这些依赖关系–即使用户在全新安装的 trixie 上安装编辑器时会有不同的选项。而新的求解器则会选择用 trixie 的首选选项替换自动安装的依赖项,这样安装时就不会与其他 trixie 安装有太大偏差。

第一个版本的 solver3 出现在 APT 2.9.3 中。克洛德在博客中将新求解器描述为戴维斯-普特南-洛格曼-洛夫兰(DPLL)求解器,但没有纯字面消元。

克洛德说,在实际应用中,与经典求解器 “最显著的不同 ”是,solver3 总是保留手动安装的软件包,包括那些被标记为过时的软件包。他说,今后将放宽这一政策,如果有软件包可以替代过时的软件包,则允许替换这些软件包。在去年 DebConf24 上的演讲中,他估计新的求解器将比传统版本快 40%,因为它在提出解决方案时不会评估软件仓库中的每一个软件包。

APT 3.0 的另一个目标是帮助用户整理系统。apt autoremove 命令可用于删除不再需要的软件包。这包括作为另一个软件包的依赖关系而安装的软件包,但该软件包已被移除,或因升级而不再需要的软件包。Klode 说,Solver3 的自动删除功能会更积极地删除不需要的软件包,因为它只知道每个软件包的最强依赖链,而不会再保留那些只能通过较弱依赖链到达的软件包。

由于一个系统可以启用多个 APT 软件源,而一个软件包可能存在于多个软件源中,因此 APT 使用软件源和单个软件包的优先级来决定安装哪个软件包。默认优先级为 500,数值越大代表优先级越高。如果软件包具有相同的优先级,APT 将选择版本号最高的软件包。如果软件包的优先级不同,APT 将选择优先级最高的软件包。Pinning 可用于更改软件包或软件源的优先级,如果用户想安装第三方软件源中的某些软件包,或者想优先安装 Debian backports 中的软件包,而不是 Debian 稳定版中的软件包,则可以使用 Pinning。apt-cache policy”(apt 缓存策略)命令会显示软件源的优先级和任何被钉住的软件包。

在 3.0 中,apt 增加了一个新选项–no-strict-pinning。这就要求 apt 考虑软件包的所有版本,而不仅仅是最佳版本(APT 术语中的 “候选 ”版本)。Klode 举例说明了如何安装 2.0 版的软件包 foo:

# apt install foo=2.0 --no-strict-pinning

这将安装 foo 2.0,并升级或降级满足其依赖关系所需的其他软件包,即使包含所需依赖关系的软件仓库被钉在较低级别的位置,而且这意味着要降级其他软件包以满足 foo 2.0 的依赖关系。举例来说,这对于从 Debian 的实验软件源安装一两个软件包而无需从该软件源获取所有软件包非常有用。

默认使用 sqv

APT 一直使用 GnuPG 作为 OpenPGP 实现来验证软件源中包含的 Release.gpg 文件上的签名。在 3.0 中,APT 现在默认在支持的平台上使用红杉 PGP 项目的 sqv 验证工具。(LWN 在 1 月份对 Sequoia 进行了报道)。

Klode 在去年 11 月解释说,他努力取代 GnuPG 有几个原因。他提到了 GnuPG 的上游与其他 OpenPGP 实现不兼容的问题,LWN 在 2023 年对此进行了报道。他还说,GnuPG 的实现存在质量问题,如默默忽略某些选项、过期签名不出错以及一些不安全的功能:

例如,新的–assert-pubkey-algo功能接受<operator><name><size>作为语法,因此它查看>=ed448,并接受ed25519为更强,因为25519>=448,而它是较弱的曲线。

他还指出,sqv 是用内存安全语言(Rust)编写的,这可以使 OpenPGP 的解析更加安全。伊恩-杰克逊(Ian Jackson)感谢了所有为这一改变做出贡献的人,并表示这一改变将 dgit 测试套件的运行速度提高了 “近 2 倍”。

根据 Klode 去年发给 debian-devel 的一条信息,在不稳定版中,sqv 成为了 Debian 所有发行版架构和部分 ports(尚未晋升为发行版的进行中架构)的默认设置。由于 APT 3.0 现已进入测试阶段,因此也进入了 trixie,sqv 将成为默认设置。

apt install 3.0

如果 Debian 不稳定版和测试版的用户在 4 月 10 日之后进行了升级,那么他们应该已经掌握了 3.0。它也将出现在计划于 4 月 17 日发布的 Ubuntu 25.04 中。根据 25.04 版的发布说明,“如果经典求解器找不到解决方案,新求解器将自动用于寻找解决方案或为故障添加更多背景信息 ”或评估其性能。

当 Debian trixie 发布并开始广泛使用时,用户对新 APT 的接受程度如何,我们拭目以待。在我简短而不完全严谨的测试中,APT 3.0 似乎有了全面的改进,但实际使用中无疑会发现一些有趣的问题。

本文文字及图片出自 What's new in APT 3.0

阅读余下内容
 

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注


京ICP备12002735号