1.8 软件包管理

预计阅读时间:18 分钟

📖 目录

学习目标

学完本章后,你将能够:

  • 理解包管理器解决什么问题——依赖管理、版本追踪、安全更新
  • 使用 apt 搜索、安装、更新、卸载软件包
  • 理解 apt 和 dpkg 的分工
  • 配置软件源(sources.list)并理解 main/universe/multiverse/restricted 组件
  • 了解 Red Hat 系(dnf)和 Arch 系(pacman)包管理器的基本用法
  • 区分 Snap、Flatpak 和传统包管理的差异

核心知识

  • 包管理器(Package Manager)——自动处理软件安装、升级、配置和卸载的工具,核心解决"依赖地狱"问题
  • 依赖关系(Dependency)——软件包之间"我运行需要你先安装 A 和 B"的关系
  • 软件源(Repository)——存放软件包的远程服务器,apt 从 sources.list 中配置的源下载包
  • apt——Debian/Ubuntu 的 Advanced Package Tool(高级包工具),自动处理依赖
  • dpkg——Debian 底层包管理工具,直接操作 .deb 文件(不处理依赖)
  • PPA(Personal Package Archive)——Ubuntu 的第三方软件源,由个人或团队维护
  • Snap / Flatpak——沙箱化打包格式,跨发行版、自动更新、隔离运行

知识关联

原理讲解

1. 为什么需要包管理器——没有它之前的世界

在包管理器出现之前,安装 Linux 软件的方式是:

  1. 去网站下载源代码(tarball)
  2. 运行 ./configure && make && sudo make install
  3. 如果报错说"缺少 libfoo",去网上搜索 libfoo 的源码并重复步骤 1-2
  4. libfoo 可能需要 libbar… 无限递归

这就是著名的依赖地狱(Dependency Hell)。包管理器将其简化为一条命令:sudo apt install 软件名。它会自动:

  • 查看该软件依赖哪些其他包
  • 从软件源下载所有依赖和软件本身
  • 按依赖顺序依次安装
  • 记录已安装包的信息(用于后续更新和卸载)

包管理器为什么需要依赖解析?——底层原理

软件依赖本质上是一个有向无环图(DAG):每个包是一个节点,依赖关系是边。例如,nginx 依赖 pcre(正则库)和 zlib(压缩库),pcre 又依赖 libc。包管理器的依赖解析算法需要:

  1. 构建依赖图:从软件源的元数据(Packages.gz)中解析所有包的依赖声明
  2. 拓扑排序:确定安装顺序,确保被依赖的包先安装。例如必须先装 libc 再装 pcre
  3. 版本冲突检测:如果 A 依赖 B (>=2.0) 但系统已安装 B 1.5,需要升级 B 或拒绝安装 A
  4. 回溯搜索:当多个版本组合都满足约束时,选择最优解(如升级最少的包、避免引入新依赖)

这是一个 NP-hard 问题,现代包管理器(如 apt、dnf)使用启发式算法在合理时间内找到近似最优解。这就是为什么安装一个看似简单的包,apt 可能需要"思考"几秒钟。

apt vs dnf vs pacman——三大包管理器的设计差异

特性apt (Debian/Ubuntu)dnf (Fedora/RHEL)pacman (Arch)
包格式.deb (dpkg).rpm (rpm).pkg.tar.zst
依赖解析apt-get 后端libsolv (SAT 求解器)内置
软件源分组件(main/universe/restricted)按仓库分级(base/updates/epel)分 core/extra/community
缓存策略下载后安装,保留旧包下载后安装,保留旧包下载后安装,不保留旧包
更新策略保守(只修 bug)保守(企业级)滚动更新(始终最新)
适合场景服务器、桌面、初学者企业服务器、稳定性优先进阶用户、开发环境

为什么不同发行版用不同的包管理器? 这是历史和生态选择的结果:Debian 系选择了 .deb 格式和 apt,Red Hat 系选择了 .rpm 格式和 dnf/yum,Arch 选择了简洁的 pacman。每种选择都与其发行版的设计哲学一致——Debian 追求稳定,Fedora 追求新技术,Arch 追求简洁和最新。Snap 和 Flatpak 试图跨发行版统一包格式,但传统包管理器仍然是主流。

2. apt 与 dpkg——上层接口与底层工具

