第 6/30 天
一、引言
在 Ubuntu 系统中,安装、更新和卸载软件是最常见的操作之一。然而,Ubuntu 生态中并存着多种包管理工具:传统且强大的 apt/dpkg、Ubuntu 力推的 snap、以及跨发行版的 flatpak。很多初学者面对 apt install、snap install、flatpak install 时常常困惑——到底该用哪个?它们之间有什么区别?什么时候该用 apt,什么时候该用 snap?
本文将从技术原理、命令行操作、实际场景三个维度,全面对比 Ubuntu 的四大包管理工具,帮助你做出最优选择。
二、核心概念
2.1 四大包管理工具概览
| 工具 | 底层格式 | 依赖管理 | 沙箱隔离 | 包来源 | 典型场景 |
|---|---|---|---|---|---|
| dpkg | .deb | 不自动解决依赖 | 无 | 本地 .deb 文件 | 安装离线下载的 .deb 包 |
| apt | .deb | 自动解决依赖 | 无 | 远程仓库(PPA/官方源) | 系统核心组件、CLI 工具、库 |
| snap | .snap | 捆绑所有依赖 | 严格沙箱(AppArmor) | Snap Store | 跨发行版桌面应用、IoT 设备 |
| flatpak | .flatpak | 捆绑依赖 + runtime | 沙箱(Bubblewrap) | Flathub | 桌面 GUI 应用、游戏 |
2.2 依赖关系层级
用户应用程序
/ |
apt snap flatpak
| | |
.deb .snap .flatpak
| | |
apt-get snapd flatpakd
| | |
dpkg squashfs ostree
| | |
系统库 运行时 运行时
2.3 核心差异速览
apt:Ubuntu 的默认包管理器,基于 Debian 的 .deb 格式。它从远程仓库下载软件包并自动解决依赖关系,是系统级工具和库的首选。
dpkg:apt 的底层工具,直接操作 .deb 文件,但不会自动处理依赖。通常只在安装本地 .deb 文件或修复损坏的包时直接使用。
snap:Canonical(Ubuntu 的母公司)开发的容器化包格式。每个 snap 包捆绑了所有依赖,运行在 AppArmor 沙箱中,自动更新。Ubuntu 软件中心默认展示的许多应用都是 snap 格式。
flatpak:由 Red Hat 主导的跨发行版包格式,主要面向桌面 GUI 应用。它也使用沙箱隔离,但通过 Flathub 仓库分发,不依赖特定发行版。
三、实战步骤
3.1 apt 命令完全指南
apt 是 Ubuntu 系统中使用最频繁的包管理工具,以下是最常用的命令组合:
# 更新包索引(从仓库拉取最新包列表)
sudo apt update
# 升级所有已安装的包(不删除已安装的包)
sudo apt upgrade
# 全面升级(可能删除或安装新包来解决依赖变化)
sudo apt full-upgrade
# 安装指定包
sudo apt install nginx htop curl
# 卸载包(保留配置文件)
sudo apt remove nginx
# 彻底卸载(删除配置文件)
sudo apt purge nginx
# 自动清理不再需要的依赖包
sudo apt autoremove
# 搜索可用包
apt search "web server"
# 显示包详细信息
apt show nginx
# 列出已安装的包
apt list --installed | head -20
输出示例(apt show nginx):
Package: nginx
Version: 1.24.0-2ubuntu7
Priority: optional
Section: web
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian Nginx Maintainers <nginx-maint@lists.aliyuncs.com>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 852 kB
Depends: nginx-core (= 1.24.0-2ubuntu7) | nginx-extras (= 1.24.0-2ubuntu7)
Homepage: https://nginx.org
Download-Size: 32.5 kB
APT-Manual-Installed: yes
Description: small, powerful, scalable web/proxy server
3.2 dpkg 本地包管理
当需要安装从官网下载的 .deb 文件(如 VS Code、Google Chrome)时,dpkg 是直接工具:
# 安装本地 .deb 文件
sudo dpkg -i ~/下载/code_1.91.0_amd64.deb
# 如果 dpkg 报依赖错误,用 apt 修复
sudo apt --fix-broken install
# 列出所有已安装的包
dpkg -l | grep -i "nginx"
# 查询某个文件属于哪个包
dpkg -S /usr/bin/curl
# 查看包是否已安装
dpkg -l | grep curl
# 仅提取 .deb 包内容而不安装
dpkg --contents ~/下载/code_1.91.0_amd64.deb
关键技巧:dpkg -i 安装时如果提示依赖缺失,不要反复尝试,应直接运行 sudo apt --fix-broken install 让 apt 自动处理缺失的依赖。
3.3 snap 包管理
snap 是 Ubuntu 的原生容器化包格式,自动更新且沙箱隔离:
# 安装 snapd(Ubuntu 22.04+ 默认已安装)
sudo apt install snapd
# 安装 snap 应用
sudo snap install lxd
sudo snap install core
sudo snap install hello-world
# 列出已安装的 snap
snap list
# 查找可用 snap
snap find "code editor"
# 查看 snap 详细信息
snap info lxd
# 更新 snap
sudo snap refresh
# 单独更新某个 snap
sudo snap refresh lxd
# 回滚到上一个版本
sudo snap revert lxd
# 禁用自动更新(不推荐,但有时需要)
sudo snap set system refresh.hold="$(date -d '+30 days' +%Y-%m-%dT%H:%M:%S%:z)"
# 删除 snap 包
sudo snap remove lxd
snap 的通道机制:每个 snap 包有多个发布通道(stable/candidate/beta/edge),可以按需切换:
# 切换到 beta 通道
sudo snap switch lxd --channel=beta
# 从特定通道安装
sudo snap install lxd --channel=stable
3.4 flatpak 跨发行版方案
flatpak 特别适合桌面 GUI 应用,通过 Flathub 仓库分发:
# 安装 flatpak
sudo apt install flatpak
# 添加 Flathub 仓库(核心步骤)
sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
# 搜索应用
flatpak search "gimp"
# 安装应用
flatpak install flathub org.gimp.GIMP
# 运行应用
flatpak run org.gimp.GIMP
# 列出现有运行时
flatpak list --runtime
# 更新所有应用
flatpak update
# 列出已安装的 flatpak 应用
flatpak list
# 卸载应用
flatpak uninstall org.gimp.GIMP
# 清理未使用的运行时
flatpak uninstall --unused
flatpak 与 snap 的沙箱对比:
| 特性 | snap | flatpak |
|---|---|---|
| 沙箱机制 | AppArmor + seccomp | Bubblewrap (user ns) |
| 权限控制 | 通过 snap interfaces 声明 | 通过 Flatpak permissions 声明 |
| 自动更新 | 默认开启,不可关闭 | 通过 systemd timer 更新 |
| 运行时尺寸 | 较小(共享 core) | 较大(Freedesktop/GNOME/KDE runtime) |
| 命令行友好 | 优秀,适合 CLI 和 daemon | 主要面向 GUI 应用 |
3.5 四者混合使用的 Python 巡检脚本
以下脚本可以帮你快速了解当前系统的包管理状态:
#!/usr/bin/env python3
"""Ubuntu 包管理状态巡检脚本"""
import subprocess
import json
def run_cmd(cmd):
try:
result = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=30)
return result.stdout.strip()
except:
return "N/A"
print("=" * 60)
print("Ubuntu 包管理状态报告")
print("=" * 60)
# apt 统计
apt_count = run_cmd("dpkg -l 2>/dev/null | grep '^ii' | wc -l")
print(f"n📦 apt/dpkg 已安装包数: {apt_count}")
# 检查 apt 是否有可更新包
apt_updates = run_cmd("apt list --upgradable 2>/dev/null | grep -c upgradable || true")
print(f"📦 apt 可更新包数: {apt_updates}")
# snap 统计
snap_list = run_cmd("snap list 2>/dev/null | tail -n +2 | wc -l")
print(f"🔵 snap 已安装包数: {snap_list}")
# 检查 snap 更新
snap_refresh = run_cmd("snap refresh --list 2>/dev/null | tail -n +2 | wc -l")
print(f"🔵 snap 可更新包数: {snap_refresh}")
# flatpak 统计
flatpak_list = run_cmd("flatpak list --app 2>/dev/null | wc -l")
print(f"🟢 flatpak 已安装应用数: {flatpak_list}")
# 磁盘占用
dpkg_size = run_cmd("du -sh /var/lib/dpkg/ 2>/dev/null | cut -f1")
snap_size = run_cmd("du -sh /var/lib/snapd/ 2>/dev/null | cut -f1")
flatpak_size = run_cmd("du -sh /var/lib/flatpak/ 2>/dev/null | cut -f1")
print(f"n💾 磁盘占用:")
print(f" dpkg 数据库: {dpkg_size}")
print(f" snapd 数据: {snap_size}")
print(f" flatpak 数据: {flatpak_size}")
print("n" + "=" * 60)
运行示例:
============================================================
Ubuntu 包管理状态报告
============================================================
📦 apt/dpkg 已安装包数: 1245
📦 apt 可更新包数: 8
🔵 snap 已安装包数: 3
🔵 snap 可更新包数: 0
🟢 flatpak 已安装应用数: 5
💾 磁盘占用:
dpkg 数据库: 62M
snapd 数据: 1.2G
flatpak 数据: 2.8G
============================================================
四、常见问题
Q1: 安装 .deb 包时提示「依赖不足,无法安装」怎么办?
# 尝试用 dpkg 安装后,立即用 apt 修复
sudo dpkg -i package.deb
sudo apt --fix-broken install -y
# 或者直接让 apt 安装本地 .deb(自动处理依赖)
sudo apt install ./package.deb
推荐方案:直接使用 sudo apt install ./package.deb,apt 会自动从仓库下载缺失的依赖。这是最省心的方式。
Q2: snap 应用启动慢,如何优化?
snap 应用第一次启动确实较慢,因为需要解压 squashfs 镜像。以下方法可以改善:
# 1. 预先加载 snap 的运行时
sudo snap run --shell <app-name> -c "exit"
# 2. 如果不需要沙箱隔离,选择 apt 版本
# 例如:安装 apt 版本的 Firefox 替代 snap 版本
sudo snap remove firefox
sudo add-apt-repository ppa:mozillateam/ppa
sudo apt install firefox
# 3. 增加系统内存,或使用 SSD 硬盘
Q3: flatpak 安装的应用无法读取 ~/Downloads 等目录?
flatpak 默认沙箱严格隔离文件系统,需要手动授予权限:
# 使用 flatseal 图形化管理权限
flatpak install flathub com.github.tchx84.Flatseal
# 或命令行授予权限
# 允许访问主目录
sudo flatpak override --filesystem=home org.gimp.GIMP
# 允许访问 Downloads
sudo flatpak override --filesystem=~/Downloads org.gimp.GIMP
# 重置所有权限
sudo flatpak override --reset org.gimp.GIMP
Q4: apt update 时提示「Release file expired」或 GPG 错误?
# 1. 同步系统时间
sudo timedatectl set-ntp true
# 2. 添加缺失的 GPG 密钥(以 Docker 为例)
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7EA0A9C3F273FCD8
# 3. 或使用新的 signed-by 方式
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
# 4. 清理缓存后重试
sudo apt clean
sudo apt update
Q5: 如何选择最合适的包管理工具?
| 场景 | 推荐工具 | 原因 |
|---|---|---|
| 系统工具(git, curl, nginx) | apt | 与系统集成最好,性能最优 |
| 桌面 GUI 应用(GIMP, Inkscape) | flatpak 或 snap | 沙箱隔离,不影响系统库 |
| IDE 和开发工具(VS Code, JetBrains) | 官方 .deb 或 snap | 版本更新频繁,snap 自动更新 |
| 需要严格控制的 CLI 工具 | apt | 版本锁定更灵活 |
| 服务器端应用 | apt | 更小的磁盘占用,更快的启动 |
| 跨发行版分发 | snap 或 flatpak | 不依赖特定发行版包格式 |
五、总结
本文全面对比了 Ubuntu 的四大包管理工具,核心要点如下:
- apt 是 Ubuntu 的主力包管理器,适用于绝大多数系统级工具和库,优先使用它
- dpkg 是底层工具,主要用于安装本地 .deb 文件,记得配合
apt --fix-broken install解决依赖 - snap 是 Canonical 主推的容器化格式,自动更新且沙箱隔离,适合桌面应用,但注意启动速度和磁盘占用
- flatpak 是跨发行版的桌面应用方案,通过 Flathub 分发,沙箱更加灵活,适合 GUI 应用
- 实际使用中不是非此即彼——一个系统可以同时使用 apt、snap、flatpak,根据具体场景选择最合适的工具
下期预告
第 7 天我们将深入 文件与文本操作,从基础命令 ls、cp、mv 到强大的文本处理三剑客 grep、sed、awk,全面掌握 Linux 文件操作的艺术。
📚 系列目录
- 第 1 天:Ubuntu 简介与版本选择
- 第 2 天:手把手安装 Ubuntu
- 第 3 天:Ubuntu 桌面环境初探
- 第 4 天:Ubuntu 终端基础
- 第 5 天:用户与权限管理
- 第 6 天:软件包管理 ← 本文
- 第 7 天:文件与文本操作(预告)















暂无评论内容