本来这篇文章的内容是要写到一篇关于使用 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日