Linux dpkg命令

什么是dpkg命令?

dpkg(Debian Package)是Debian、Ubuntu等Debian系Linux发行版中的底层软件包管理工具。它直接操作.deb格式的软件包,负责安装、卸载、查询和管理Debian软件包。

注意: dpkg是底层的包管理工具,通常不自动处理依赖关系。对于日常使用,推荐使用apt或apt-get,它们会自动处理依赖。
dpkg与apt的关系: apt是高级包管理工具,负责从软件源获取包并自动解决依赖关系,然后调用dpkg来实际安装软件包。

语法格式

dpkg [选项] 动作
dpkg [选项] 动作 包文件

软件包状态说明

dpkg软件包有几种状态,了解这些状态对管理软件包很重要:

i - installed:软件包已正确安装
u - unpacked:软件包已解压但未配置
c - config-files:配置文件已安装但软件包已被删除
r - remove:软件包被标记为要删除,但配置文件仍保留

常用命令

命令 描述 示例
-i, --install 安装软件包 dpkg -i package.deb
-r, --remove 删除软件包但保留配置文件 dpkg -r packagename
-P, --purge 完全删除软件包和配置文件 dpkg -P packagename
-l, --list 列出已安装的软件包 dpkg -l
-L, --listfiles 列出软件包安装的文件 dpkg -L packagename
-s, --status 显示软件包状态 dpkg -s packagename
-S, --search 查找文件属于哪个软件包 dpkg -S /usr/bin/apt
-c, --contents 列出deb包中的内容 dpkg -c package.deb
-I, --info 显示deb包信息 dpkg -I package.deb
--configure 重新配置已解压的软件包 dpkg --configure packagename
--get-selections 获取软件包选择状态 dpkg --get-selections

安装软件包

安装本地.deb软件包:

# 安装单个软件包 sudo dpkg -i package.deb # 安装多个软件包 sudo dpkg -i package1.deb package2.deb

安装软件包并忽略依赖问题:

sudo dpkg -i --force-depends package.deb

注意:强制安装可能破坏系统依赖,请谨慎使用!

处理依赖问题:

# 安装过程中如果出现依赖错误 sudo dpkg -i package.deb # 可能会提示缺少依赖 # 使用apt修复依赖 sudo apt install -f # 然后重新配置软件包 sudo dpkg --configure -a

查询软件包

列出所有已安装的软件包:

# 列出所有已安装的包 dpkg -l # 使用grep过滤结果 dpkg -l | grep nginx # 列出特定架构的包 dpkg -l | grep ":amd64"

查看软件包状态:

# 查看软件包状态 dpkg -s nginx # 输出示例: # Package: nginx # Status: install ok installed # Priority: optional # Section: web # Version: 1.18.0-0ubuntu1

列出软件包安装的文件:

# 列出软件包安装的所有文件 dpkg -L nginx # 输出包括: # /usr/sbin/nginx # /etc/nginx/nginx.conf # /usr/share/doc/nginx

查找文件属于哪个软件包

查找特定文件所属的软件包:

# 查找文件属于哪个包 dpkg -S /usr/bin/apt # 输出:apt: /usr/bin/apt # 查找配置文件属于哪个包 dpkg -S /etc/nginx/nginx.conf # 可以使用通配符 dpkg -S /usr/bin/*.py

卸载软件包

删除软件包但保留配置文件:

# 删除软件包但保留配置文件 sudo dpkg -r nginx # 这将删除nginx但保留/etc/nginx/目录中的配置文件

完全删除软件包和配置文件:

# 完全删除软件包,包括配置文件 sudo dpkg -P nginx # 这将删除nginx及其所有配置文件

强制删除有问题的软件包:

# 强制删除有问题的包 sudo dpkg --remove --force-remove-reinstreq packagename

检查.deb包内容

查看.deb包的信息:

# 查看deb包信息 dpkg -I package.deb # 输出示例: # Package: nginx # Version: 1.18.0-0ubuntu1 # Architecture: amd64 # Maintainer: Ubuntu Developers # Installed-Size: 1024 # Depends: libc6, libssl1.1

列出.deb包中的文件:

# 列出deb包中的文件 dpkg -c package.deb # 输出示例: # drwxr-xr-x root/root 0 2023-01-01 00:00 ./usr/ # drwxr-xr-x root/root 0 2023-01-01 00:00 ./usr/sbin/ # -rwxr-xr-x root/root 1234567 2023-01-01 00:00 ./usr/sbin/nginx

