本来这篇文章的内容是要写到一篇关于使用 debootstrap 安装 Debian 的文章里的,结果那篇文章拖了半年连个标题都没写。这几日想起来羞愧难当,决定先拆个简单点的内容拿出来写。混源是个简单有用的使用技巧,不过令我惊讶的是网上没有像样中文的介绍。所以我就装模作样写一篇好了。

⚠️混源前且听 https://wiki.debian.org/DontBreakDebian 逆耳忠言……

混源的关键是处理好 apt 安装的优先级。Apt 使用 Priorities 值来保证优先级,配置文件保存在 /etc/apt/preferences 以及 /etc/apt/preferences.d/ 文件夹内。这里以一则简单的配置为例:

Package: *
Pin: release a=testing
Pin-Priority: 600

Package: *
Pin: release a=unstable
Pin-Priority: 400

Package: *
Pin: release a=stable
Pin-Priority: 1

这个配置设定了三种源内软件包的安装优先级。控制的关键在于 Priorities (P) 值,也就是这里的 Pin-Priority 。值越高则优先级越高。这个值按照大小大致可以分成六档:

P >= 1000:

这个优先级标记下的软件包无论如何都会安装,即使安装会导致当前系统内已安装的软件包降级。当然了,除非还能存在更高优先级的包,这一点下面就不复述了 (降级都要安装);

990 <= P < 1000:

这个优先级标记下的软件包无论如何都会安装,即使与当前系统版本号不匹配。但是不会导致降级 (系统版本不一致都要安装);

500 <= P < 990:

如果另有与当前系统版本号一致的包待选就不会安装。同样,不会导致降级 (当前系统版本的其他源里不存在才安装);

100 <= P < 500:

如果另有其他发行版的包待选就不会安装。同样,不会导致降级 (其他源里都不存在才安装);

0 < P < 100:

只有在没有包被安装的情况下才会安装 (没装才装,装了不装);

P < 0:

将会阻止安装。

另外还有一个 P == 0 是未定义状态,请勿使用。

你可以通过 apt-cache policy 来查看当前系统优先级策略。默认情况下主源的值是 500,也就是说在系统版本更换以后,通常就不会去未删除干净的旧版本软件源里获取软件包了。

好的,现在我们逐行看上面的配置。第一行 Package: *用星号通配了所有软件包,而匹配的包过滤自第二行。是的没错,在这里你可以通过正则式或 glob 以更高细粒度进行配置。

第二行 Pin: release a=testing 指明了软件包的发布来源。“a”代表的是“archive”,即存档库。所以这两行指明了所有来自 testing 套件的软件包。

当然并不是只有“a”可用,我们也可以使用:

“n”代号 (codename) ,譬如“Jessie”、“Bullseye”、“Bookworm”;

“v”版本 (version) ,譬如 “11”、“11.6”;

“c”组件 (component,这里的组件指归档区域) ,譬如“main”、“contrib”、“non-free”;

“o”源 (origin),譬如“Debian”、“Ubuntu”;

“l”标签 (label),譬如“Debian”、“Debian-Security”。

第三行就是期望标记的优先级了 (严谨来说指安装优先级,而不是软件包重要性) 。我们把三行内容合起来,其意义就是将 testing 当中的所有软件包优先级标记为900。另外两块配置也是同样的道理。整个配置合起来的意思大致就是优先去装 testing 的软件包,testing 没有就用 unstable 的,实在不行那就用 stable 的。

这么配置主要考虑到 Debian 软件包的生命周期流程模型。在 Debian 中,上游发布的软件在打包和检查后首先会进入 unstable 分支,在这一分支呆至少二到十天,确认其所有构架打包齐全无误,且没有引入新的致命发布缺陷或对安装产生不利影响等,之后便会进入 testing 分支。testing 分支通常每两年会冻结,修补后成为新的发布版本,也就是 stable 。

因此,unstable 通常拥有着最多最新的软件包,且紧贴上游的安全更新,但是会不稳定;stable 是发布版本,非常非常非常稳定,并且有安全小组负责安全更新,但是软件包会有些陈旧;介于两者之间的 testing 实际上非常适合家用,足够稳定又足够新,唯一的问题是不是所有包都会进 testing ,上游的安全更新进来也会稍慢一拍。

我个人的解决方案就是混源。系统主体使用 testing 的包,缺失的软件就用 unstable 补齐,最后保留 stable 源满足一些新系统已停止提供的依赖链。

具体数值上,我将 testing 放置到与默认的500同一档,但值稍微高一些,以应对未来新添加软件源的情况;unstable 低一档,确保它只是作为附加来源而不是鸠占鹊巢;stable 再低一档且只给了1,除非迫不得已不会去使用它,若要使用我也会仔细检查依赖关系。

这样,我们就拥有了一个滚动更新的 Debian,而且不用像 Arch 用户那样癫狂般更新,因为 apt 具有处理跨版本升级的能力 (超级牛力!) 。

Debian 庞大规模的软件源通常能满足绝大多数使用需求。不过有时,我们也许想要从某个源获取某个软件的持续更新。这时,我们只是想要这个源里的某个指定包,而不想让其他包来凑热闹。

我们这里以软件包 codium 为例,它由 download.vscodium.com 提供下载源。

第一步添加 sources.list 就不废话了。第二步 进行优先级设置,我们建一个独立配置到 /etc/apt/preferences.d/codium.pref 。配置内容是这样的:

Package: *
Pin: origin "download.vscodium.com"
Pin-Priority: -1

Package: codium
Pin: origin "download.vscodium.com"
Pin-Priority: 100

按照上面所讲的规则,这样配置禁止了所有来自这个源 (origin) 的软件包,仅保留一个名叫 codium 的允许安装。最后第三步,update,然后检查依赖就能安装使用了。

初稿发布于 2023年3月24日

再补充于2024年3月6日

知识共享许可协议