12 - 软件包管理通识

软件包管理是 Linux 系统管理的核心技能。不同发行版使用不同的包管理器和包格式,但核心理念相通。本章通览主流包管理器的使用方法,帮助你快速上手任何发行版。


12.1 基本概念

包与包管理器

概念说明
软件包 (Package)预编译的二进制文件 + 元数据(版本、依赖、描述)的组合
包管理器 (Package Manager)管理软件包安装、升级、卸载、依赖解析的工具
仓库 (Repository)软件包的集中存储位置,通常是远程服务器
依赖 (Dependency)软件运行所需的其他软件包,由包管理器自动解析
元数据描述信息、版本号、校验和、维护者、许可证等

二进制包 vs 源码包

二进制包源码包
内容预编译的可执行文件源代码 + 构建脚本
安装速度快(直接解压+配置)慢(需编译)
定制性高(可修改编译选项)
代表.deb, .rpm, .pkg.tar.zstPKGBUILD, ebuild, spec
适用场景日常使用、生产环境需要自定义编译选项、安全审计

主流包格式对比

发行版家族包格式包管理器低层级工具
Debian/Ubuntu.debaptdpkg
Fedora/RHEL.rpmdnfrpm
Arch Linux.pkg.tar.zstpacmanpacman
openSUSE.rpmzypperrpm
Alpine Linux.apkapk
Void Linux.xbpsxbps
NixOSderivationnix

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.log

12.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 all

12.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-name

12.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 uninstall

CMake 体系

mkdir build && cd build
cmake .. \
 -DCMAKE_INSTALL_PREFIX=/usr/local \
 -DCMAKE_BUILD_TYPE=Release \
 -DENABLE_FEATURE=ON
 
make -j$(nproc)
sudo make install

Meson 体系

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.0

12.9 跨发行版安装命令速查

操作Debian/UbuntuFedora/RHELArchopenSUSEAlpine
更新仓库apt updatednf check-updatepacman -Syzypper refreshapk update
升级系统apt upgradednf upgradepacman -Syuzypper updateapk upgrade
安装包apt install pkgdnf install pkgpacman -S pkgzypper install pkgapk add pkg
卸载包apt remove pkgdnf remove pkgpacman -R pkgzypper remove pkgapk del pkg
搜索包apt search kwdnf search kwpacman -Ss kwzypper search kwapk search kw
包信息apt show pkgdnf info pkgpacman -Si pkgzypper info pkgapk info pkg
列出文件dpkg -L pkgrpm -ql pkgpacman -Ql pkgrpm -ql pkgapk info -L pkg
清理依赖apt autoremovednf autoremovepacman -Qdt 手动zypper rm --clean-deps手动
清理缓存apt cleandnf clean allpacman -Sczypper cleanapk cache clean

12.10 深度资源

以下章节提供了更深入的包管理知识: