Debian 固定方法
Debian,也被称为“通用操作系统”,是最古老的 Linux 发行版之一。在任何时间点,总会有三个主要的 Debian 版本:稳定版、测试版和不稳定版。 “稳定”版本代表官方 Debian 版本:它坚如磐石,可以用于生产,并且包含没有太大变化的软件包。 “测试”版本包含即将被接受为稳定版本的软件包,最后,“不稳定”版本是具有最新版本软件的版本,用于发行版开发。
在本教程中,我们将了解如何使用“固定”技术在稳定版本的 Debian 上安装测试版和不稳定版的软件包。
在本教程中您将学习:
如何将测试和不稳定的存储库添加到 Debian“稳定”软件源
默认情况下如何分配包优先级
如何配置固定
如何显式安装“测试”或“不稳定”的软件包
将 Debian 测试和不稳定存储库添加到稳定版本中
必须避免混合来自不同 Debian 版本的软件包,除非没有可用的替代方案。也就是说,要将测试版或不稳定版的软件包安装到 Debian 的稳定版中,我们需要做的第一件事是将相应的存储库添加到发行版软件源中。完成此任务的最直接方法是将以下条目添加到 /etc/apt/sources.list
文件中:
deb http://deb.debian.org/debian testing main contrib
deb http://deb.debian.org/debian unstable main contrib
Debian 版本以玩具总动员角色命名。例如,在撰写本文时,稳定版本被命名为“bullseye”,而测试版本被命名为“bookworm”(不稳定版本始终被命名为“sid”)。在 /etc/apt/sources.list
文件中,版本可以通过其名称引用,也可以通过版本类本身(稳定/测试/不稳定)引用。在下面的例子中我们采用了后一种策略。
每个 Debian 发行版存储库基本上都包含三个“组件”:main、contrib 和 non-free。 “主要”组件仅包含免费和开源软件; “contrib”组件包含具有一些非自由依赖项的免费开源软件。最后,“非自由”组件包含不符合 Debian 自由软件指南的软件。 “反向移植”组件(在当前 Debian“稳定”版本的情况下为 Bullseye-backports)也可以作为一种安全的方式来提供从以下版本重新编译的更多最新软件 针对“稳定”上已有的库进行“测试”。在上面的示例中,如您所见,我们仅使用了前两个组件。
一旦测试和/或不稳定的存储库被添加为软件源,我们必须根据我们希望系统的行为方式更改包优先级。让我们看看如何做到这一点。
默认情况下如何分配优先级
当同一软件包有多个版本可用时,为了选择应安装哪一个,APT 使用优先级系统。在学习如何在 /etc/apt/preferences 文件(或 /etc/apt/preferences.d 目录下的专用文件)中显式设置包优先级之前,我们必须掌握如何分配优先级。这取决于是否定义了目标版本。 Debian 目标版本默认未定义,但可以设置到 /etc/apt/apt.conf
文件中。例如,要将“稳定”设置为目标版本,我们可以编写:
APT::Default-Release "stable"
如果定义了目标版本,则其中的包将获得最高优先级:
优先级 100 分配给已安装的软件包。
优先级 900 分配给目标版本中的包
优先级 500 分配给其他包
如果目标版本未定义,则将优先级 100 分配给已安装的软件包,而所有可用软件包的优先级为 500。软件包的最高可用版本是选择作为安装的候选者,并且永远不允许软件包降级,除非它们的优先级明确设置为> 1000。更具体地说,APT 按以下方式解释优先级值(整数):
优先级<0:阻止安装软件包版本
1 和 99 之间的优先级值:仅当没有已安装的软件包版本时才安装某个版本。
优先级介于 100 和 499 之间:除非有属于其他发行版的可用版本或安装的版本更新,否则会导致安装版本
优先级介于 500 和 989 之间:导致安装某个版本,除非存在属于目标版本的可用版本或安装的版本较新
990 和 999 之间的优先级:即使版本不是来自目标版本,也会导致安装该版本,除非安装的版本较新
优先级 > 1000:导致安装某个版本,即使这构成软件包的降级
可以通过在 /etc/apt/preferences
文件中定义规则来覆盖优先级。让我们看看如何。
/etc/apt/preferences 文件
要在 /etc/apt/preferences
文件中定义规则,我们必须提供三个信息:
应该与要应用的规则匹配的模式(可以是包名称、POSIX 扩展正则表达式或“*”以匹配所有可用包)
软件包版本、来源或发行版
包优先级
让我们看一些例子。正如我们上面指定的,当未定义目标版本时,将选择软件包的最新版本作为安装候选版本。我们将测试版本和不稳定版本添加为软件源,因此,由于后者包含最新的软件包,因此我们尝试安装的软件应该从中提取(如果可用)。假设我们要安装ansible;为了验证我们刚才所说的是否正确,我们可以使用 apt-cachepolicy 命令,该命令显示每个软件源的优先级以及将被选为安装候选的软件包版本(如果软件包名称作为参数传递。我们跑:
$ apt-cache policy ansible
该命令返回以下输出:
ansible:
Installed: (none)
Candidate: 7.3.0+dfsg-1
Version table:
7.3.0+dfsg-1 500
500 http://deb.debian.org/debian testing/main amd64 Packages
500 http://deb.debian.org/debian unstable/main amd64 Packages
2.10.7+merged+base+2.10.8+dfsg-1 500
500 http://deb.debian.org/debian bullseye/main amd64 Packages
正如您所看到的,该软件包的 7.3.0+dfsg-1
版本在“testing”和“unstable”存储库中均可用,而“stable”存储库包含 2.10。 7+merged+base+2.10.8+dfsg-1
版本,较旧。所有版本都具有相同的优先级 (500),但会选择最新的版本。
现在,假设我们想要将测试和不稳定存储库添加到我们的 Debian “稳定”系统中,但我们只想根据明确的请求从它们安装软件包。在不设置目标版本的情况下,我们可以定义以下规则,并为来自testing和unstable的包分配较低的优先级:
Package: *
Pin: release a=stable
Pin-Priority: 900
Package: *
Pin: release a=testing
Pin-Priority: 600
Package: *
Pin: release a=unstable
Pin-Priority: 500
上面的规则匹配所有包,因为我们使用了“*”(全局表达式)。还可以使用 POSIX 扩展正则表达式。为了匹配特定的包,我们只需输入它的名称即可。我们通过发布存档固定软件包(这就是“a=stable”中的“a”代表的意思),并且我们分配了从“stable”(优先级 900)开始的递减优先级,然后是“testing”(优先级 600),最后是“unstable” ”(优先级 500)。版本也可以通过它们的“名称”来选择,例如,我们可以写:
Package: *
Pin: release n=bullseye
Pin-Priority: 900
我们保存规则并重新检查 apt-cache 命令的输出。正如您所看到的,这次选择作为安装候选的软件包是来自稳定存储库的软件包,它具有更高的优先级:
ansible:
Installed: (none)
Candidate: 2.10.7+merged+base+2.10.8+dfsg-1
Version table:
7.3.0+dfsg-1 600
600 http://deb.debian.org/debian testing/main amd64 Packages
500 http://deb.debian.org/debian unstable/main amd64 Packages
2.10.7+merged+base+2.10.8+dfsg-1 900
900 http://deb.debian.org/debian bullseye/main amd64 Packages
在这种情况下,如何显式安装来自testing或unstable的软件包?我们可以在运行时使用 -t
选项 (--target-release
) 从命令行临时定义单个命令的“目标版本”。这将使包及其依赖项从指定版本安装,或者,如果已经安装,则在包需要时更新到目标版本中的版本。例如,要使用“testing”作为目标版本来安装“ansible”包,我们将运行:
$ sudo apt-get install -t testing ansible
要仅安装特定版本的软件包,但尝试根据已建立的优先级来满足其依赖关系,我们将运行:
$ sudo apt-get install ansible/testing
然而,大多数时候这可能会导致如下错误:
The following packages have unmet dependencies:
ansible-core : Depends: python3-jinja2 (>= 3.0.0~) but 2.11.3-1 is to be installed
自然而然地,在混合来自不同 Debian 版本的软件包时,应该非常小心并极其注意地检查预安装报告。在混合来自不同 Debian 版本的软件之前,您应该始终检查“backports”存储库中是否有可用的软件包更新版本。
结论
在本教程中,我们了解了如何将 Debian 测试和不稳定版本中的软件存储库包含到稳定版本中,并使用“固定”技术定义包优先级。我们了解了如何根据是否定义了目标/默认 Debian 版本来分配优先级,并且了解了如何通过指定优先级规则来覆盖默认行为。有关更多示例,请查看 apt_preferences 联机帮助页。