跳转到内容
Ryuyx's Blog
返回

Linux 包管理器入门:apt 和 dnf/yum

你拿到一台新 Linux 服务器,想装个 Nginx。第一反应是什么?

大部分人输入 apt install nginx。但如果你面对的是 CentOS 或 RHEL,这条命令会报错——因为它用的是 dnf(或者老一点的 yum)。

为什么 Linux 世界不能统一用一个包管理器?

先回答问题:历史原因。两大发行版家族各自发展了一套体系,一直延续到今天。

一张图看懂两大阵营

┌─────────────────────────────────────────────────────┐
│                    Linux 包管理器                      │
├──────────────────────────┬──────────────────────────┤
│     Debian 系            │     Red Hat 系            │
│                          │                          │
│  Debian                  │  RHEL                     │
│  ├─ Ubuntu               │  ├─ CentOS                │
│  │  ├─ Linux Mint        │  ├─ Fedora                │
│  │  └─ Deepin            │  └─ Amazon Linux          │
│  │                       │                          │
│  └── 包工具: apt         │  └── 包工具: dnf / yum    │
│      包格式: .deb        │      包格式: .rpm         │
└──────────────────────────┴──────────────────────────┘

两个阵营互不兼容。你在 Debian 上不能装 .rpm 文件,在 RHEL 上也不能装 .deb。这就像 iPhone 的充电接口和 Android 的——功能一样,但插头不同。

apt:Debian/Ubuntu 系

apt 的全称是 Advanced Package Tool。它是 Debian 系(包括 Ubuntu、Linux Mint、Deepin 等)的包管理器。

常用命令一览

操作命令说明
更新源apt update刷新软件包列表
安装apt install 包名装包,自动处理依赖
卸载apt remove 包名删包,保留配置文件
彻底卸载apt purge 包名连配置文件一起删
搜索apt search 关键词在源里搜包
查看信息apt show 包名看包的详细信息
升级所有apt upgrade升级所有可更新的包
修复依赖apt --fix-broken install解决依赖问题

举个例子。装 Nginx:

sudo apt update
sudo apt install nginx

两行搞定。apt 会自动处理依赖关系——你要的包依赖什么库,它会一并装上。

三个小细节

第一,apt update 只是刷新源列表,不装任何东西。很多人刚接触时以为它干了什么大事,其实只是去远端的软件仓库拉了个包清单。

第二,aptapt-get 的关系。apt-get 是老版本,apt 是后来做的统一前端。日常用 apt 就够了,写法更少,输出更友好。但在脚本里,很多教程仍然用 apt-get,因为它接口更稳定。

第三,软件源配置文件在 /etc/apt/sources.list。如果默认源在国内下载慢,换成清华或阿里的镜像源,速度能快几十倍。

dnf / yum:Red Hat 系

Red Hat 系的包管理器经历了两次迭代:

 yum (Python 2)  ──→  dnf (Python 3)
 2003-2020             2015-至今
 RHEL 7 / CentOS 7     RHEL 8+ / CentOS 8+ / Fedora

最早是 yum(Yellowdog Updater, Modified),用 Python 2 写的。后来 Fedora 用 Python 3 重写了一遍,改名叫 dnf(Dandified YUM)。

现在谁用哪个?

发行版用什么说明
RHEL 7 / CentOS 7yum旧系统,仍在运行
RHEL 8+ / CentOS Streamdnf当前主流
Fedoradnf最早换用 dnf
Amazon Linux 2023dnf云上最常见
Rocky Linux / AlmaLinuxdnfRHEL 的下游替代

好在两者的命令几乎一样。你只需要把下面的 dnf 换成 yum,在老系统上也能跑。

常用命令一览

操作命令说明
检查更新dnf check-update查看有何可更新
安装dnf install 包名装包,自动处理依赖
卸载dnf remove 包名删包
搜索dnf search 关键词在源里搜包
查看信息dnf info 包名看包的详细信息
升级所有dnf upgrade升级所有可更新的包
清理缓存dnf clean all清掉缓存,省硬盘

同样是装 Nginx:

sudo dnf install nginx

注意,dnf 默认不需要像 apt 那样先 updatednf install 会自动检查源缓存,必要时刷新。

apt vs dnf:一分钟对比

对比项aptdnf / yum
所属阵营Debian 系Red Hat 系
包格式.deb.rpm
安装命令apt installdnf install
搜索命令apt searchdnf search
需先 update?是(apt update否(自动检查)
源配置文件/etc/apt/sources.list/etc/yum.repos.d/*.repo
依赖解析较保守使用 libsolv,更快
典型发行版Ubuntu, Debian, MintRHEL, Fedora, CentOS

怎么快速判断该用哪个?

两步走:

第一步,看发行版。

cat /etc/os-release | grep '^ID='

输出 ID=ubuntu → 用 apt。输出 ID=rhel → 用 dnf。

第二步,看有没有包管理器。

# 如果有输出,就是 apt 系
which apt

# 如果没输出再试 dnf
which dnf

敲两个命令的时间成本,远低于查文档。

一个现实问题:源太慢怎么办

在国内用默认源,下载速度经常只有几十 KB/s。解决方案:

apt 换源(以阿里云为例):

sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
sudo apt update

dnf 换源

sudo sed -i 's/mirror.centos.org/mirrors.aliyun.com/g' /etc/yum.repos.d/*.repo
sudo dnf makecache

换成阿里云、清华、中科大的镜像,速度能跑到带宽上限。


包管理器只是一个入口。真正重要的不是记命令,是理解你所在的发行版生态:

选一个主攻,另一个知道怎么查就行。

下回拿到一台新机器,先看发行版,再选命令。apt 还是 dnf,敲对了,后面就顺了。


分享这篇文章:

下一篇
用 Tinyproxy 搭建局域网 HTTP 代理