层面工具角色
用户接口apt推荐给用户的命令,操作直观,自动处理依赖
底层dpkg直接操作 .deb 包,不处理依赖(安装会报错 missing dependencies)
旧接口apt-getapt-cacheapt 的前身,功能更全但命令更多。apt 是两者的合并简化
# apt 日常操作(推荐用这些)
sudo apt update              # 更新软件源缓存(列出可用的最新版本)
# 输出: Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
# 输出: Reading package lists... Done
sudo apt upgrade             # 升级所有可升级的包
# 输出: Reading package lists... Done
# 输出: 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded
sudo apt full-upgrade        # 升级 + 必要时安装/卸载依赖
sudo apt install nginx       # 安装(apt 自动处理依赖)
# 输出: Reading package lists... Done
# 输出: The following NEW packages will be installed:
# 输出:   nginx
# 输出: 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
sudo apt remove nginx        # 卸载(保留配置文件)
# 输出: Reading package lists... Done
# 输出: The following packages will be REMOVED:
# 输出:   nginx
# 输出: 0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
sudo apt purge nginx         # 彻底卸载(删除配置文件)
sudo apt autoremove          # 清理不再需要的依赖包
# 输出: 0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
apt search "web server"      # 搜索软件包
# 输出: Sorting... Done
# 输出: Full Text Search... Done
# 输出: nginx/noble 1.24.0-2ubuntu7 amd64  small, powerful, scalable web/proxy server
apt show nginx               # 查看包详细信息
# 输出: Package: nginx
# 输出: Version: 1.24.0-2ubuntu7
# 输出: Priority: optional
# 输出: Section: web
apt list --installed         # 列出所有已安装包
# 输出: Listing... Done
apt list --upgradable        # 列出可升级的包
# 输出: Listing... Done

# dpkg 底层操作(较少用,但排查问题时有用)
dpkg -i package.deb          # 安装本地 .deb 文件
dpkg -r nginx                # 删除包
dpkg -L nginx                # 列出包安装的所有文件
# 输出: /.
# 输出: /etc
# 输出: /etc/nginx
# 输出: /usr/sbin/nginx
dpkg -S /bin/ls              # 查询文件属于哪个包
# 输出: coreutils: /bin/ls
dpkg --get-selections        # 查看所有已安装包(比 apt list 更原始)
⚠️ 用 apt install 而非 dpkg -i 安装 除非你下载了本地 .deb 文件,否则始终用 apt install 而不是 dpkg -i。dpkg 不做依赖解析——如果包有未满足的依赖,它会直接报错。如果你必须用 dpkg -i 安装本地包,之后用 sudo apt --fix-broken install 修复依赖。

3. apt update vs apt upgrade——理解这两步

初学者常问:"为什么每次安装前都要 apt update?"

  • apt update:从软件源下载包列表(描述有哪些包、有哪些版本、依赖什么)。相当于"浏览菜单"。
  • apt upgrade:根据最新列表,升级已安装的包。相当于"更新已点的菜到最新版"。
  • apt install:根据最新列表,安装新包。

apt update 只更新"菜单"(元数据),不下载或安装任何软件。它的缓存存储在 /var/lib/apt/lists/。所以:

# 标准流程(每次安装前建议都做)
sudo apt update
# 输出: Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
# 输出: Reading package lists... Done
sudo apt install 包名
# 输出: Reading package lists... Done
# 输出: The following NEW packages will be installed:
# 输出:   ...

# 系统升级流程(定期执行,比如每周一次)
sudo apt update
sudo apt upgrade -y        # -y 自动回答 yes,适合脚本
sudo apt autoremove -y     # 清理用不上的依赖

4. 软件源配置——/etc/apt/sources.list

Ubuntu 的软件源配置文件是 /etc/apt/sources.list(以及 /etc/apt/sources.list.d/ 目录下的额外源文件)。

# 查看当前源
cat /etc/apt/sources.list
# 输出: deb http://archive.ubuntu.com/ubuntu/ noble main universe
# 输出: deb http://security.ubuntu.com/ubuntu/ noble-security main universe

