1. dpkg基础
dpkg 是 Debian / Ubuntu 系列 Linux 发行版的底层软件包管理工具 , 用来处理 .deb 格式软件包 , 相当于RHEL/CentOS 体系中的 rpm 命令。
dpkg 只能操作本地 deb 文件 , 本身不具备联网能力 , 不会自动下载依赖包。上层工具 apt 就是基于 dpkg 封装 , 负责联网拉取仓库元数据、自动解析并下载依赖 , 最后调用 dpkg 完成软件安装。因此dkpg命令安装依赖包的顺序和yum一样
成
dpkg 由 3 大部分构成 :
dpkg可执行程序 : 主程序 , 解析deb包、执行安装 / 卸载、调用脚本deb包 : 软件归档包(ar归档 ,debian-binary、control.tar.gz、data.tar.*)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, libssl3Status字段 :install ok installed即ii正常安装一旦
status损坏 ,dpkg/apt全部无法工作。/var/lib/dpkg/available记录仓库里所有可用的软件包(不是本机已安装)。
apt update会更新这个文件 ;apt检索候选版本时读取。/var/lib/dpkg/info每个软件包对应一组文件 , 文件名格式:
包名.后缀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里的包信息
数据库维护动作
其他动作
3.2选项说明
通用选项 ,可以搭配上面任意
action使用
--force强制系列选项不推荐日常使用 , 容易破坏系统 , 仅特殊故障修复场景
示例
# 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 -adpkg 提示锁占用
# 不推荐直接删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