重新配置软件包

重新配置已安装的软件包:

# 重新配置特定软件包 sudo dpkg-reconfigure nginx # 或者使用dpkg sudo dpkg --configure nginx

重新配置所有未配置的软件包:

# 重新配置所有未配置的包 sudo dpkg --configure -a

管理软件包选择状态

获取当前软件包选择状态:

# 获取所有软件包的选择状态 dpkg --get-selections # 输出示例: # nginx install # apache2 deinstall # mysql-server install

保存和恢复软件包选择状态:

# 保存当前软件包选择状态到文件 dpkg --get-selections > package-selections.txt # 从文件恢复软件包选择状态 sudo dpkg --set-selections < package-selections.txt # 然后安装标记为install的软件包 sudo apt-get dselect-upgrade

标记软件包为保留状态:

# 标记软件包为保留状态(不会被自动删除) sudo apt-mark hold nginx # 取消保留状态 sudo apt-mark unhold nginx # 查看被保留的软件包 sudo apt-mark showhold

修复损坏的软件包

修复损坏的软件包数据库:

# 清理损坏的包状态 sudo rm /var/lib/dpkg/status sudo cp /var/lib/dpkg/status-old /var/lib/dpkg/status # 或者重新创建状态文件 sudo dpkg --clear-avail sudo apt-get update

修复依赖问题:

# 修复损坏的依赖关系 sudo apt install -f # 或者 sudo apt --fix-broken install # 重新配置所有未配置的包 sudo dpkg --configure -a

高级用法

提取.deb包中的文件:

# 创建提取目录 mkdir extracted_package # 提取deb包到指定目录 dpkg -x package.deb extracted_package/ # 提取控制信息 dpkg -e package.deb extracted_package/DEBIAN

查看软件包的依赖关系:

# 查看软件包的依赖 dpkg -s nginx | grep Depends # 使用apt-cache查看更详细的依赖信息 apt-cache depends nginx # 查看反向依赖(哪些包依赖于此包) apt-cache rdepends nginx

常见问题

常见的解决方法:
1. 重新配置所有包:sudo dpkg --configure -a
2. 修复损坏的包:sudo apt install -f
3. 清理临时文件:sudo rm /var/lib/dpkg/lock*
4. 强制覆盖安装:sudo dpkg -i --force-overwrite /var/cache/apt/archives/problem-package.deb
5. 删除有问题的包:sudo dpkg -r --force-remove-reinstreq problematic-package

dpkg不自动解决依赖,需要手动处理:
1. 先修复依赖:sudo apt install -f
2. 使用apt安装缺失的依赖:sudo apt install missing-package
3. 或者使用gdebi工具自动安装依赖:sudo gdebi package.deb
4. 下载所有依赖包:apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances package | grep "^\w")

dpkg:
• 底层工具,直接操作.deb文件
• 不处理依赖关系
• 用于安装本地.deb包
• 查询已安装的包信息

apt/apt-get:
• 高级工具,工作在dpkg之上
• 自动处理依赖关系
• 从软件源下载和安装包
• 推荐用于日常使用

关系: apt从软件源获取包并解决依赖,然后调用dpkg进行实际安装。

常用选项

选项 描述
-i, --install 安装软件包
-r, --remove 删除软件包(保留配置)
-P, --purge 完全删除软件包(包括配置)
-l, --list 列出软件包
-L, --listfiles 列出软件包的文件
-s, --status 显示软件包状态
-S, --search 查找文件所属的包
-c, --contents 列出deb包内容
-I, --info 显示deb包信息
--configure 配置软件包
--get-selections 获取包选择状态
--set-selections 设置包选择状态
--force-all 强制操作(慎用)
--no-act 模拟操作,不实际执行

最佳实践

使用dpkg的最佳实践:

# 1. 先检查包信息再安装 dpkg -I package.deb # 2. 先检查包内容 dpkg -c package.deb # 3. 安装前检查依赖 dpkg -I package.deb | grep Depends # 4. 使用apt修复依赖 sudo apt install -f # 5. 定期清理不需要的包 sudo apt autoremove sudo apt autoclean
重要提醒:
1. dpkg不自动处理依赖,可能导致系统问题
2. 尽量使用apt/apt-get安装软件包
3. 只在安装本地.deb文件时使用dpkg
4. 不要强制安装(--force)除非你知道后果
5. 定期备份/var/lib/dpkg/status文件