# 一行源格式:
deb http://archive.ubuntu.com/ubuntu/ noble main universe
# ↑  ↑                             ↑      ↑    ↑
# │  │                             │      │    └── 组件(main/universe/multiverse/restricted)
# │  │                             │      └── 发行版代号(noble = 24.04)
# │  │                             └── 镜像源 URL
# │  └── 类型:deb = 二进制包,deb-src = 源码包
# └── 归档类型

Ubuntu 源的四个组件(Components):

组件内容许可是否默认
main官方支持的免费开源软件开源
universe社区维护的开源软件开源
multiverse不满足自由软件定义的非自由软件(如专有解码器、专利格式工具)非开源
restricted专有驱动(如 NVIDIA 驱动)专有
# 添加 PPA(个人软件包存档)
sudo add-apt-repository ppa:neovim-ppa/stable
# 输出: Repository: 'deb https://ppa.launchpadcontent.net/neovim-ppa/stable/ubuntu noble main'
# 输出: Press [ENTER] to continue or Ctrl-c to cancel.
sudo apt update
# 输出: Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
# 输出: Get:2 https://ppa.launchpadcontent.net/neovim-ppa/stable noble InRelease
# 输出: Reading package lists... Done
sudo apt install neovim
# 输出: The following NEW packages will be installed:
# 输出:   neovim

# 添加第三方 APT 源(如 Docker)
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
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 $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update

5. 其他发行版的包管理器

发行版包管理器常用命令
Ubuntu / Debianaptapt install/remove/update/upgrade
Fedora / RHEL / Rockydnfdnf install/remove/update/search
Arch / Manjaropacmanpacman -Syu / -S / -R / -Qs
openSUSEzypperzypper install/remove/update/search
# dnf(Fedora/RHEL)——和 apt 非常相似
sudo dnf install nginx
# 输出: Dependencies resolved.
# 输出: Package       Arch   Version        Repository        Size
# 输出: Installing:   nginx  x86_64 1.24.0  fedora           1.2 M
sudo dnf remove nginx
sudo dnf update
# 输出: Last metadata expiration check: 0:30:00 ago
dnf search nginx
# 输出: Name Exactly Matched: nginx

# pacman(Arch)——命令简练,但选项需要记忆
sudo pacman -Syu        # 更新系统(-Syu = Sync + refresh + sysupgrade)
# 输出: :: Synchronizing package databases...
sudo pacman -S nginx    # 安装(-S = Sync)
sudo pacman -R nginx    # 卸载(-R = Remove)
sudo pacman -Rs nginx   # 卸载 + 删除依赖
pacman -Ss nginx        # 搜索(-Ss = Sync + search)
# 输出: extra/nginx 1.26.0-1  nginx [nginx] 轻量级 HTTP 服务器
pacman -Qi nginx        # 查看已安装包信息(-Qi = Query + info)
📝 发行版选择影响包管理器 如果你用的是 Ubuntu(本教程的默认选择),记住 apt 就够了。但如果切换到 Fedora 或 Arch,包管理器命令完全不同。幸运的是,apt installdnf installpacman -S 的概念和逻辑是一样的。

6. 从源码编译——没有包管理器时的后备方案

虽然包管理器解决了大多数需求,但有时你需要从源码编译软件(需要最新版本、或该软件不在软件源中)。典型的编译流程:

# 安装编译工具链
sudo apt install build-essential  # 包含 gcc, g++, make 等
# 输出: The following NEW packages will be installed:
# 输出:   build-essential g++ gcc make

# 通用三步编译法
wget https://example.com/software-1.0.tar.gz
# 输出: Resolving example.com... 93.184.216.34
# 输出: software-1.0.tar.gz  100%[===================>]  1.23M
tar -xzf software-1.0.tar.gz
cd software-1.0
./configure                    # 检查系统环境、生成 Makefile
# 输出: checking for gcc... gcc
# 输出: checking for C compiler default output... a.out
# 输出: configure: creating ./config.status
make                           # 编译源码
# 输出: gcc -O2 -c main.c
# 输出: gcc -O2 -c utils.c
# 输出: gcc -o program main.o utils.o
sudo make install              # 安装到系统目录(通常到 /usr/local/)
# 输出: install -d /usr/local/bin
# 输出: install -m 755 program /usr/local/bin/

从源码编译的软件会安装到 /usr/local/,不会与 apt 管理的包冲突。但卸载时需手动操作(通常在源码目录中运行 sudo make uninstall,但前提是 Makefile 支持)。

