Ubuntu 软件包管理:APT 和 dpkg 快速参考指南
Ubuntu 软件包必备的 APT 与 dpkg 命令
Ubuntu的包管理 系统是软件安装和维护的骨干,对于任何Linux用户或系统管理员来说都是必不可少的知识。
此图像由 AI模型Flux 1 dev 生成。
什么是APT包管理?
APT(高级包工具) 是Ubuntu的主要包管理系统,继承自Debian。它是一个强大的命令行工具,用于安装、升级和删除软件包。APT会自动处理依赖关系,连接到Ubuntu的官方仓库,并且是管理Ubuntu和基于Debian的发行版系统包的传统方法。如果你是Ubuntu的新用户,请查看我们的指南 如何安装Ubuntu 24.04和有用的工具,以开始使用配置良好的系统。
主要特点:
- 原生支持Ubuntu/Debian:内置,无需额外安装
- 共享库:通过共享系统依赖提高磁盘使用效率
- 手动更新:你可以控制何时更新软件包
- 无沙箱:软件包具有完整的系统访问权限(适合系统工具)
- 轻量级:没有后台守护进程,仅在调用时运行
- 成熟的生态系统:数十年的发展,极其稳定
包管理器比较
Ubuntu支持多种包管理系统。以下是主要操作的比较:
| 操作 | APT | Snap | Flatpak |
|---|---|---|---|
| 搜索 | apt search keyword |
snap find keyword |
flatpak search keyword |
| 安装 | sudo apt install package |
sudo snap install package |
flatpak install flathub app.id |
| 列出已安装 | apt list --installed |
snap list |
flatpak list --app |
| 显示信息 | apt show package |
snap info package |
flatpak info app.id |
| 更新所有 | sudo apt update && sudo apt upgrade |
sudo snap refresh |
flatpak update |
| 更新单个 | sudo apt install --only-upgrade pkg |
sudo snap refresh package |
flatpak update app.id |
| 删除 | sudo apt remove package |
sudo snap remove package |
flatpak uninstall app.id |
| 清理 | sudo apt autoremove |
snap remove --revision=N |
flatpak uninstall --unused |
| 仓库 | /etc/apt/sources.list |
Snap Store(内置) | 使用 flatpak remote-add 添加 |
快速功能比较
| 功能 | APT | Snap | Flatpak |
|---|---|---|---|
| 自动更新 | 否 | 是 | 否 |
| 沙箱 | 否 | 是 | 是 |
| 依赖 | 系统库 | 打包 | 共享运行时 |
| 包大小 | 小(5-50MB) | 大(50-500MB) | 中(20-200MB) |
| 需要root权限 | 是 | 是 | 否(用户安装) |
| 启动速度 | 快 | 较慢 | 快 |
| 最适合 | 系统包 | 通用应用 | 桌面应用 |
关于本指南
本指南聚焦于APT(apt/apt-get/dpkg) - Ubuntu的传统包管理系统。APT对于管理Ubuntu和基于Debian系统的系统包、库和服务至关重要。
关于其他包管理器:
- 📦 Snap包管理器指南 - 带有自动更新和沙箱的通用包
- 📦 Flatpak包管理器指南 - 带有细粒度权限的跨发行版桌面应用
每个包管理器都有其优势。使用APT管理系统包和依赖项,使用Snap实现跨版本兼容性和自动更新,使用Flatpak管理带有细粒度权限的桌面应用。
APT包管理 - 详细指南
理解APT与apt-get
APT(apt) - 现代选择
在Ubuntu 14.04中引入,apt结合了apt-get和apt-cache的功能,并增强了用户体验:
优点:
- 进度条和彩色输出
- 更直观的命令
- 更清晰的人类可读输出
- 结合了多种工具的功能
使用场景: 每日交互式命令行操作
apt-get - 传统选择
原始的包管理工具,仍然被广泛使用:
优点:
- 更稳定的API(更适合脚本)
- 向后兼容性
- 可预测的输出格式
- 更细粒度的控制
使用场景: Shell脚本、自动化、遗留系统
专业提示: 为了更快的终端导航和工作流程效率,请查看我们的 Ubuntu键盘快捷键速查表,以在管理包时提高生产力。
必备的包管理命令
更新包列表
在安装或升级之前,始终更新包列表:
# 更新包索引
sudo apt update
# 或使用apt-get
sudo apt-get update
此命令会从配置的仓库中刷新本地数据库,获取可用包及其版本的信息。
安装包
基本安装:
# 安装单个包
sudo apt install package-name
# 安装多个包
sudo apt install package1 package2 package3
# 安装特定版本
sudo apt install package-name=version-number
示例:
# 安装Nginx Web服务器
sudo apt install nginx
# 安装Python和pip
sudo apt install python3 python3-pip
# 安装构建工具
sudo apt install build-essential
# 安装系统监控工具
sudo apt install htop
对于专门的监控需求,例如在带有NVIDIA显卡的系统上跟踪GPU性能,请查看我们的指南 Linux/Ubuntu中的GPU监控应用。
无需提示安装(适用于脚本):
sudo apt install -y package-name
# 或
sudo DEBIAN_FRONTEND=noninteractive apt install -y package-name
从.deb文件安装:
# 方法1:使用apt(推荐,处理依赖)
sudo apt install ./package.deb
# 方法2:使用dpkg
sudo dpkg -i package.deb
sudo apt install -f # 修复缺失的依赖
注意: 在处理下载的.deb文件时,你可能想要使用一个带有良好上下文菜单的文件管理器。请查看我们的 Ubuntu 24.04文件管理器比较(Nautilus vs Nemo vs Dolphin vs Caja),以找到适合你工作流程的一个。
升级包
升级已安装的包:
# 升级所有包(安全,不会删除包)
sudo apt upgrade
# 升级特定包
sudo apt install --only-upgrade package-name
# 完全升级(可能删除包以解决依赖)
sudo apt full-upgrade
# 发行版升级(用于主要版本更新)
sudo apt dist-upgrade
完整的更新序列:
# 推荐的更新流程
sudo apt update
sudo apt upgrade -y
sudo apt autoremove
sudo apt autoclean
升级Ubuntu版本:
# 从LTS升级到下一个LTS
sudo do-release-upgrade
# 任意版本升级
sudo do-release-upgrade -d
列出包
列出已安装的包:
# 所有已安装的包
apt list --installed
# 使用grep过滤
apt list --installed | grep package-name
# 统计已安装的包数量
apt list --installed | wc -l
# 使用dpkg
dpkg -l
dpkg --list
dpkg -l | grep package-name
列出可升级的包:
# 显示有可用更新的包
apt list --upgradable
# 详细升级模拟
apt list --upgradable -a
列出所有可用的包:
# 所有仓库中的包
apt list
# 列出特定仓库中的包
apt list | grep "source-name"
搜索包
搜索包名和描述:
# 使用apt搜索
apt search keyword
# 不区分大小写搜索
apt search -i keyword
# 仅显示包名
apt-cache search keyword
# 仅搜索包名(更快)
apt-cache search --names-only keyword
示例:
# 搜索编辑器
apt search text editor
# 搜索数据库
apt search database
# 搜索Python包
apt search python | grep python3
查看包信息
详细包信息:
# 显示包详情
apt show package-name
# 使用apt-cache
apt-cache show package-name
# 显示包依赖
apt-cache depends package-name
# 显示反向依赖
apt-cache rdepends package-name
# 检查包策略和版本
apt-cache policy package-name
# 显示包统计
apt-cache stats
检查包是否已安装:
# 方法1
dpkg -s package-name
# 方法2
dpkg -l package-name
# 方法3
apt list --installed package-name
# 方法4(如果安装,退出码为0)
dpkg-query -W package-name
删除包
删除包:
# 删除包(保留配置文件)
sudo apt remove package-name
# 删除包和配置文件(清除)
sudo apt purge package-name
# 删除依赖
sudo apt autoremove package-name
# 完全删除包和配置
sudo apt purge package-name && sudo apt autoremove
清理系统:
# 删除未使用的依赖
sudo apt autoremove
# 删除并清除
sudo apt autoremove --purge
# 删除下载的包文件
sudo apt clean
# 删除旧版本的包
sudo apt autoclean
检查磁盘使用情况:
# 检查缓存大小
du -sh /var/cache/apt/archives
# 检查总包大小
dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -n
包锁定(防止升级)
锁定包:
# 锁定包在当前版本
sudo apt-mark hold package-name
# 解除锁定
sudo apt-mark unhold package-name
# 显示锁定包
apt-mark showhold
# 锁定多个包
sudo apt-mark hold package1 package2 package3
使用场景: 防止特定软件版本自动升级。
使用dpkg - 低级包工具
dpkg是APT使用的底层包管理器:
基本dpkg命令:
# 安装包
sudo dpkg -i package.deb
# 删除包
sudo dpkg -r package-name
# 清除包
sudo dpkg -P package-name
# 列出已安装的包
dpkg -l
# 列出包中的文件
dpkg -L package-name
# 查找哪个包拥有文件
dpkg -S /path/to/file
# 检查包状态
dpkg -s package-name
# 重新配置包
sudo dpkg-reconfigure package-name
# 验证包完整性
dpkg -V package-name
修复损坏的包:
# 重新配置损坏的包
sudo dpkg --configure -a
# 修复缺失的依赖
sudo apt install -f
# 强制重新安装
sudo apt install --reinstall package-name
仓库管理
查看仓库
查看配置的仓库:
# 查看源列表
cat /etc/apt/sources.list
# 查看附加源
ls /etc/apt/sources.list.d/
# 查看所有启用的仓库
grep -r --include '*.list' '^deb ' /etc/apt/
添加仓库
添加PPA(个人包存档):
# 添加PPA仓库
sudo add-apt-repository ppa:user/ppa-name
sudo apt update
# 示例:添加Git PPA
sudo add-apt-repository ppa:git-core/ppa
sudo apt update
sudo apt install git
手动添加仓库:
# 将仓库添加到sources.list
echo "deb http://repository-url distribution component" | sudo tee -a /etc/apt/sources.list.d/custom.list
# 添加GPG密钥
wget -qO - https://example.com/key.gpg | sudo apt-key add -
# 更新包列表
sudo apt update
现代密钥管理(Ubuntu 22.04+):
# 下载并添加密钥到密钥环
wget -qO - https://example.com/key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/custom.gpg
# 添加签名仓库
echo "deb [signed-by=/etc/apt/keyrings/custom.gpg] http://repo-url dist component" | sudo tee /etc/apt/sources.list.d/custom.list
删除仓库
# 删除PPA
sudo add-apt-repository --remove ppa:user/ppa-name
# 或删除列表文件
sudo rm /etc/apt/sources.list.d/ppa-name.list
# 更新
sudo apt update
替代包管理器
Ubuntu还支持 Snap 和 Flatpak 用于通用应用打包:
-
Snap:请参阅我们的全面 Snap包管理器指南 以获取有关安装、使用、通道、限制和故障排除的详细信息。
-
Flatpak:请参阅我们的全面 Flatpak包管理器指南 以获取有关安装、Flathub、权限、运行时和管理的详细信息。
高级包管理
模拟操作(干运行)
# 模拟安装
apt install -s package-name
# 模拟升级
apt upgrade -s
# 显示将安装的内容
apt-cache showpkg package-name
下载包而不安装
# 仅下载包
apt download package-name
# 下载并包含依赖
apt install --download-only package-name
# 下载到特定目录
cd /path/to/dir
apt download package-name
查找包文件
# 哪个包提供文件
dpkg -S /path/to/file
# 在包中搜索文件(包括未安装的)
apt-file search filename
# 安装apt-file
sudo apt install apt-file
sudo apt-file update
包锁定
创建 /etc/apt/preferences 以控制包版本:
# 锁定包到特定版本
sudo nano /etc/apt/preferences
添加:
Package: package-name
Pin: version 1.2.3*
Pin-Priority: 1001
检查包漏洞
# 检查安全更新
sudo apt list --upgradable | grep security
# 检查特定包的CVE
apt-cache policy package-name
常见问题排查
修复损坏的包
# 方法1:修复依赖
sudo apt install -f
# 方法2:重新配置包
sudo dpkg --configure -a
# 方法3:清理并更新
sudo apt clean
sudo apt update
sudo apt upgrade
# 方法4:强制修复
sudo apt --fix-broken install
修复“锁定”数据库
# 删除锁定文件(仅当没有运行apt进程时!)
sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/lib/dpkg/lock
sudo rm /var/cache/apt/archives/lock
sudo dpkg --configure -a
首先检查运行中的进程:
ps aux | grep -i apt
sudo lsof /var/lib/dpkg/lock-frontend
哈希总和不匹配错误
# 清理缓存并重试
sudo apt clean
sudo rm -rf /var/lib/apt/lists/*
sudo apt update
GPG/密钥错误
# 重新添加密钥
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys KEY_ID
# 或下载密钥
wget -qO - https://repo-url/key.gpg | sudo apt-key add -
# 现代方法(Ubuntu 22.04+)
wget -qO - https://repo-url/key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/repo.gpg
未满足的依赖
# 尝试aptitude(更好的依赖解析器)
sudo apt install aptitude
sudo aptitude install package-name
# 或手动解析
sudo apt install package-name package-dependency
仓库未找到(404)
# 更新到正确的仓库
sudo nano /etc/apt/sources.list
# 更改旧的发行版名称为当前
# 或删除过时的PPA
sudo add-apt-repository --remove ppa:name/ppa
最佳实践
定期维护
每周例行:
#!/bin/bash
# 系统更新脚本
echo "更新包列表..."
sudo apt update
echo "升级包..."
sudo apt upgrade -y
echo "删除未使用的包..."
sudo apt autoremove -y
echo "清理包缓存..."
sudo apt autoclean
echo "更新完成!"
安全更新
自动更新安全补丁:
# 安装unattended-upgrades
sudo apt install unattended-upgrades
# 配置
sudo dpkg-reconfigure unattended-upgrades
# 编辑配置
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
服务器配置: 如果你正在管理Ubuntu服务器,正确的网络配置对于可靠的包下载和系统更新至关重要。学习 如何在Ubuntu服务器上更改静态IP地址,以确保包管理操作的稳定连接。
备份包列表
导出已安装的包:
# 创建备份
dpkg --get-selections > ~/package-list.txt
# 或导出显式安装的包
apt-mark showmanual > ~/manually-installed.txt
# 在另一台系统上恢复
sudo dpkg --set-selections < ~/package-list.txt
sudo apt-get dselect-upgrade
检查系统健康状况
# 检查损坏的依赖
sudo apt check
# 验证所有包
sudo debsums -c
# 检查系统日志
journalctl -xe | grep -i apt
tail -f /var/log/apt/history.log
性能优化
更快的包下载
启用并行下载:
编辑 /etc/apt/apt.conf.d/99parallel:
echo 'Acquire::Queue-Mode "host";' | sudo tee /etc/apt/apt.conf.d/99parallel
echo 'Acquire::http::Pipeline-Depth "5";' | sudo tee -a /etc/apt/apt.conf.d/99parallel
使用最快的镜像:
# 安装apt-fast
sudo add-apt-repository ppa:apt-fast/stable
sudo apt update
sudo apt install apt-fast
# 使用apt-fast代替apt
sudo apt-fast install package-name
减少缓存大小
# 限制缓存为100MB
echo 'APT::Archives::MaxSize "100";' | sudo tee /etc/apt/apt.conf.d/99max-cache
有用的包管理脚本
更新所有包管理器
#!/bin/bash
# 更新所有包管理器
echo "=== APT 更新 ==="
sudo apt update && sudo apt upgrade -y
echo "=== Snap 更新 ==="
sudo snap refresh
echo "=== Flatpak 更新 ==="
flatpak update -y
echo "所有系统已更新!"
查找大包
# 列出最大的已安装包
dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -nr | head -20
# 或更易读的格式
dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -nr | head -20 | awk '{printf "%.2f MB\t%s\n", $1/1024, $2}'
包审计
#!/bin/bash
# 包系统审计
echo "=== 系统包统计 ==="
echo "已安装包: $(dpkg -l | grep ^ii | wc -l)"
echo "可升级包: $(apt list --upgradable 2>/dev/null | grep -c upgradable)"
echo "锁定包: $(apt-mark showhold | wc -l)"
echo "自动可删除: $(apt autoremove --dry-run | grep -Po '^\d+')"
echo "缓存大小: $(du -sh /var/cache/apt/archives | cut -f1)"
快速参考速查表
必备命令:
# 更新与升级
sudo apt update && sudo apt upgrade -y
# 安装包
sudo apt install package-name
# 删除包
sudo apt remove package-name
# 搜索包
apt search keyword
# 显示包信息
apt show package-name
# 列出已安装
apt list --installed
# 清理系统
sudo apt autoremove && sudo apt autoclean
# 修复损坏的包
sudo apt install -f && sudo dpkg --configure -a
结论
掌握Ubuntu的包管理系统对于高效的系统管理至关重要。无论你是使用现代的apt命令进行交互式会话,使用apt-get进行脚本编写,还是探索使用Snap和Flatpak的通用包,理解这些工具将帮助你维护一个安全、最新且井井有条的Ubuntu系统。
从基本命令开始,逐步引入高级技巧,并始终保持系统更新。定期维护,结合最佳实践,确保Ubuntu体验的流畅和可靠。
专业提示: 在安装或升级包之前,始终运行 sudo apt update 以确保你使用的是最新的包信息!
有用的链接
- 官方Ubuntu文档
- APT用户指南
- Ubuntu包搜索
- Snap商店
- Flathub仓库
- Debian管理员手册
- Ubuntu服务器指南
- 手册页:
man apt,man apt-get,man dpkg