← 回目录
24 Week 05 · 磁盘与软件

dnf 装软件、配国内源

相对轻松的一天。但里面有个「自建本地仓库」的点——传统企业内网环境很常见,说出来很对口。

yum 变成了 dnf

先说清关系
又一处 RHEL 8 之后的变化
dnf
现在的包管理器。依赖解析更快更准,是 yum 的第四代重写版。
yum
在 RHEL 8+ 上只是指向 dnf 的软链接——敲 yum install 实际执行的还是 dnf。老命令还能用,但正式场合说 dnf。
rpm
更底层的工具,直接操作单个 .rpm 包文件。它不解决依赖——缺什么就报错让你自己找。dnf 是在 rpm 之上加了依赖解析和仓库管理。

日常命令

装、删、查
$ sudo dnf install -y vim wget curl tree net-tools
$ sudo dnf remove -y tree
$ dnf search nginx              # 搜包名
$ dnf info nginx                # 看详细信息
$ dnf list installed | wc -l    # 装了多少个包
$ dnf repolist                  # 当前启用了哪些仓库
更新(生产要谨慎)
$ sudo dnf check-update          # 只看有哪些能更新,不动手
$ sudo dnf update nginx          # 只更新指定的包
$ sudo dnf update -y             # 全量更新 ← 生产环境慎用
生产环境不要随便 dnf update

全量更新可能把内核、glibc 这类核心组件也升级了,重启后出问题就很麻烦。

正确做法:只更新有安全漏洞的特定包dnf update-minimal --security),或者先在测试机验证。面试时说出"我不会在生产上直接 dnf update -y",比说会用这条命令加分。

两个查询技巧

实际很有用
这个命令是哪个包提供的
$ dnf provides ss
iproute-6.2.0-5.el9.aarch64 : Advanced IP routing utilities
     ↑ 想装 ss 但不知道包名?用 provides 反查

$ dnf provides */semanage        # Day 19 那个命令属于哪个包
这个文件是哪个包装的
$ rpm -qf /etc/nginx/nginx.conf
nginx-1.20.1-14.el9.aarch64

$ rpm -ql nginx | head           # 这个包装了哪些文件
$ rpm -qa | grep nginx           # 装了哪些 nginx 相关包

dnf provides 特别实用——遇到「command not found」但不知道该装什么包时,一查就知道。

仓库配置

repo 文件长什么样
仓库定义都在这个目录
$ ls /etc/yum.repos.d/
rocky.repo  rocky-extras.repo  epel.repo

$ cat /etc/yum.repos.d/rocky.repo
一个仓库定义的关键字段
[baseos]
方括号里是仓库 ID,唯一标识。
name=
人看的描述名。
baseurl=
软件包从哪下载。换国内源就是改这个。
mirrorlist=
镜像列表地址,会自动挑一个可用的。用 baseurl 时要把它注释掉,否则它优先。
enabled=1
是否启用这个仓库。
gpgcheck=1
是否校验软件包签名别关掉——这是防止装到被篡改的包的最后一道防线。

换国内源

速度差很多
Rocky 9 换阿里云源
# 先备份(Day 02 的规矩)
$ sudo cp -a /etc/yum.repos.d /etc/yum.repos.d.bak.$(date +%F)

# 用 sed 批量替换(Rocky 9 用 vault 结构)
$ sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
       -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
       -i.bak /etc/yum.repos.d/rocky*.repo

# 重建缓存
$ sudo dnf clean all
$ sudo dnf makecache
$ dnf repolist
改完一定要验证

dnf repolist 看仓库还在不在、sudo dnf install -y tree 试装一个小包。

改错了 repo 文件,之后所有装包操作都会失败——所以改之前备份、改之后立刻验证。

EPEL 仓库

很多常用工具在这
装 EPEL
$ sudo dnf install -y epel-release
$ dnf repolist | grep epel

EPEL(Extra Packages for Enterprise Linux)是 Fedora 社区为 RHEL 系维护的额外软件仓库htopfail2bannload 这些常用工具官方源里没有,都在 EPEL 里。

装几个运维顺手的工具
$ sudo dnf install -y htop ncdu tree bash-completion
这几个值得装
htop
top 好看好用,能用方向键选进程、直接按 F9 杀。
ncdu
交互式的 du——Day 21 那种逐层找大目录,用它可以直接用方向键钻进去,比敲一层层 du 快得多。
bash-completion
Tab 补全增强。装完重新登录,systemctl sta + Tab 能补出 start,还能补服务名。

内网怎么办:自建仓库

传统企业常见

很多企业的服务器根本不能上外网。这时候的标准做法是自建一个内网 yum 仓库

大致流程
# 在一台能上网的机器上
$ sudo dnf install -y createrepo httpd
$ sudo mkdir -p /var/www/html/rocky9
# 把 rpm 包放进去(同步官方源,或从光盘拷)
$ sudo createrepo /var/www/html/rocky9      # 生成仓库元数据
$ sudo systemctl enable --now httpd

# 在内网其他机器上,写一个 repo 文件指向它
[local]
name=Local Repo
baseurl=http://10.0.0.5/rocky9
enabled=1
gpgcheck=0
这个点在面试里很对口

如果你投的是国企、事业单位、金融、制造业这类内网环境为主的岗位,能说出"内网环境我们自建本地 yum 仓库,用 createrepo 生成元数据,通过 httpd 提供服务",会让对方觉得你懂他们的实际场景。

装包历史

追查"谁动了这台机器"
$ sudo dnf history                    # 所有操作记录
ID | Command line          | Date          | Action(s) | Altered
 8 | install -y htop ncdu  | 2026-09-07 15 | Install   | 3
 7 | install -y nginx      | 2026-09-06 22 | Install   | 5

$ sudo dnf history info 8             # 看某次操作的详情
$ sudo dnf history undo 8             # ← 撤销某次安装!

dnf history undo 是个救命功能——装错了东西、或者更新后出问题,可以整批回滚。比一个个 remove 靠谱得多。

今天的面试点

「yum 和 dnf 什么关系?」

dnfyum 的新一代,RHEL 8 之后 yum 只是指向 dnf 的软链接。底层都是 rpm但 rpm 不解决依赖,dnf 在它之上加了依赖解析和仓库管理。」

「软件源怎么配?」

「repo 文件放在 /etc/yum.repos.d/,关键字段是 baseurlenabledgpgcheck。换国内源就是改 baseurl,改完 dnf clean all && dnf makecache。」

加分:「内网环境我们会自建本地仓库,用 createrepo 生成元数据,通过 httpd 或 nfs 提供给内网机器。

今天的练习

敲完再走 · 约 12 分钟
  • dnf repolist 看当前仓库,cat /etc/yum.repos.d/rocky.repo 认一遍字段
  • sudo dnf install -y epel-release,然后装 htop ncdu tree bash-completion
  • 试试 ncdusudo ncdu /var,用方向键钻进去找大目录,体会比 du 快多少
  • dnf provides ssrpm -qf /etc/nginx/nginx.conf,练两种反查
  • sudo dnf history,看看你这台机器装过什么、什么时候装的
  • 选做:备份 repo 目录,换成阿里云源,dnf makecache 后试装一个包验证
明天预告

Day 25 讲 crontab 定时任务,第五周收尾。那个「脚本手动跑没问题、定时跑就失败」的经典坑,Day 02 埋的伏笔终于要填了。