详解不同 Linux 系统的包管理器

2026-05-22 Linux 运维

一、为什么需要包管理器?

在 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 常用命令

2.3 .deb 文件直接安装

# 下载 .deb 文件
wget https://example.com/package.deb

# 安装(自动处理依赖)
sudo apt install ./package.deb

# 或用 dpkg 手动安装(不处理依赖)
sudo dpkg -i package.deb

# 修复依赖
sudo apt install -f

2.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-ce

2.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 常用命令

3.3 YUM 常用命令(兼容层)

在 RHEL 8/9 上,yum 命令实际指向 dnf:

# YUM 和 DNF 命令基本一致
sudo yum install nginx    # 实际调用 dnf
sudo yum update           # 实际调用 dnf upgrade
yum list installed

3.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 nginx

3.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 常用命令

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 -Syu

AUR 的包是 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 clean

Zypper 有一个很有特色的功能——事务性更新(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 --clean

6.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 package

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

7.3 Nix / NixOS:Nix

Nix 是一个纯函数式的包管理器,NixOS 是构建在 Nix 之上的操作系统。它的理念是:每个包都有唯一的哈希,不同版本互不干扰。

# 安装(以用户身份,无需 root)
nix-env -i nginx

# 搜索
nix-env -qaP | grep nginx

# 升级
nix-env -u

# 回滚
nix-env --rollback

Nix 最大的特点是可重现构建——配置文件描述的整个系统状态是确定性的,换一台机器部署完全相同的环境。

八、容器时代的包管理

现代 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 也有助于拓展视野。但无论用哪个,包管理器的核心概念是相通的:仓库 → 索引 → 依赖解析 → 安装 → 管理 → 卸载。