3.Debian APT软件包
Debian 软件包管理,包括软件包的组成、依赖关系解析、APT 的优先级配置、 pinning 以及如何构建自己的 .deb 软件包。
软件包的组成
Debian 的软件包 ( .deb 文件) 实际上是一个归档文件,包含以下几个主要部分:
debian-binary: 一个文本文件,包含 Debian 软件包格式的版本号(通常是 "2.0")。control.tar.gz: 包含软件包的控制信息,例如软件包的名称、版本、依赖关 系、描述等。 它包含以下几个重要的文件:control: 包含软件包的元数据,例如软件包名称、版本、架构、依赖关系、维护者等。md5sums: 包含软件包中所有文件的 MD5 校验和,用于验证文件的完整性。preinst: 在软件包安装之前执行的脚本。postinst: 在软件包安装之后执行的脚本。prerm: 在软件包卸载之前执行的脚本。postrm: 在软件包卸载之后执行的脚本。
data.tar.gz或data.tar.xz或data.tar.lz4: 包含实际的程序文件、配置文件、文档等。
依赖关系解析
APT 的一个核心功能是自动解决软件包的依赖关系。依赖关系在 control 文件中声明,可以使用以下几种方式表示:
Depends: <软件包名>: 指定软件包必须依赖于另一个软件包。Recommends: <软件包名>: 指定建议安装的软件包,但不是强制性的。 如果没有安装,系统仍然可以正常运行。Suggests: <软件包名>: 指定建议安装的软件包,但优先级更低。Conflicts: <软件包名>: 指定与另一个软件包冲突,不能同时安装。Breaks: <软件包名>: 指定破坏另一个软件包,可能会导致另一个软件包无法正常运行。Provides: <软件包名>: 指定软件包提 供一个虚拟的软件包名。 其他软件包可以依赖这个虚拟的软件包名。Replaces: <软件包名>: 指定软件包替换另一个软件包。
APT 通过解析这些依赖关系,找到满足所有依赖的软件包版本组合,并自动安装相关软件包。如果 APT 无法解决依赖关系,可能会报告错误,并要求手动干预。
APT 的优先级配置
APT 允许你配置软件包的优先级,以控制从哪个软件源安装软件包。 优先级通过 /etc/apt/preferences 文件或 /etc/apt/preferences.d/ 目录下的文件进行配置。
-
优先级的值是一个整数,范围从 -10000 到 1000。 值越大,优先级越高。
-
APT 会选择优先级最高的软件包版本。
-
常用的优先级值:
-1: 禁止从特定软件源安装软件包。1 - 99: 低优先级。100: 默认优先级。500: 通常用于稳定版。990: 通常用于本地安装的软件包。>1000: 极高优先级。
-
preferences文件的格式:
Package: <软件包名>
Pin: <Pin 参数>
Pin-Priority: <优先级>
*Package: 可以是软件包名,也可以使用 * 通配符匹配所有软件包。
-
Pin: 指定匹配软件包的条件。常用的 Pin 参数:release a=<发行版代号>: 匹配指定发行版的软件包。release o=<软件源>: 匹配指定软件源的软件包。version <版本号>: 匹配指定版本的软件包。
-
示例:
- 优先从 Debian 稳定版安装软件包,但允许从 Debian Backports 安装特定软件包:
Package: *
Pin: release a=stable
Pin-Priority: 500
Package: my-package
Pin: release a=bookworm-backports
Pin-Priority: 600- 禁止从某个软件源安装软件包:
Package: *
Pin: release o=untrusted-repository
Pin-Priority: -1
Pinning 是一种高级的 APT 配置技术,用于控制从哪些软件源安装软件包,以及软件包的版本。 通过 Pinning,你可以:
- 保持系统使用稳定版的软件包,但允许从测试版或不稳定版安装特定软件包。
- 锁定软件包的版本,防止自动升级。
- 混合使用不同 Debian 发行版的软件包。
Pinning 的配置是通过 /etc/apt/preferences 文件实现的,使用 Pin 和 Pin-Priority 参数。
构建自己的 .deb 软件包
可以使用 dpkg 和 debuild 工具构建自己的 .deb 软件包。
-
准备工作:
- 安装
dpkg-dev和devscripts软件包:
sudo apt install dpkg-dev devscripts- 创建一个软件包目录,包含以下文件和目录:
DEBIAN/: 控制目录,包含control、preinst、postinst、prerm、postrm等文件。usr/: 包含程序文件、配置文件、文档等。
- 安装
-
创建
control文件:
Package: my-package
Version: 1.0-1
Architecture: all
Maintainer: Your Name <[email protected]>
Description: A short description of the package.
Long description of the package.
Depends: package1, package2
-
构建软件包:
- 切换到软件包目录的上一级目录。
- 使用
dpkg-buildpackage命令构建软件包:
dpkg-buildpackage -rfakeroot -uc -us- 或者使用
debuild命令 (更方便):
debuild -uc -us- 构建成功后,会在上一级目录生成
.deb软件包。
-
安装软件包:
sudo dpkg -i my-package_1.0-1_all.deb
sudo apt-get install -f # 解决依赖关系
示例:构建一个简单的 Hello World 软件包
- 创建目录结构:
mkdir hello-world
cd hello-world
mkdir -p DEBIAN usr/bin
- 创建
DEBIAN/control文件:
nano DEBIAN/control
Package: hello-world
Version: 1.0-1
Architecture: all
Maintainer: Your Name <[email protected]>
Description: A simple Hello World program.
- 创建
usr/bin/hello文件:
nano usr/bin/hello
#!/bin/bash
echo "Hello, World!"
- 添加执行权限:
chmod +x usr/bin/hello
- 返回上一级目录:
cd ..
- 构建软件包:
debuild -uc -us
- 安装软件包:
sudo dpkg -i hello-world_1.0-1_all.deb
sudo apt-get install -f
- 运行程序:
hello