7. Snap 与 Flatpak——新一代打包格式

传统包管理器(apt/dnf/pacman)的问题:依赖版本冲突、需要 root 权限安装、不同发行版之间包格式不兼容。

Snap(由 Canonical/Ubuntu 开发)Flatpak(由 Red Hat/Freedesktop 开发) 是新一代"沙箱打包"方案:

特性传统 APTSnapFlatpak
打包方式共享系统库自带全部依赖(sandbox)基于运行时(runtime)
更新机制用户手动 apt upgrade自动更新用户手动或自动
隔离性无隔离严格沙箱(可配置)沙箱(通过 Portal 访问资源)
跨发行版格式不兼容同一 snap 包在任何发行版运行同一 flatpak 包在任何发行版运行
主要商店发行版官方源Snap Store(Canonical)Flathub(社区)
争议点后台 Snap Store 是闭源的稍微更"自由"
# Snap(Ubuntu 预装)
snap install hello-world
# 输出: hello-world 6.4 from Canonical installed
snap list                   # 列出已安装的 snap
# 输出: Name         Version   Rev   Tracking     Publisher
# 输出: core20       2024-01   2264  latest/stable canonical
# 输出: hello-world  6.4       29    latest/stable canonical
snap remove hello-world
# 输出: hello-world removed

# Flatpak(需先安装)
sudo apt install flatpak
flatpak install flathub org.gimp.GIMP
# 输出: Looking for matches...
# 输出: org.gimp.GIMP 2.10.36 / flathub
flatpak run org.gimp.GIMP
💡 如何选择? 系统工具(如 curl、nginx)→ 用 apt 安装。桌面应用(如 GIMP、VSCode)→ 可选 Snap 或 Flatpak。如果你想要最新版本且不在意稍大的磁盘占用 → Snap/Flatpak。一般建议:初学者先全部用 apt 安装,避免混淆。

示例代码

# 练习 1:浏览软件源
cat /etc/apt/sources.list        # 查看主源
# 输出: deb http://archive.ubuntu.com/ubuntu/ noble main universe
# 输出: deb http://security.ubuntu.com/ubuntu/ noble-security main universe
ls /etc/apt/sources.list.d/     # 查看额外源
# 输出: docker.list  google-chrome.list
ls /etc/apt/keyrings/            # 查看已安装的 GPG 密钥
# 输出: docker.asc

# 练习 2:搜索和查看包信息
apt search "web server"         # 搜索 web 服务器
# 输出: Sorting... Done
# 输出: nginx/noble 1.24.0-2ubuntu7 amd64  small, powerful, scalable web/proxy server
# 输出: apache2/noble 2.4.58-1ubuntu8 amd64  Apache HTTP Server
apt show nginx                   # 查看 nginx 包的详细信息
# 输出: Package: nginx
# 输出: Version: 1.24.0-2ubuntu7
# 输出: Priority: optional
# 输出: Depends: libc6, libssl3t64, zlib1g
apt show nginx | grep -E "^(Package|Version|Priority|Depends)"
# 输出: Package: nginx
# 输出: Version: 1.24.0-2ubuntu7
# 输出: Priority: optional
# 输出: Depends: libc6, libssl3t64, zlib1g

# 练习 3:安装并探索一个包
sudo apt update
# 输出: Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
# 输出: Reading package lists... Done
sudo apt install -y tree
# 输出: The following NEW packages will be installed:
# 输出:   tree
# 输出: 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
tree --version                   # 确认安装成功
# 输出: tree v2.1.1 (c) 1996 - 2023 by Steve Baker, Thomas Moore, Francesc Rocher
dpkg -L tree                     # tree 安装了哪些文件?
# 输出: /.
# 输出: /usr
# 输出: /usr/bin
# 输出: /usr/bin/tree
# 输出: /usr/share/man/man1/tree.1.gz
dpkg -S /usr/bin/tree            # /usr/bin/tree 属于哪个包?
# 输出: tree: /usr/bin/tree

# 练习 4:查看已安装和可升级的包
apt list --installed | wc -l     # 一共装了多少包?
# 输出: 2345
apt list --upgradable            # 有多少可以升级?
# 输出: Listing... Done
apt list --installed | grep -E "^nginx|^curl|^git"
# 输出: curl/noble-updates 8.5.0-2ubuntu0.5 amd64
# 输出: git/noble-updates 2.43.0-1ubuntu7 amd64

