deb 包管理相关命令
在基于 Debian / Ubuntu 及其衍生版 的系统中,包管理主要分为两个层次:
- 底层工具 –
dpkg
: 这是 Debian 包管理系统的基础。它直接处理.deb
文件,负责安装、删除、查询包的状态。但它不处理依赖关系。 - 高层工具 –
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 | 自动卸载那些为了满足其他包的依赖而被安装,但现在不再被需要的包(孤立的依赖包)。 | 定期清理系统,释放磁盘空间。通常在 remove 或 purge 操作后执行。 |
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.gz
和 data.tar.gz
)。开发一个 deb
包,主要是准备元数据和构建脚本。
核心概念
一个 deb 包的源码通常包含两个部分:
- 原始代码 (Upstream Source): 你要打包的软件的原始源代码,如
my-app-1.0.tar.gz
。 - Debian 特定文件: 一个名为
debian
的目录,包含了所有打包所需的信息。这是打包工作的核心。
debian
目录下的关键文件
以下是 debian
目录中最重要的几个文件:
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.
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)的项目。
changelog
(必须)- 作用: 记录软件包各版本的变更历史。打包工具有严格的格式要求,并且会从此文件中提取版本号。
- 格式:
package-name (version) distribution; urgency=medium * Change 1 description. * Change 2 description. -- Maintainer Name <email@example.com> Date
copyright
(必须)- 作用: 提供软件的版权和许可证信息。
*.install
文件 (可选,但常用)- 作用: 声明需要将哪些文件从构建目录安装到最终的软件包中。这是一种比在
rules
文件中手动写cp
命令更清晰的方式。 - 示例 (
my-cool-app.install
):build/my-cool-app /usr/bin/ assets/icon.png /usr/share/icons/
- 作用: 声明需要将哪些文件从构建目录安装到最终的软件包中。这是一种比在
- 维护者脚本 (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
是一个好习惯。
简单构建流程
- 获取软件源码并解压。
- 进入源码目录,创建
debian
文件夹。 - 在
debian
目录中创建control
,rules
,changelog
,copyright
等文件并填写内容。 - 回到源码的根目录(
debian
目录的上一级)。 - 运行构建命令:
dpkg-buildpackage -us -uc
(-us -uc
表示不对源码和包进行 GPG 签名,适合本地测试)。 - 如果一切顺利,
.deb
文件会生成在上一级目录中。
本文版权归原作者zhaofujian所有,采用 CC BY-NC-ND 4.0 协议进行许可,转载请注明出处。