linux 发行版 之 deb 包管理器


deb 包管理相关命令

在基于 Debian / Ubuntu 及其衍生版 的系统中,包管理主要分为两个层次:

  1. 底层工具 – dpkg: 这是 Debian 包管理系统的基础。它直接处理 .deb 文件,负责安装、删除、查询包的状态。但它不处理依赖关系
  2. 高层工具 – apt: 全称 Advanced Package Tool。它是一个友好的前端,构建在 dpkg 之上。它的核心优势是能够自动处理包的依赖关系,从远程仓库(repository)下载并安装软件。日常使用中,我们绝大多数时候都应该使用 apt

1. apt 命令系列 (高层工具,推荐日常使用)

apt 是管理软件包的现代化、用户友好的命令行工具。

命令详细说明主要使用场景
sudo apt update从软件源(/etc/apt/sources.list/etc/apt/sources.list.d/ 中定义的地址)更新本地包索引。它本身不升级任何软件,只是获取最新的软件包信息(比如版本、依赖)。1. 在安装任何新软件之前,先执行一次,确保获取的是最新版本。
2. 在执行系统升级(apt upgrade)前必须执行。
sudo apt upgrade根据 apt update 获取的最新信息,升级所有已安装的软件包到最新版本。它不会为了升级而删除任何现有的包。日常系统维护,保持软件为最新稳定版,获取安全补丁。
sudo apt full-upgrade功能与 upgrade 类似,但更“激进”。当升级需要删除一些旧的、冲突的包来解决依赖关系时,它会执行删除操作。进行系统大版本升级时(例如从 Ubuntu 20.04 升级到 22.04)。
sudo apt install <包名>安装一个或多个软件包,并自动处理和安装所有依赖包1. 安装新软件,如 sudo apt install nginx
2. 如果一个 .deb 文件在本地,也可以用sudo apt install ./文件名.deb 来安装,apt 会自动解决其依赖。
sudo apt remove <包名>卸载一个软件包,但保留其配置文件暂时卸载某个软件,但希望以后重装时能保留之前的配置。
sudo apt purge <包名>彻底卸载一个软件包,包括其所有的配置文件。彻底清除一个软件,不留任何痕迹。
apt search <关键词>在本地包索引中搜索包含关键词的软件包。当你不确定软件包的确切名称时,用来查找软件。例如 apt search "image editor"
apt show <包名>显示一个软件包的详细信息,如版本、大小、依赖项、简介等。在安装前查看软件的详细信息,确认是否是自己需要的版本或功能。
sudo apt autoremove自动卸载那些为了满足其他包的依赖而被安装,但现在不再被需要的包(孤立的依赖包)。定期清理系统,释放磁盘空间。通常在 removepurge 操作后执行。
apt list --installed列出所有已经安装在系统上的软件包。查看系统上安装了哪些软件,可以配合 grep 进行过滤,如 apt list --installed | grep "python"

2. dpkg 命令 (底层工具)

dpkg 主要用于直接操作本地的 .deb 文件或查询已安装包的底层信息。

命令详细说明主要使用场景
sudo dpkg -i <文件名.deb>
sudo dpkg --install <文件名.deb>
直接安装一个本地的 .deb 文件。如果存在依赖问题,它会报错并停止,不会自动解决。1. 安装没有在官方源里的第三方软件(如 Chrome、VS Code 的.deb包)。
2. 修复包管理系统时,可能需要手动安装某些关键包。注意: 安装后若提示依赖缺失,需执行sudo apt -f install 来修复。
sudo dpkg -r <包名>
sudo dpkg --remove <包名>
移除一个已安装的包(保留配置文件)。等同于 apt remove系统修复或脚本自动化场景。日常更推荐 apt
sudo dpkg -P <包名>
sudo dpkg --purge <包名>
彻底移除一个已安装的包(包括配置文件)。等同于 apt purge系统修复或脚本自动化场景。日常更推荐 apt
dpkg -l [包名模式]
dpkg --list [包名模式]
列出已安装的包。可以提供模式进行过滤,如 dpkg -l 'linux-image*'查看包的安装状态和版本,ii 开头表示正常安装。
dpkg -s <包名>
dpkg --status <包名>
查看特定包的安装状态。确认某个包是否已安装以及它的状态。
dpkg -L <包名>
dpkg --listfiles <包名>
列出某个已安装包所包含的所有文件及其在系统中的路径1. 了解一个软件包到底在系统中安装了哪些文件。
2. 调试时,想知道某个配置文件或可执行文件属于哪个包。
dpkg -S <文件路径>
dpkg --search <文件路径>
反向查询,根据一个文件的绝对路径,找出它属于哪个软件包。非常实用!当你想知道 /usr/bin/python3 这个文件是由哪个包装的时,执行 dpkg -S /usr/bin/python3
sudo dpkg-reconfigure <包名>重新配置一个已经安装的包。它会再次运行该包的安装后配置脚本。1. 重新设置时区:sudo dpkg-reconfigure tzdata
2. 重新配置键盘布局、语言环境等。