# 练习 5:包的依赖关系
apt depends tree                 # tree 依赖什么?
# 输出: tree
# 输出:   Depends: libc6
apt rdepends tree                # 什么依赖 tree?
# 输出: tree
# 输出:   Reverse Depends:
# 输出:     tree doesn't have any reverse dependencies

常见错误

错误/误区解决方案
"装了包但找不到命令"使用 dpkg -L 包名 查看包安装的文件路径。如果命令不在 $PATH 中,可能安装了库文件而不是可执行文件。或者需要 source ~/.bashrc 或重新打开终端。
"apt install 报错 'Unable to locate package'"先确认包名拼写正确。然后 sudo apt update 更新缓存。如果还找不到,检查是否启用了 universe/multiverse 组件。
"apt install 报错 'Package has no installation candidate'"该包不在你的软件源中。可能需要添加 PPA 或第三方源。也可能是包名在较新发行版中已更改。
"忘记 apt update 直接安装,装到了旧版本"apt 的本地缓存可能已过时。如果怀疑版本太旧,先 apt updateapt install
"用 apt remove 但配置文件还在"apt remove 保留配置文件,apt purge 彻底删除。重新安装同一软件时,保留的配置可能影响默认行为。如果你希望彻底清除,用 purge
"apt upgrade 后某个软件不工作了"升级后软件依赖可能发生变化。首先 sudo apt --fix-broken install 修复依赖。如果还不行,查看该软件包的更新日志(apt changelog 包名)。

最佳实践

#建议说明
1定期更新系统每周至少一次 sudo apt update && sudo apt upgrade -y。安全更新(Security updates)通过此流程自动安装。
2安装前先 apt search在安装之前用 apt search 确认包名、用 apt show 查看版本和描述。可以避免装错包。
3不要同时用多个包管理器管理同一类软件尽量保持一个工具链。Ubuntu 上首选 apt;仅在 apt 没有时才用 Snap 或 Flatpak 或源码编译。
4apt 报错时先 apt --fix-broken install大多数 apt 依赖问题可以通过 sudo apt --fix-broken install 修复。这会尝试自动解决未满足的依赖。
5用 apt-mark 锁定不想升级的包如果某个包的最新版本不兼容你的工作流,用 sudo apt-mark hold 包名 锁定版本,apt-mark unhold 解锁。
6更新前拍快照(虚拟机/双系统)重要生产环境或刚配好的开发环境,用 VirtualBox 快照或备份工具拍快照再升级。大版本升级(如 22.04 → 24.04)特别容易出错。

练习题

  1. (概念)包管理器解决了什么核心问题?为什么说"依赖地狱"是包管理器出现之前的大问题?
  2. (概念)apt updateapt upgrade 有什么区别?为什么它们通常是两步而非一步?
  3. (实操)apt search 找到至少 3 个文本编辑器包(如 vim、nano、emacs),用 apt show 比较它们的描述和大小。
  4. (实操)安装 sl 包(一个"蒸汽火车"的彩蛋程序),运行 sl 看看会发生什么。然后卸载它。
  5. (实操)apt list --installed | wc -l 统计系统上有多少个已安装包。用 dpkg -S /bin/lsdpkg -L coreutils 了解包和文件的关系。
  6. (探究 🔍)/etc/apt/sources.list 中添加一个国内镜像源(如清华 TUNA),对比换源前后 apt update 的速度差异。提示:先备份原文件,再修改。
  7. (探究 🔍)选择一个未经 apt 安装的程序(如 /usr/bin/python3),用 dpkg -S 查找它属于哪个包。然后用 apt depends python3 查看 Python 3 的依赖树,理解为什么一个"简单"的命令背后有多达几十个依赖包。
