1. dpkg基础

dpkg 是 Debian / Ubuntu 系列 Linux 发行版的底层软件包管理工具 , 用来处理 .deb 格式软件包 , 相当于RHEL/CentOS 体系中的 rpm 命令。

dpkg 只能操作本地 deb 文件 , 本身不具备联网能力 , 不会自动下载依赖包。上层工具 apt 就是基于 dpkg 封装 , 负责联网拉取仓库元数据、自动解析并下载依赖 , 最后调用 dpkg 完成软件安装。因此dkpg命令安装依赖包的顺序和yum一样

成

dpkg 由 3 大部分构成 :

  1. dpkg 可执行程序 : 主程序 , 解析 deb 包、执行安装 / 卸载、调用脚本

  2. deb 包 : 软件归档包(ar 归档 , debian-binary、control.tar.gz、data.tar.*)

  3. dpkg 数据库 : /var/lib/dpkg/ , 记录本机所有软件包状态 , dpkg 一切操作的核心

    /var/lib/dpkg/
    ├── status                # 核心:所有软件包状态、版本、依赖、描述
    ├── available             # 仓库可用包清单(apt update写入)
    ├── info/                 # 每个软件包独立的附属文件(脚本、配置清单、md5校验)
    ├── triggers/             # 触发器信息 , 包安装后触发其它软件动作
    ├── diversions            # 文件重定向 , 文件替换/改名机制
    ├── alternatives/         # 符号链接备选方案(update-alternatives 管理)
    ├── lock                  # 锁文件 , 防止多个dpkg/apt同时执行(并发保护)
    └── ...
    ​

2. dpkg数据库目录

  • /var/lib/dpkg/status

    文本文件 , 记录本机所有软件包信息。 每一个包一段 , 包含: 包名、版本、架构、安装状态、依赖关系、维护者、描述。

    Package: nginx
    Status: install ok installed
    Maintainer: Ubuntu Developers
    Version: 1.24.0-1ubuntu1
    Architecture: amd64
    Depends: libc6, libssl3

    Status字段 : install ok installed 即 ii 正常安装

    一旦 status 损坏 , dpkg/apt 全部无法工作。

  • /var/lib/dpkg/available

    记录仓库里所有可用的软件包(不是本机已安装)。

    apt update 会更新这个文件 ; apt 检索候选版本时读取。

  • /var/lib/dpkg/info

    每个软件包对应一组文件 , 文件名格式:包名.后缀

    文件

    作用

    xxx.list

    该包安装到系统的全部文件路径(dpkg -L读取这个文件)

    xxx.md5sums

    每个文件 md5 校验和 , 校验文件是否被篡改

    xxx.conffiles

    记录该包的配置文件列表 , dpkg -r时不删除这些文件

    xxx.preinst

    安装前脚本

    xxx.postinst

    安装后脚本

    xxx.prerm

    卸载前脚本

    xxx.postrm

    卸载后脚本

    dpkg -L nginx 本质就是读取 /var/lib/dpkg/info/nginx.list

  • /var/lib/dpkg/triggers

    触发器机制。 某些包安装完成后 , 需要触发其他软件执行动作。

    例: 安装 man 手册包 → 自动更新 man 索引 ; 安装字体包 → 更新字体缓存。

    触发器记录在这里 , dpkg 在包安装结束后统一处理。

  • /var/lib/dpkg/diversions

    文件转移机制。 可以把某个文件从默认路径重定向到别的位置 , 避免文件冲突。

    例如 A、B 两个包都提供同名文件 , 使用 diversions 规避冲突。

  • /var/lib/dpkg/alternatives``update-alternatives的配置 , 管理同一个命令的多个备选版本(例如多个 java 版本切换)。

  • /var/lib/dpkg/lock

    锁文件。 当 dpkg/apt 正在执行安装 / 卸载时 , 会持有这个锁 ; 防止多个包管理进程并发操作数据库 , 破坏数据。

3. 命令详解

  • 语法 : dpkg [选项] <动作> [包名/文件][包名/文件]

3.1 动作说明

安装软件包

  • -i : 安装本地deb包

  • --unpack : 仅解压 deb 包文件到系统 ,不运行配置脚本 , 不完成安装

  • --coinfigure : 对已经解压但未配置的包执行 postinst 配置脚本 , 修复中断安装

