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系统的系统包、库和服务至关重要。

关于其他包管理器:

每个包管理器都有其优势。使用APT管理系统包和依赖项,使用Snap实现跨版本兼容性和自动更新,使用Flatpak管理带有细粒度权限的桌面应用。


APT包管理 - 详细指南

理解APT与apt-get

APT(apt) - 现代选择

在Ubuntu 14.04中引入,apt结合了apt-getapt-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还支持 SnapFlatpak 用于通用应用打包:

  • 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 以确保你使用的是最新的包信息!

有用的链接

本网站的相关文章