点击查看答案
  1. (概念)包管理器解决了依赖关系自动处理、单命令安装/更新/卸载、从可信源安全下载的核心问题。"依赖地狱"指手动安装软件时需要逐个下载依赖包,版本不匹配或缺少某个依赖导致安装失败。包管理器通过元数据和依赖解析自动完成这一切。
  2. (概念)`apt update` 从软件源下载最新的包列表元数据(不安装任何东西),`apt upgrade` 根据最新的包列表升级已安装的软件。两步分离让你可以先查看可升级列表(`apt list --upgradable`),再决定是否升级。
  3. (实操)`apt search "text editor"` 搜索,`apt show vim`、`apt show nano`、`apt show emacs` 查看详情。关注 Description 描述功能和 Installed-Size 安装大小。Vim 约 3MB,Nano 约 1MB,Emacs 约 50MB。
  4. (实操)`sudo apt install sl`,运行 `sl`(蒸汽火车从右向左驶过)。用 `sudo apt remove sl` 卸载。apt 的自动依赖清理可加 `sudo apt autoremove`。验证:运行 `sl` 提示 command not found。
  5. (实操)`apt list --installed | wc -l` 统计已安装包数(桌面版约 2000-4000)。`dpkg -S /bin/ls` 显示 coreutils 包拥有该文件。`dpkg -L coreutils` 列出该包安装的所有文件。理解包和文件间的映射关系。
  6. (探究 🔍)备份:`sudo cp /etc/apt/sources.list{,.bak}`。编辑替换为清华镜像:`sed -i 's|archive.ubuntu.com|mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list`。运行 `sudo apt update` 对比速度差异。换源错误时用备份恢复。
  7. (探究 🔍)`dpkg -S /usr/bin/python3` 查看所属包。`apt depends python3` 显示依赖树。Python3 依赖 libc6、libssl、libffi 等数十个包。这体现了 Linux 的模块化设计——程序复用系统库而非自行实现。

学习检查点

学完本章后,请检验自己是否掌握以下内容:

检查项自测问题验证方法
概念理解能用自己的话解释包管理器解决的核心问题(依赖地狱)尝试向他人讲解
命令操作能不查文档使用 apt update、install、upgrade、remove 管理软件包在终端实际执行
原理掌握能说出 apt 和 dpkg 的分工以及软件源配置文件的作用画出工作流程图
故障排查能独立排查软件包安装时的依赖冲突和网络源问题模拟故障并修复
最佳实践能说明为什么应该先 apt update 再 apt install对比不同操作顺序

本章总结

软件包管理是 Linux 系统管理的日常核心操作。对于 Ubuntu 用户,apt 是首选工具——搜索、安装、更新、卸载一条命令搞定。理解软件源(sources.list)和 apt 的两步流程(update → install/upgrade)后,你就掌握了安装管理软件的核心技能。此外,了解其他发行版的包管理器(dnf、pacman)可以让你在不同 Linux 系统间游刃有余。

速查表

概念一句话定义
包管理器自动处理软件安装、依赖解决和更新卸载的工具
软件源 (Repository)存放软件包和元数据的远程服务器
aptDebian/Ubuntu 高级包管理工具(apt install/remove/update/upgrade)
dpkgDebian 底层包管理工具(直接操作 .deb,不处理依赖)
PPAUbuntu 的个人软件源(第三方维护)
Snap / Flatpak沙箱化跨发行版新一代打包格式

下一步:进入 1.9:重定向与管道「重定向与管道」,学习如何组合命令构建数据处理流水线。

延伸阅读

常见问题

apt update 和 apt upgrade 的区别?
apt update 只刷新软件包索引(从镜像源下载最新 Packages.gz),不安装任何更新。apt upgrade 在 update 的基础上实际安装可升级的包。所以每次 apt upgrade 前必须先 apt update。apt full-upgrade 还会处理依赖变更,可能移除旧包。
PPA 添加后安装软件报 404 怎么办?
可能是 PPA 不兼容当前 Ubuntu 版本。检查 /etc/apt/sources.list.d/ 下对应的 .list 文件,确认 dist 代号(如 focal/jammy)是否正确。可以用 sudo add-apt-repository --remove ppa:name 移除后重新添加正确版本的 PPA。或者手动编辑 .list 文件修改发行版代号。
Snap 和 APT 安装的软件可以同时存在吗?
可以,但要注意冲突。例如 snap install nginx 和 apt install nginx 都会安装 Nginx,但配置文件位置和启动方式不同,可能导致混乱。建议对每个软件只在一种包管理系统下安装。Snap 的优点是自动更新和沙箱隔离,缺点是启动慢和磁盘占用大。
↑ 回到顶部