一、为什么需要包管理器?
在 Windows 或 macOS 上安装软件通常是去官网下载安装包双击,或者从应用商店点一下。但在 Linux 世界,软件安装方式完全不同——绝大多数软件通过包管理器来安装、更新和卸载。
包管理器解决了几个核心问题:
| 问题 | 包管理器的解决方案 |
|---|---|
| 依赖地狱 | 自动解析并安装所有依赖包 |
| 软件来源 | 从官方仓库下载,经过审核,相对安全 |
| 版本管理 | 统一管理已安装软件,支持一键更新 |
| 卸载残留 | 完整记录文件清单,卸载干净 |
Linux 发行版繁多,每个发行版家族都有自己的包管理器。本文从最常用的开始,逐一详解。
二、Debian / Ubuntu 系:APT
2.1 概述
APT(Advanced Package Tool)是 Debian 及其衍生版(Ubuntu、Linux Mint、Kali 等)的包管理器。底层使用 .deb 包格式。
| 发行版 | 包格式 | 包管理器 | 前端工具 |
|---|---|---|---|
| Debian | .deb | dpkg | apt / apt-get / aptitude |
| Ubuntu | .deb | dpkg | apt / apt-get |
| Linux Mint | .deb | dpkg | apt / synaptic |
2.2 常用命令
# 更新包索引(从仓库拉取最新列表)
sudo apt update
# 升级所有可升级的包
sudo apt upgrade
# 更彻底的升级(包含依赖变更)
sudo apt full-upgrade
# 安装软件
sudo apt install nginx
# 安装多个包
sudo apt install curl wget git
# 卸载(保留配置文件)
sudo apt remove nginx
# 彻底卸载(连配置文件一起删)
sudo apt purge nginx
# 自动清理不需要的依赖
sudo apt autoremove
# 搜索软件包
apt search nginx
# 查看包信息
apt show nginx
# 列出已安装的包
apt list --installed
# 查看某个文件属于哪个包
dpkg -S /etc/nginx/nginx.conf2.3 .deb 文件直接安装
# 下载 .deb 文件
wget https://example.com/package.deb
# 安装(自动处理依赖)
sudo apt install ./package.deb
# 或用 dpkg 手动安装(不处理依赖)
sudo dpkg -i package.deb
# 修复依赖
sudo apt install -f2.4 仓库管理
APT 的软件源配置文件在 /etc/apt/sources.list 和 /etc/apt/sources.list.d/ 目录下:
# 添加第三方仓库(以 Docker 为例)
echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable" | \
sudo tee /etc/apt/sources.list.d/docker.list
# 添加仓库 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
# 更新索引后即可安装
sudo apt update
sudo apt install docker-ce2.5 dpkg 核心概念
dpkg 是 APT 的底层工具,直接操作 .deb 包:
# 安装 .deb
dpkg -i package.deb
# 卸载
dpkg -r package
# 查看已安装
dpkg -l
# 查看包安装的文件列表
dpkg -L package
# 重新配置一个已安装的包
dpkg-reconfigure package三、Red Hat / CentOS / Rocky / Alma 系:RPM + YUM / DNF
3.1 概述
RHEL 系发行版使用 .rpm 包格式。早期用 YUM(Yellowdog Updater Modified),RHEL 8+ 和 Fedora 22+ 开始用 DNF(Dandified YUM)作为下一代包管理器。
DNF 是 YUM 的继承者,底层还是 RPM,但解决了 YUM 在性能、依赖解析和 Python 2/3 兼容性上的诸多问题。
| 发行版 | 包格式 | 包管理器(旧) | 包管理器(新) |
|---|---|---|---|
| RHEL 7 / CentOS 7 | .rpm | yum | — |
| RHEL 8 / Rocky 8 / Alma 8 | .rpm | yum(兼容) | dnf |
| RHEL 9 / Rocky 9 / Alma 9 | .rpm | — | dnf |
| Fedora | .rpm | yum(已弃用) | dnf |
| OpenCloudOS 9 | .rpm | — | dnf |
3.2 DNF 常用命令
# 检查更新
dnf check-update
# 安装
sudo dnf install nginx
# 升级全部
sudo dnf upgrade
# 只安装安全更新
sudo dnf upgrade --security
# 搜索
dnf search nginx
# 查看包信息
dnf info nginx
# 卸载
sudo dnf remove nginx
# 自动清理缓存
sudo dnf clean all
# 查看历史
dnf history
# 回滚到某个历史状态
sudo dnf history undo <id>
# 列出已安装
dnf list installed
# 查看某个文件属于哪个包
dnf provides /etc/nginx/nginx.conf3.3 YUM 常用命令(兼容层)
在 RHEL 8/9 上,yum 命令实际指向 dnf:
# YUM 和 DNF 命令基本一致
sudo yum install nginx # 实际调用 dnf
sudo yum update # 实际调用 dnf upgrade
yum list installed3.4 RPM 底层操作
# 安装 .rpm 文件
sudo rpm -ivh package.rpm
# 升级
sudo rpm -Uvh package.rpm
# 卸载
sudo rpm -e package
# 查看已安装
rpm -qa
# 查看包安装的文件
rpm -ql nginx
# 查看文件属于哪个包
rpm -qf /etc/nginx/nginx.conf
# 验证包完整性
rpm -V nginx3.5 EPEL 与第三方仓库
RHEL 系官方仓库的软件数量相对较少,通常需要启用 EPEL(Extra Packages for Enterprise Linux)仓库:
# RHEL 9 / Rocky 9 / Alma 9
sudo dnf install epel-release
# 如果 dnf 找不到,也可以手动安装
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
# 安装 RPM Fusion(多媒体相关)
sudo dnf install --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-9.noarch.rpm四、Arch Linux 系:Pacman
4.1 概述
Pacman 是 Arch Linux 和 Manjaro 等衍生版的包管理器。它使用 .pkg.tar.zst 包格式,以简洁高效著称。Pacman 的依赖解析速度非常快,没有 APT 那种先 update 再 install 的步骤。
| 发行版 | 包格式 | 包管理器 | 特点 |
|---|---|---|---|
| Arch Linux | .pkg.tar.zst | pacman | 滚动更新、DIY |
| Manjaro | .pkg.tar.zst | pacman | 基于 Arch,更友好 |
| EndeavourOS | .pkg.tar.zst | pacman | 接近原生 Arch |
4.2 Pacman 常用命令
# 安装
sudo pacman -S nginx
# 卸载(保留配置文件)
sudo pacman -R nginx
# 彻底卸载(连配置和依赖一起)
sudo pacman -Rns nginx
# 升级全部(滚动更新)
sudo pacman -Syu
# 搜索
pacman -Ss nginx
# 查看已安装
pacman -Q
# 查看包信息
pacman -Qi nginx
# 查看未安装的包信息
pacman -Si nginx
# 查看包安装的文件列表
pacman -Ql nginx
# 查看文件属于哪个包
pacman -Qo /etc/nginx/nginx.conf
# 清理包缓存
sudo pacman -Sc
# 清理所有未安装的缓存
sudo pacman -Scc
# 列出孤儿包(不再被依赖的包)
pacman -Qdt
# 删除孤儿包
sudo pacman -Rns $(pacman -Qdtq)4.3 AUR(Arch User Repository)
AUR 是 Arch 生态最大的特色——它是一个社区维护的软件仓库,包含了几乎一切官方仓库没有的软件。配合 AUR Helper(如 yay)使用:
# 安装 yay
sudo pacman -S yay
# 从 AUR 安装软件
yay -S google-chrome
# 搜索 AUR
yay -Ss package-name
# 升级(包括 AUR 包)
yay -SyuAUR 的包是 PKGBUILD 脚本,下载源码后在本地编译。虽然方便但需留意安全风险——因为 AUR 的包未经官方审核。
五、openSUSE 系:Zypper
5.1 概述
openSUSE 使用 RPM 包格式,包管理器叫 Zypper。它的命令风格和 APT/DNF 类似,也支持 YaST 图形化管理工具。
| 发行版 | 包格式 | 包管理器 | 特点 |
|---|---|---|---|
| openSUSE Leap | .rpm | zypper | 固定版本,稳定 |
| openSUSE Tumbleweed | .rpm | zypper | 滚动更新,激进 |
| SUSE Linux Enterprise | .rpm | zypper | 企业版 |
5.2 Zypper 常用命令
# 更新仓库索引
sudo zypper refresh
# 安装
sudo zypper install nginx
# 升级
sudo zypper update
# 搜索
zypper search nginx
# 查看包信息
zypper info nginx
# 卸载
sudo zypper remove nginx
# 查看已安装
zypper search --installed-only
# 查看某个文件属于哪个包
zypper what-provides /etc/nginx/nginx.conf
# 添加仓库
sudo zypper addrepo https://example.com/repo.repo
# 清理缓存
sudo zypper cleanZypper 有一个很有特色的功能——事务性更新(Transactional Updates),更新系统时创建快照,更新失败可以回滚。
六、Gentoo 系:Portage / emerge
6.1 概述
Gentoo 的包管理体系叫做 Portage,使用 emerge 命令。它不是安装预编译的二进制包,而是从源代码编译——这也是 Gentoo「源码发行版」称号的由来。
| 发行版 | 包格式 | 包管理器 | 特点 |
|---|---|---|---|
| Gentoo | 源码 | emerge / portage | 源码编译、USE flags、极致定制 |
| Funtoo | 源码 | emerge | Gentoo 衍生,优化更好 |
6.2 emerge 常用命令
# 安装(编译时间可能很长)
sudo emerge nginx
# 搜索
emerge --search nginx
# 升级全部
sudo emerge --update --deep --newuse @world
# 卸载
sudo emerge --unmerge nginx
# 查看已安装
equery list
# 查看依赖关系
equery depends nginx
equery depgraph nginx
# 清理源码缓存
sudo emerge --clean6.3 USE flags
Gentoo 最大的特色是 USE flags——通过开关控制编译选项,决定软件包含或排除哪些功能:
# 查看 USE flags 配置
cat /etc/portage/make.conf
# 设置 USE flags
echo "www-servers/nginx nginx_modules_http_ssl" >> /etc/portage/package.use
# 应用新 USE flags 后重新编译
sudo emerge --newuse --deep @world例如 Nginx 可以只编译需要的模块,去掉不需要的,得到一个更小、更安全、更快的可执行文件。代价是每次安装大软件(如 Chromium、LLVM)需要编译数小时。
七、其他包管理器
7.1 Slackware 系:Slackpkg / pkgtool
Slackware 是现存最古老的仍在维护的 Linux 发行版之一。它没有自动依赖解析——安装软件需要手动处理依赖。
# 安装
slackpkg install package
# 更新
slackpkg update
# 升级全部
slackpkg upgrade-all
# 搜索
slackpkg search package7.2 Void Linux:XBPS
Void Linux 是一个独立的发行版,使用 runit 作为 init 系统,包管理器是 XBPS(X Binary Package System)。它以简洁和快速著称。
# 安装
sudo xbps-install nginx
# 同步仓库索引
sudo xbps-install -S
# 更新系统
sudo xbps-install -Su
# 搜索
xbps-query -Rs nginx
# 卸载
sudo xbps-remove nginx
# 清理缓存
sudo xbps-remove -O7.3 Nix / NixOS:Nix
Nix 是一个纯函数式的包管理器,NixOS 是构建在 Nix 之上的操作系统。它的理念是:每个包都有唯一的哈希,不同版本互不干扰。
# 安装(以用户身份,无需 root)
nix-env -i nginx
# 搜索
nix-env -qaP | grep nginx
# 升级
nix-env -u
# 回滚
nix-env --rollbackNix 最大的特点是可重现构建——配置文件描述的整个系统状态是确定性的,换一台机器部署完全相同的环境。
八、容器时代的包管理
现代 Linux 开发中,越来越多的场景用容器代替传统包管理器:
| 传统方式 | 容器方式 |
|---|---|
apt install python |
docker pull python:3.12 |
| 系统级依赖冲突 | 容器间互不干扰 |
| 卸载残留 | 删容器即删所有 |
| 环境迁移难 | Dockerfile 可复现 |
# 容器化安装软件的例子
docker run --rm -it ubuntu:22.04 bash
# 进入容器后仍然用 apt 安装
apt update && apt install -y nginx但包管理器仍然是 Linux 服务器的基石——基础镜像的构建、系统级依赖管理、安全更新,都离不开传统的包管理器。
九、各包管理器命令速查表
| 操作 | APT (Debian) | DNF (RHEL) | Pacman (Arch) | Zypper (openSUSE) |
|---|---|---|---|---|
| 安装 | apt install |
dnf install |
pacman -S |
zypper install |
| 卸载 | apt remove |
dnf remove |
pacman -R |
zypper remove |
| 升级全部 | apt upgrade |
dnf upgrade |
pacman -Syu |
zypper update |
| 搜索 | apt search |
dnf search |
pacman -Ss |
zypper search |
| 包信息 | apt show |
dnf info |
pacman -Qi |
zypper info |
| 已安装列表 | apt list --installed |
dnf list installed |
pacman -Q |
zypper search -i |
| 文件归属 | dpkg -S |
dnf provides |
pacman -Qo |
zypper wp |
| 清理缓存 | apt clean |
dnf clean all |
pacman -Sc |
zypper clean |
十、总结
| 发行版家族 | 包管理器 | 包格式 | 适合场景 |
|---|---|---|---|
| Debian / Ubuntu | APT | .deb | 通用服务器、桌面,新手友好 |
| RHEL / Rocky / Fedora | DNF | .rpm | 企业服务器、生产环境 |
| Arch / Manjaro | Pacman | .pkg.tar.zst | 滚动更新、开发者桌面 |
| openSUSE | Zypper | .rpm | 企业 + 桌面兼备 |
| Gentoo | Portage / emerge | 源码 | 极致定制、性能优化 |
| Slackware | Slackpkg | .tgz | 怀旧、极简主义 |
| Void Linux | XBPS | .xbps | 极简、快速 |
| NixOS | Nix | .nix | 可重现构建、DevOps |
选择哪个包管理器通常取决于你用的发行版——你很少会主动「选」包管理器,而是先选发行版,然后自然继承它的包管理体系。
作为运维,掌握 APT 和 DNF 是基本功;作为开发者,了解 Pacman 和 Nix 也有助于拓展视野。但无论用哪个,包管理器的核心概念是相通的:仓库 → 索引 → 依赖解析 → 安装 → 管理 → 卸载。