Skip to main content

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.gzdata.tar.xzdata.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 文件实现的,使用 PinPin-Priority 参数。

构建自己的 .deb 软件包

可以使用 dpkgdebuild 工具构建自己的 .deb 软件包。

  • 准备工作:

    • 安装 dpkg-devdevscripts 软件包:
    sudo apt install dpkg-dev devscripts
    • 创建一个软件包目录,包含以下文件和目录:
      • DEBIAN/: 控制目录,包含 controlpreinstpostinstprermpostrm 等文件。
      • 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 软件包

  1. 创建目录结构:
mkdir hello-world
cd hello-world
mkdir -p DEBIAN usr/bin
  1. 创建 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.
  1. 创建 usr/bin/hello 文件:
nano usr/bin/hello
#!/bin/bash
echo "Hello, World!"
  1. 添加执行权限:
chmod +x usr/bin/hello
  1. 返回上一级目录:
cd ..
  1. 构建软件包:
debuild -uc -us
  1. 安装软件包:
sudo dpkg -i hello-world_1.0-1_all.deb
sudo apt-get install -f
  1. 运行程序:
hello