关于 Debian 包管理器新 DEB822 格式介绍
前天 Debian 13 正式发布了,这两天磨磨蹭蹭的把手里的两台 vps 从 debian 12 给更新到 Debian13 了。
更新国内那台 VPS 的时候,在 ustc mirror 帮助文档看到说「目前 Debian Bookworm 的容器镜像和 Debian Trixie 已经使用 DEB822 格式」,看 DEB822 参考命令对应的内部格式定义,可读性很好。
搬运下 ustc mirror 帮助文档关于 DEB822 文件格式的介绍
什么是 DEB822 (.sources) 文件格式?
自新版本的 Debian 与 Ubuntu 起,例如:
- Debian 13
- Debian 12 的容器镜像
- Ubuntu 24.04
- Proxmox VE 9
默认预装的系统中 APT 的系统源配置文件不再是传统的 /etc/apt/sources.list。传统格式(又被称为 One-Line-Style 格式)类似如下:
deb http://mirrors.ustc.edu.cn/debian/ bookworm main contrib
新的 DEB822 格式自 APT 1.1(2015 年发布)起支持,后缀为 .sources,存储在 /etc/apt/sources.list.d/ 目录下,格式类似如下:
Types: deb
URIs: https://mirrors.ustc.edu.cn/debian
Suites: bookworm
Components: main contrib
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
DEB822 字段规范:
小贴士:带
*标记的参数为可选参数,默认配置中不会包含。
Architectures是比较重点的参数,在 docker、nodejs 的配置文件中会需要
| 参数 | 说明 | 可用值 |
|---|---|---|
| Types | 种类 | 安装包 (deb)、源码包 (deb-src) |
| URIs | 统一资源标识符,理解为地址即可 | (http)、(https)、(mirror)、(file)、(cdrom)、(ftp)、(copy)、(rsh/ssh) 等 |
| Suites | 套件 | 无固定值,为仓库定义 |
| Components | 组件 | 无固定值,为仓库定义 |
| Signed-By | 签名,签名文件地址 | / |
Architectures* | 架构,定义所下载的安装包所支持的处理器架构 | / |
| Languages* | 语言,定义所下载的安装包翻译所支持的语言 | / |
| Targets* | 目标,定义将从所指定的地址获取资源文件 | / |
| PDiffs* | 对比索引,定义是获取全量资源还是仅获取更新的部分 | (yes)、(no) |
| By-Hash* | 校验,用于控制是否验证校验码 | (yes)、(no)、(force) |
DEB822 的格式定义规范:
- 单个条目由空行分隔;
- 额外的空行将被忽略;
- 行首的
#字符将整行标记为注释。因此可以通过注释属于该节的每一行来禁用条目,但通常更简单的做法是在该节添加 “Enabled: no” 字段来禁用条目。 删除该字段或将其设置为 “yes”,就能重新启用该条目。 - 选项的语法与其他字段相同:字段名用冒号(
:)分隔,其值可选择空格。
特别要注意的是,多个值之间用空格(如空格、制表符和换行符)分隔,而不是像单行格式那样用逗号分隔。多值字段如 Architectures 也有 Architectures-Add 和 Architectures-Remove 来修改默认值,而不是直接替换默认值。
默认配置
以下是一个为 Debian Trixie 准备的 deb822 格式的 debian.sources 示例:
Types: deb deb-src
URIs: https://deb.debian.org/debian
Suites: trixie trixie-updates
Components: main non-free-firmware
Enabled: yes
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb deb-src
URIs: https://security.debian.org/debian-security
Suites: trixie-security
Components: main non-free-firmware
Enabled: yes
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
格式转换
在 Debian 13 (trixie) 中引入了源配置转换工具,在执行更新源命令时可见其提示:
Notice: Some sources can be modernized. Run 'apt modernize-sources' to do so.
使用其命令可自动将配置转换为 DEB822 格式:
实测,似乎存在 bug,具体表现在转换之后的
DEB822格式可能会缺失证书路径,可能是样本的问题,后续需要重新确认下
apt modernize-sources
转换示例
以官方 docker-ce 仓库为例,原格式:
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/debian bookworm stable
转换后:
Components与 One-Line-Style 格式中对应位置的参数需要正确对应
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: bookworm
Components: stable
Signed-By: /etc/apt/keyrings/docker.gpg
# 需要注意的是部分 Debian 官方支持的架构,Docker CE 版本并不支持,因此需要添加以下参数
Architectures: amd64
如果是手动转换的话,需要旧版 .list 文件
find /etc/apt/ -name "*.list" -type f -exec mv {} {}.bak \;