Ubuntu 系统系列 | 第 6 天:软件包管理——apt、dpkg、snap、flatpak 全面对比与实践

第 6/30 天

一、引言

在 Ubuntu 系统中,安装、更新和卸载软件是最常见的操作之一。然而,Ubuntu 生态中并存着多种包管理工具:传统且强大的 apt/dpkg、Ubuntu 力推的 snap、以及跨发行版的 flatpak。很多初学者面对 apt installsnap installflatpak 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 的四大包管理工具,核心要点如下:

  1. apt 是 Ubuntu 的主力包管理器,适用于绝大多数系统级工具和库,优先使用它
  2. dpkg 是底层工具,主要用于安装本地 .deb 文件,记得配合 apt --fix-broken install 解决依赖
  3. snap 是 Canonical 主推的容器化格式,自动更新且沙箱隔离,适合桌面应用,但注意启动速度和磁盘占用
  4. flatpak 是跨发行版的桌面应用方案,通过 Flathub 分发,沙箱更加灵活,适合 GUI 应用
  5. 实际使用中不是非此即彼——一个系统可以同时使用 apt、snap、flatpak,根据具体场景选择最合适的工具

下期预告

第 7 天我们将深入 文件与文本操作,从基础命令 lscpmv 到强大的文本处理三剑客 grepsedawk,全面掌握 Linux 文件操作的艺术。


📚 系列目录

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容