12 - 软件包管理通识
软件包管理是 Linux 系统管理的核心技能。不同发行版使用不同的包管理器和包格式,但核心理念相通。本章通览主流包管理器的使用方法,帮助你快速上手任何发行版。
12.1 基本概念
包与包管理器
| 概念 | 说明 |
|---|---|
| 软件包 (Package) | 预编译的二进制文件 + 元数据(版本、依赖、描述)的组合 |
| 包管理器 (Package Manager) | 管理软件包安装、升级、卸载、依赖解析的工具 |
| 仓库 (Repository) | 软件包的集中存储位置,通常是远程服务器 |
| 依赖 (Dependency) | 软件运行所需的其他软件包,由包管理器自动解析 |
| 元数据 | 描述信息、版本号、校验和、维护者、许可证等 |
二进制包 vs 源码包
| 二进制包 | 源码包 | |
|---|---|---|
| 内容 | 预编译的可执行文件 | 源代码 + 构建脚本 |
| 安装速度 | 快(直接解压+配置) | 慢(需编译) |
| 定制性 | 低 | 高(可修改编译选项) |
| 代表 | .deb, .rpm, .pkg.tar.zst | PKGBUILD, ebuild, spec |
| 适用场景 | 日常使用、生产环境 | 需要自定义编译选项、安全审计 |
主流包格式对比
| 发行版家族 | 包格式 | 包管理器 | 低层级工具 |
|---|---|---|---|
| Debian/Ubuntu | .deb | apt | dpkg |
| Fedora/RHEL | .rpm | dnf | rpm |
| Arch Linux | .pkg.tar.zst | pacman | pacman |
| openSUSE | .rpm | zypper | rpm |
| Alpine Linux | .apk | apk | — |
| Void Linux | .xbps | xbps | — |
| NixOS | derivation | nix | — |
12.2 apt(Debian / Ubuntu)
apt 是 Debian 系发行版的标准包管理器,底层使用 dpkg 处理 .deb 格式的软件包。
基本操作
# 更新软件包列表(安装/升级前必做)
sudo apt update
# 升级所有已安装的软件包
sudo apt upgrade
sudo apt full-upgrade # 更彻底的升级,可删除冲突包
# 安装软件包
sudo apt install nginx
sudo apt install nginx=1.24.0-1 # 安装特定版本
sudo apt install ./local-package.deb # 安装本地 .deb 文件
# 卸载
sudo apt remove nginx # 仅移除软件包
sudo apt purge nginx # 移除软件包 + 配置文件
sudo apt autoremove # 清理不再需要的依赖
# 搜索
apt search "web server"
apt search --names-only nginx # 仅搜索包名
# 查看信息
apt show nginx # 包详细信息
apt list --installed # 列出已安装的包
apt list --upgradable # 列出可升级的包
# 查看包内文件
dpkg -L nginx # 列出包安装的所有文件
# 查找文件属于哪个包
apt install apt-file
apt-file update
apt-file search /usr/bin/nginx
# 或使用 dpkg
dpkg -S /usr/bin/nginx仓库配置
# 主仓库配置
# /etc/apt/sources.list
deb http://deb.debian.org/debian bookworm main contrib non-free-firmware
deb http://deb.debian.org/debian bookworm-updates main contrib non-free-firmware
deb http://security.debian.org/debian-security bookworm-security main contrib non-free-firmware
# 额外仓库配置放在 /etc/apt/sources.list.d/
# 例如添加 PPA(Ubuntu 专用):
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update常见问题处理
# 修复损坏的依赖
sudo apt --fix-broken install
# 锁定软件包版本(阻止自动升级)
sudo apt-mark hold nginx
sudo apt-mark unhold nginx # 解除锁定
# 清理下载的包缓存
sudo apt clean # 清除所有
sudo apt autoclean # 仅清除旧版本
# 查看包安装历史
less /var/log/apt/history.log12.3 dnf(Fedora / RHEL)
dnf 是 RPM 系发行版的现代包管理器,用于处理 .rpm 格式的软件包。它取代了传统的 yum,语法向后兼容。
基本操作
# 更新
sudo dnf check-update # 查看可用更新
sudo dnf upgrade # 升级所有软件包
# 安装
sudo dnf install nginx
sudo dnf install nginx-1.24.0 # 特定版本
sudo dnf install ./local-package.rpm # 安装本地 RPM
# 卸载
sudo dnf remove nginx
sudo dnf autoremove # 清理不再需要的依赖
# 搜索
dnf search "web server"
dnf search nginx
# 查看信息
dnf info nginx # 包详细信息
dnf list installed # 列出已安装的包
dnf list available # 列出可用包
dnf list --updates # 列出可升级的包
# 仓库信息
dnf repolist # 列出已启用的仓库
dnf repolist all # 包括禁用的仓库
# 查看包内文件
rpm -ql nginx # 列出包安装的文件
# 查找文件属于哪个包
dnf provides /usr/bin/nginx
rpm -qf /usr/bin/nginx仓库管理
# 仓库配置文件
# /etc/yum.repos.d/*.repo
# 启用 EPEL(Extra Packages for Enterprise Linux)
# RHEL/CentOS/Rocky Linux/AlmaLinux
sudo dnf install epel-release
# 启用 COPR(类似 Ubuntu PPA 的社区仓库)
dnf copr enable user/project
sudo dnf install package-from-copr
# 启用/禁用特定仓库
sudo dnf --enablerepo=epel install htop
sudo dnf --disablerepo=* --enablerepo=epel install package高级操作
# 回滚最近的 dnf 事务
sudo dnf history
sudo dnf history undo <transaction-id>
# 软件包组管理
dnf group list # 列出所有包组
sudo dnf group install "Development Tools"
sudo dnf group install "KDE Plasma Workspaces"
# 锁定版本(不自动升级)
sudo dnf versionlock add nginx
sudo dnf versionlock list
sudo dnf versionlock clear
# 清理缓存
sudo dnf clean all12.4 pacman(Arch Linux)
pacman 是 Arch Linux 的包管理器,特点是用 tar.zst 格式的二进制包,命令简洁高效。
基本操作
# 同步数据库 + 升级所有包
sudo pacman -Syu
# 安装
sudo pacman -S nginx
sudo pacman -S --needed git vim base-devel # 跳过已安装的
# 卸载
sudo pacman -R nginx # 仅卸载包
sudo pacman -Rs nginx # 卸载 + 无用依赖
sudo pacman -Rns nginx # 卸载 + 依赖 + 配置文件
# 搜索
pacman -Ss "web server" # 搜索远程仓库
pacman -Qs nginx # 搜索已安装的
# 查看信息
pacman -Qi nginx # 本地包详细信息
pacman -Si nginx # 远程仓库包信息
pacman -Ql nginx # 列出包内文件
# 查找文件属于哪个包
pacman -F /usr/bin/nginx
pacman -Fy # 更新文件数据库
# 孤立包管理
pacman -Qdt # 列出不再被需要的包
sudo pacman -Rns $(pacman -Qdtq) # 清理(谨慎)
# 缓存清理
sudo pacman -Sc # 保留当前版本
sudo pacman -Scc # 清除所有缓存
# 或使用 pacman-contrib 中的 paccache
sudo paccache -rk2 # 保留最近 2 版本pacman 的详细高级用法请见 02-pacman包管理高级。
12.5 zypper(openSUSE)
zypper 是 openSUSE 的 RPM 包管理器,支持丰富的仓库操作模式。
# 更新
sudo zypper refresh # 刷新仓库元数据(等同于 apt update)
sudo zypper update # 升级所有软件包
# 安装
sudo zypper install nginx
sudo zypper install nginx=1.24.0 # 特定版本
# 卸载
sudo zypper remove nginx
sudo zypper remove --clean-deps nginx # 同时清理依赖
# 搜索
zypper search nginx
zypper se -s nginx # 详细搜索
# 查看信息
zypper info nginx
zypper packages --installed-only # 列出已安装
# 仓库管理
zypper repos # 列出仓库
sudo zypper addrepo https://example.com/repo repo-name
sudo zypper removerepo repo-name12.6 apk(Alpine Linux)
apk 是 Alpine Linux 的极简包管理器,常用于容器和精简系统。
# 更新索引
sudo apk update
# 安装
sudo apk add nginx
sudo apk add --no-cache nginx # 不缓存安装包(减小镜像体积)
# 卸载
sudo apk del nginx
# 搜索
apk search nginx
# 查看信息
apk info nginx # 包信息
apk info -L nginx # 列出包内文件
apk info -a nginx # 所有可用版本
# 升级
sudo apk upgrade
# 查看包属于哪个仓库
apk policy nginx
# 版本锁定
sudo apk add nginx=1.24.0-r0 # 安装特定版本
sudo apk add 'nginx<1.25.0' # 版本约束语法12.7 通用软件分发方案
Flatpak
Flatpak 是跨发行版的沙盒化应用分发框架,应用与系统隔离。
# 安装 Flatpak
# Debian/Ubuntu
sudo apt install flatpak gnome-software-plugin-flatpak
# Fedora
sudo dnf install flatpak
# Arch
sudo pacman -S flatpak
# 添加 Flathub 仓库(最大的 Flatpak 源)
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
# 安装应用
flatpak install flathub org.gimp.GIMP
flatpak install flathub com.spotify.Client
# 运行应用
flatpak run org.gimp.GIMP
# 管理
flatpak list # 列出已安装的应用
flatpak update # 升级所有
flatpak uninstall org.gimp.GIMP # 卸载
flatpak search gimp # 搜索优点:沙盒隔离、跨发行版、应用与系统分离。缺点:占用磁盘较大、无法直接使用系统字体/主题(需额外配置)。
Snap
Snap 是 Canonical 推出的跨发行版打包系统,自带自动更新和沙盒。
# 安装 snapd
# Ubuntu(通常预装)
sudo apt install snapd
# Fedora
sudo dnf install snapd
# Arch
sudo pacman -S snapd
# 安装应用
sudo snap install vlc
sudo snap install --classic code # 经典模式(更多系统访问权限)
# 管理
snap list # 列出已安装
snap refresh # 升级所有
snap remove vlc # 卸载
snap find "media player" # 搜索Flatpak vs Snap:Flatpak 更开放(Flathub 社区主导),Snap 由 Canonical 控制后端。Flatpak 默认使用系统库共享节省空间,Snap 每个应用独立携带依赖。两者都提供沙盒化。
AppImage
AppImage 是单文件应用分发格式,无需安装,下载即用。
# 下载 AppImage
wget https://example.com/MyApp-x86_64.AppImage
# 添加执行权限
chmod +x MyApp-x86_64.AppImage
# 运行
./MyApp-x86_64.AppImage
# 可选:安装到系统菜单
./MyApp-x86_64.AppImage --appimage-portable-install优点:无需 root、无需安装、不依赖包管理器。缺点:缺少自动更新(除非应用内实现)、不共享库(体积大)、不提供依赖解析。
12.8 源码编译安装
当没有预编译包或需要自定义编译选项时,需要从源码编译。注意:绕过了包管理器的依赖跟踪,后续升级和维护需要手动处理。建议仅在必要时使用。
Autotools 体系
# 获取源码
git clone https://github.com/example/project.git
cd project
# 配置(检查依赖、设置编译选项)
./configure --prefix=/usr/local
# --prefix 安装目录前缀
# --enable-feature 启用功能
# --disable-feature 禁用功能
# 编译(-j 并行以加速)
make -j$(nproc)
# 可选:运行测试
make check
# 安装
sudo make install
# 卸载(如果 Makefile 支持)
sudo make uninstallCMake 体系
mkdir build && cd build
cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DCMAKE_BUILD_TYPE=Release \
-DENABLE_FEATURE=ON
make -j$(nproc)
sudo make installMeson 体系
meson setup build \
--prefix=/usr/local \
--buildtype=release
ninja -C build
sudo ninja -C build install常见问题
# 找不到库时安装开发包
# Debian/Ubuntu: libfoo-dev
# Fedora/RHEL: foo-devel
# Arch: (自动包含,库和头文件在同一包中)
# openSUSE: foo-devel
# Alpine: foo-dev
# 使用 checkinstall 生成包(便于卸载管理)
# Debian/Ubuntu
sudo apt install checkinstall
sudo checkinstall make install # 替代 make install,生成 .deb
# 使用 pkg-config 查询库的编译/链接参数
pkg-config --cflags --libs gtk+-3.012.9 跨发行版安装命令速查
| 操作 | Debian/Ubuntu | Fedora/RHEL | Arch | openSUSE | Alpine |
|---|---|---|---|---|---|
| 更新仓库 | apt update | dnf check-update | pacman -Sy | zypper refresh | apk update |
| 升级系统 | apt upgrade | dnf upgrade | pacman -Syu | zypper update | apk upgrade |
| 安装包 | apt install pkg | dnf install pkg | pacman -S pkg | zypper install pkg | apk add pkg |
| 卸载包 | apt remove pkg | dnf remove pkg | pacman -R pkg | zypper remove pkg | apk del pkg |
| 搜索包 | apt search kw | dnf search kw | pacman -Ss kw | zypper search kw | apk search kw |
| 包信息 | apt show pkg | dnf info pkg | pacman -Si pkg | zypper info pkg | apk info pkg |
| 列出文件 | dpkg -L pkg | rpm -ql pkg | pacman -Ql pkg | rpm -ql pkg | apk info -L pkg |
| 清理依赖 | apt autoremove | dnf autoremove | pacman -Qdt 手动 | zypper rm --clean-deps | 手动 |
| 清理缓存 | apt clean | dnf clean all | pacman -Sc | zypper clean | apk cache clean |
12.10 深度资源
以下章节提供了更深入的包管理知识:
- 01-apt包管理——Debian/Ubuntu apt 深入指南
- 01-dnf-yum包管理——Fedora/RHEL dnf 与 yum 深入
- 02-pacman包管理高级——Arch pacman 高级用法、AUR、PKGBUILD
- 03-nixpkgs与包管理——Nix/NixOS 声明式包管理