仓库管理
了解 Debian 软件仓库的结构以及仓库中包含的不同文件。
软件源路径
Debian 系统从软件源获取软件包。软件源的路径配置在文件 /etc/apt/sources.list 或 /etc/apt/sources.list.d/*.list 中,格式如下:
1deb <URL> <DISTRIBUTION> [<COMPONENT>]+
1deb-src <URL> <DISTRIBUTION> [<COMPONENT>]+
例如:
1deb http://ftp.debian.org/debian bullseye main contrib non-free
上述行表示:对于二进制软件包(deb-src 用于源代码包),软件源根地址为 http://ftp.debian.org/debian,对应发行版 bullseye,并启用 main、contrib 和 non-free 三个组件。
接下来我们讨论软件源的工作原理,以及如何创建和管理一个软件源。
软件源结构
Debian 软件源由一系列纯文本文件和 .deb 包组成,遵循 Debian Wiki 中记录的命名与内容规范。
Release 文件
当执行如 apt update 这类命令从软件源下载信息时,首先会从路径 <URL>/dists/<DISTRIBUTION>/Release 获取一个名为 Release 的文件。以我们上面的例子为例,该文件路径为 http://ftp.debian.org/debian/dists/bullseye/Release。
此外,apt 还会从同一路径下载扩展名为 .gpg 的文件,其中包含 Release 文件的加密签名。
除了 Release 和 Release.gpg 这对文件外,apt 也支持直接使用一个名为 InRelease 的文件,该文件将 Release 文件内容与加密签名内联在一起。
Release 文件包含元数据,例如可用架构列表、发布代号、版本号等。它还列出了其他文本文件及其签名。这些链接指向多种类型的元数据文件。
-
例如,
Contents文件包含软件包中所含文件的列表。工具
apt-file可以下载Contents文件,并用于搜索某个特定文件或路径名所属的软件包,即使该软件包尚未安装。 -
命令
apt-get update会查找Packages文件,例如main/binary-amd64/Packages,用于获取main组件中amd64架构的二进制软件包信息。为了提高效率,
apt通常优先使用压缩版本的Packages文件,即Packages.xz或Packages.gz。
这些元数据文件的路径是相对于 dists 目录的,因此完整路径为:http://ftp.debian.org/debian/dists/bullseye/main/binary-amd64/Packages.xz。
Packages 文件
在执行 apt-get update 时,apt-get 会查找所有符合指定组件和架构(通常是 all 和 amd64)的 Packages 文件。
每个 Packages 文件由多个以空行分隔的段落组成。
以下是一个段落的示例:
Packages 文件中的一个段落
1Package: bash 2Version: 4.4-5 3Essential: yes 4Installed-Size: 5798 5Maintainer: Matthias Klose <doko@debian.org> 6Architecture: amd64 7Replaces: bash-completion (<< 20060301-0), bash-doc (<= 2.05-1) 8Depends: base-files (>= 2.1.12), debianutils (>= 2.15) 9Pre-Depends: dash (>= 0.5.5.1-2.2), libc6 (>= 2.15), libtinfo5 (>= 6) 10Recommends: bash-completion (>= 20060301-0) 11Suggests: bash-doc 12Conflicts: bash-completion (<< 20060301-0) 13Description: GNU Bourne Again SHell 14Multi-Arch: foreign 15Homepage: http://tiswww.case.edu/php/chet/bash/bashtop.html 16Description-md5: 3522aa7b4374048d6450e348a5bb45d9 17Tag: implemented-in::c, interface::shell, role::program, scope::utility, 18 suite::gnu, uitoolkit::ncurses 19Section: shells 20Priority: required 21Filename: pool/main/b/bash/bash_4.4-5_amd64.deb 22Size: 1426746 23MD5sum: 23966a12c6937bb3acd6572a94212e83 24SHA256: ec375aa432a743ec44781cb91802f5752021e7e107b48ee2e9aa2f7b9fc23f86
我们可以发现,许多字段与软件包的 control 文件非常相似。
此外,还有 Filename: pool/main/b/bash/bash_4.4-5_amd64.deb 这一行,它指明了实际软件包文件的下载位置。该路径相对于软件源根地址:http://ftp.debian.org/debian/pool/main/b/bash/bash_4.4-5_amd64.deb。
注意:
pool/目录通常用于避免在多个发行版或组件中重复保存相同软件包的副本。但客户端并不关心目录名称,它只根据Filename字段中提供的路径进行访问。因此,一些软件源管理工具并不使用pool/目录。
平面软件源
存在一种已弃用的平面软件源格式,其配置在 sources.list 文件中不使用发行版和组件名称,例如:
指定平面软件源的示例
1deb http://example.org/debian ./
这种格式有时被第三方软件包提供者使用,尤其是那些为多个基于 Debian 的发行版构建相同软件包的情况。
对用户而言,这种方式存在一定问题,因为它不支持实现版本固定(version pinning)所需的元数据功能:一种可以为软件包分配优先级的机制,从而允许选择非最新或非稳定版本的软件包。