Debian系统中dpkg包管理工具的全面解析
立即解锁
发布时间: 2025-08-14 01:41:10 阅读量: 3 订阅数: 15 


Debian系统:概念与技术精髓
### Debian 系统中 dpkg 包管理工具的全面解析
#### 1. dpkg 概述
dpkg 被描述为“中级包管理器”,是 Debian 包管理系统的核心工具,负责包的安装、移除、配置以及管理已安装的包。它会在数据库中记录已安装包的信息,且能保证数据库状态的一致性,面对问题时表现出很强的健壮性。
与 APT 不同,dpkg 不负责包的获取,它期望包以 DEB 文件的形式存在或已安装在本地系统。dpkg 家族包含 dpkg、dpkg - deb 和 dpkg - query 三个工具,dpkg 整合了后两者的功能,其功能可分为四个部分:检查和操作 DEB 文件、安装包、查询包管理数据库、移除包。
#### 2. 处理二进制包
使用 dpkg - deb 可以从 DEB 文件中提取信息和数据。以下是一些常见操作:
- **打印包的控制信息**:
```bash
~$ dpkg - deb -- info postfix_2.1.5 - 1_i386.deb
```
- **获取单个字段信息**:
```bash
~$ dpkg - deb -- field postfix_2.1.5 - 1_i386.deb Version
2.1.5 - 1
```
- **提取包安装的文件信息**:
```bash
~$ dpkg - deb -- contents postfix_2.1.5 - 1_i386.deb
```
- **解包和创建 DEB 文件**:
```bash
~$ dpkg - deb -- control postfix_2.1.5 - 1_i386.deb
~$ dpkg - deb -- extract postfix_2.1.5 - 1_i386.deb.
~$ mkdir pfpkg
~$ mv -- target - directory = pfpkg DEBIAN etc usr var
~$ dpkg - deb -- build pfpkg
```
#### 3. 安装包
dpkg 安装包分两个阶段:解包和运行 postinst 控制脚本(配置阶段)。
- **解包**:
```bash
~# dpkg -- unpack postfix_2.1.5 - 1_i386.deb
```
解包步骤如下:
1. 验证包为 Debian 包后,将控制信息提取到临时位置。
2. 运行 preinst 脚本(如果存在)。
3. 将 conffiles 文件列表中的文件提取到临时目录,并移动到 /etc 下,添加 .dpkg - new 扩展名。
4. 解包数据 tarball 到系统根目录。
5. 将控制文件放到 /var/lib/dpkg/info 目录,文件名前加上包名和点。
6. 在包数据库中将包标记为“已解包”。
- **配置包**:
```bash
~# dpkg -- configure postfix
```
配置步骤如下:
1. 咨询管理员对有本地修改的配置文件的处理方式。
2. 运行 postinst 脚本(如果存在),若使用 debconf,会运行 config 脚本获取用户参数。
3. postinst 文件处理系统更改,如创建设备节点和用户,启动服务。
4. 在包数据库中将包标记为“已安装”。
也可以一次性配置所有未配置的包:
```bash
~# dpkg -- configure - a
```
#### 4. 配置文件处理
包中的文件分为由 dpkg 管理的普通文件和配置文件(conffiles)。配置文件处理方式如下:
1. 解包时,给配置文件添加 .dpkg - new 扩展名。
2. 配置时,检查配置文件是否有修改,若有,管理员选择覆盖或保留。
3. 保留本地文件时,新配置文件重命名为 .dpkg - dist 扩展名。
4. 替换本地文件时,原文件添加 .dpkg - old 扩展名作为备份。
例如:
```bash
~# dpkg -- unpack abcde_2.0.3 - 1_all.deb
~# ls - F /etc/abcde.conf*
/etc/abcde.conf
/etc/abcde.conf.dpkg - new
~# dpkg -- configure abcde
```
识别配置文件更改的伪代码如下:
```plaintext
Mp <= 上一版本包中配置文件的存储 MD5 总和
Mn <= 从包中提取的新配置文件的 MD5 总和
Ml <= 本地安装的配置文件的 MD5 总和
if Mn != Mp
then: # 维护者提供了新文件
if Ml != Mp:
then: # 管理员进行了本地更改
A <= 管理员期望的操作
if A == install
then: # 管理员选择替换文件
安装新的配置文件版本
end if
else: # 本地文件未更改
安装新的配置文件版本
end if
let Mp = Mn # 使新版本成为下一个上一版本
else: # 新包未更新文件
不做任何操作
end if
```
#### 5. 与包数据库交互
包数据库存储在 /var/lib/dpkg 目录下,包含多个文件,存储了包的状态、控制信息、替代数据库、权限覆盖数据库等。
- **获取已安装包列表**:
```bash
~$ dpkg -- list
```
输出的每行开头三列显示包的状态,第一列表示用户期望的状态,第二列表示包的当前状态,第三列表示错误条件。
| 字母 | 状态 |
| --- | --- |
| u.. | *未知 |
| i.. | 安装 |
| r.. | 卸载 |
| p.. | 清除 |
| h.. | 保留 |
| .n. | 未安装 |
| .i. | 已安装 |
| .c. | 配置文件 |
| .u. | 已解包 |
| .f. | 半配置 |
| .h. | 半安装 |
| ..h | *保留 |
| ..r | 需要重新安装 |
| ..x | 需要重新安装 & *保留 |
| .. | 正常(第三列空)
0
0
复制全文
相关推荐