如何制作开发 deb 包

制作一个 .deb 包,本质上是创建一个符合 Debian 规范的特殊归档文件(.deb 文件是一个 ar 归档,内部包含 control.tar.gzdata.tar.gz)。开发一个 deb 包,主要是准备元数据和构建脚本。

核心概念

一个 deb 包的源码通常包含两个部分:

  1. 原始代码 (Upstream Source): 你要打包的软件的原始源代码,如 my-app-1.0.tar.gz
  2. Debian 特定文件: 一个名为 debian 的目录,包含了所有打包所需的信息。这是打包工作的核心。

debian 目录下的关键文件

以下是 debian 目录中最重要的几个文件:

  1. control (必须)
    • 作用: 定义了包的元数据,是最核心的控制文件。
    • 内容:
      • Source: 源码包名称。
      • Maintainer: 维护者信息(姓名和邮箱)。
      • Package: 二进制包名称(一个源码包可以生成多个二进制包)。
      • Version: 版本号。
      • Architecture: 架构(如 amd64, arm64, any)。
      • Depends: 依赖关系。列出此包正常运行所必须依赖的其他包。这是包管理系统解决依赖的依据。
      • Description: 软件包的简短和详细描述。
      • Recommends, Suggests, Conflicts: 其他依赖关系字段。
    • 示例: Source: my-cool-app Maintainer: Your Name <your.email@example.com> Section: utils Priority: optional Build-Depends: debhelper (>= 12), cmake Package: my-cool-app Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, libssl1.1 Description: A very cool application This is a longer description of my application. It does amazing things and everyone should install it.
  2. rules (必须)
    • 作用: 一个可执行的 Makefile 文件,定义了如何编译和构建软件包。
    • 内容: 它告诉打包工具如何从源代码生成最终要安装的文件。现代的 rules 文件通常非常简洁,借助于 debhelper (dh) 工具集来自动化大部分流程。
    • 示例 (使用 debhelper): #!/usr/bin/make -f # Export environment variables for debhelper. export DH_VERBOSE = 1 %: dh $@ 这个极简的 rules 文件会自动调用 dh_auto_configure, dh_auto_build, dh_auto_install 等命令,适用于使用标准构建系统(如 Autotools, CMake, Makefile)的项目。
  3. changelog (必须)
    • 作用: 记录软件包各版本的变更历史。打包工具有严格的格式要求,并且会从此文件中提取版本号。
    • 格式: package-name (version) distribution; urgency=medium * Change 1 description. * Change 2 description. -- Maintainer Name <email@example.com> Date
  4. copyright (必须)
    • 作用: 提供软件的版权和许可证信息。
  5. *.install 文件 (可选,但常用)
    • 作用: 声明需要将哪些文件从构建目录安装到最终的软件包中。这是一种比在 rules 文件中手动写 cp 命令更清晰的方式。
    • 示例 (my-cool-app.install):
      build/my-cool-app /usr/bin/ assets/icon.png /usr/share/icons/
  6. 维护者脚本 (Maintainer Scripts) (可选)
    • preinst: 在包解压前执行。
    • postinst: 在包安装和配置后执行(例如:创建用户、启动服务)。
    • prerm: 在包删除前执行。
    • postrm: 在包删除后执行(例如:清理用户、停止服务)。

主要构建工具

  • dpkg-buildpackage: 核心的构建命令,它会读取 debian 目录下的文件,并执行构建流程,最终生成 .deb 文件。
  • debuild: dpkg-buildpackage 的一个常用封装脚本,提供了更友好的环境和检查。
  • debhelper (dh): 一个工具集,极大地简化了 debian/rules 文件的编写,将常见的构建任务(如 configure, make, install, compress)自动化。
  • lintian: 一个 deb 包检查工具,用于检查软件包是否符合 Debian 的政策和标准,发现常见错误。构建完成后运行 lintian 是一个好习惯。

简单构建流程

  1. 获取软件源码并解压。
  2. 进入源码目录,创建 debian 文件夹。
  3. debian 目录中创建 control, rules, changelog, copyright 等文件并填写内容。
  4. 回到源码的根目录(debian 目录的上一级)。
  5. 运行构建命令:dpkg-buildpackage -us -uc ( -us -uc 表示不对源码和包进行 GPG 签名,适合本地测试)。
  6. 如果一切顺利,.deb 文件会生成在上一级目录中。
本文版权归原作者zhaofujian所有,采用 CC BY-NC-ND 4.0 协议进行许可,转载请注明出处。

发表评论