删除卸载类

  • -r : 删除软件主体, 保留配置文件

  • -p : 彻底清除, 软件+所有配置我呢见一并删除

查询查看类

  • -l ,--list : 列出所有包, 支持模式匹配

  • -L ,--listfiles : 列出已安装包在系统释放的所有文件路径

  • -s ,--status : 查看已安装包状态、版本、依赖、维护者、描述

  • -S ,--search : 反向检索 , 根据系统文件 , 查找所属软件包

  • -c ,--contents : 查看deb 文件内部的文件列表(包还没安装)

  • -I ,--info : 查看 deb 包元信息 , 版本、依赖、描述(未安装包)

  • -p ,--print-avail : 查看/var/lib/dpkg/available里的包信息

数据库维护动作

动作

说明

示例

--configure -a

批量配置所有半安装状态的包 , 修复安装中断

dpkg --configure -a

--audit

审计 , 查找缺失文件、损坏包

dpkg --audit

--clear-avail

清空 available 数据库(谨慎)

dpkg --clear-avail

--update-avail

更新 available 数据库

dpkg --update-avail Packages

其他动作

动作

说明

--get-selections

导出所有包的选中状态(备份包列表)dpkg --get-selections > pkg.list

--set-selections

导入包选择状态(批量恢复)dpkg --set-selections < pkg.list

3.2选项说明

  • 通用选项 ,可以搭配上面任意 action 使用

    参数

    全称

    说明

    -E

    --skip-same-version

    若 deb 版本与当前已安装版本完全一致 , 直接跳过安装

    -R

    --recursive

    递归目录 , 批量处理目录下所有 deb包 , dpkg -R --install ./debs/

    --no-act

    --dry-run

    模拟运行 , 只打印操作 , 不修改系统 , 测试用

    -D

    --debug=<flags>

    开启调试输出 , 数字越大日志越详细 , 排查 dpkg 脚本问题

    --root=<dir>

    指定根目录 , chroot 场景 , 在其他 root 环境操作包

    --log=<file>

    指定日志输出文件 , 默认日志 /var/log/dpkg.log

  • --force 强制系列选项

    不推荐日常使用 , 容易破坏系统 , 仅特殊故障修复场景

    参数

    说明

    --force-all

    开启全部强制选项 , 最强强制

    --force-overwrite

    强制覆盖系统已有文件

    --force-overwrite-dir

    覆盖目录

    --force-depends

    忽略依赖错误(强行安装 , 极易导致系统损坏)

    --force-remove-reinstreq

    强制卸载标记为必须重新安装的损坏包

示例

# 1. 安装本地deb
dpkg -i google-chrome-stable_current_amd64.deb
# 2. 依赖报错,修复依赖
sudo apt -f install
# 3. 查看是否装好
dpkg -l | grep chrome
# 4. 查看这个包安装的所有文件
dpkg -L google-chrome-stable
# 5. 查看某个文件归属哪个包
dpkg -S /usr/bin/chrome
# 6. 卸载(保留配置)
dpkg -r google-chrome-stable
# 7. 彻底删除(含配置)
dpkg -P google-chrome-stable
​
# 8. 查看包的完整状态(含配置状态)
dpkg --get-selections
​
# 9. 重新配置已安装的包
dpkg-reconfigure 包名       # 注意这是独立命令

故障处理常用命令

故障处理命令

sudo dpkg --configure -a

dpkg 提示锁占用

# 不推荐直接删lock,先确认无apt/dpkg进程
sudo fuser /var/lib/dpkg/lock-frontend

导出已安装包清单 , 迁移服务器

# 源主机导出
dpkg --get-selections > packages.txt
# 目标主机导入
dpkg --set-selections < packages.txt
apt dselect-upgrade
​

常用组合命令

批量安装目录下所有deb

dpkg -R --install ./packages/

查看deb包里有什么文件(未安装)

dpkg -c file.deb

查找哪个包提供/usr/bin/curl

dpkg -S /usr/bin/curl

模拟卸载, 不实际删除

dpkg --no-act -r nginx


熊熊