很多人一开始接触 RHEL 9,第一反应是去官网下载最小化 ISO,几个 G,装起来快。但等你真正落到生产环境,尤其是机房内网、客户现场、或者安全区这种不允许出网的场景,你会发现手上如果没有一张完整的 DVD ISO,很多时候连一个基础的编译工具都装不上。RHEL 9 的 DVD ISO 就是红帽官方的完整离线安装包,装系统、开软件源、补包、甚至临时当包备份库用,一张镜像能干好几件事。这篇文章我打算把这张层层展开:从下载校验、写入 U 盘装系统,到装完把它挂成本地 dnf 仓库源,整个流程完整捋一遍,适合所有要碰 RHEL 9 运维、实施、测试和离线环境交付的朋友参考。
1. 整体思路:为什么一张 DVD ISO 能包打天下
1.1 三种官方镜像的定位差异
RHEL 9 在红帽官网能下到好几种镜像文件,最常见的三种是 Boot ISO、Minimal ISO 和 DVD ISO。很多人第一次下载时容易选错,上来就下最小的,结果后面越弄越折腾。我把各自的定位整理成了表格,大家根据自己的场景对照着看。
| 镜像类型 | 体积参考 | 主要用途 | 核心局限 |
|---|---|---|---|
| Boot ISO | 约 700MB | 从网络源引导安装 | 安装时必须能访问网络软件源 |
| Minimal ISO | 约 2GB | 小规模离线安装系统 | 软件包很少,装完无法形成可用仓库 |
| DVD ISO | 约 10GB | 完整离线安装 + 本地软件源 | 体积大,下载和拷贝耗时 |
mini 镜像我其实很不推荐在离线场景用。它装完确实能进系统,但连 vim、lrzsz 这种最基础的工具都得靠本地源,你手头又没有源,等于给自己挖坑。Boot ISO 就更别提了,安装阶段就要拉网络源,内网环境基本卡死在安装程序的源配置那一步。DVD ISO 虽然大,但它本身就是一个自包含的软件仓库,装完系统还能继续当仓库用,一次下载,重复受益,这笔账是划算的。
1.2 获取途径与 ISO 文件校验
RHEL 9 的 DVD ISO 官方名称一般是类似 rhel-baseos-9.2-x86_64-dvd.iso 这样的格式。下载需要注册红帽账号,个人开发者可以免费开通 Developer Subscription,不需要付费也能合法使用。进入 Red Hat Customer Portal,找到对应版本和架构,下载 DVD 镜像即可。这里我没法给你一个永久直链,因为下载链接和订阅账号绑定,直接用浏览器下载是最省事的。
下载这种事,我个人的习惯是下完先校验 sha256,特别对超过 10GB 的大文件。跨网络传输过程中文件损坏的概率不是零,如果 ISO 在传输过程中少了几兆,做启动盘可能装到一半就报错,白白浪费半小时。
bash复制sha256sum rhel-baseos-9.2-x86_64-dvd.iso
把算出来的哈希值和官网的 CHECKSUM 对比一下,如果一致就继续。这一步五分钟都花不了,但能避免后面一堆莫名其妙的故障。我见过太多人图省事跳过了这步,然后 U 盘启动时系统引导不完整,还以为是 U 盘质量问题。
1.3 理解 DVD 镜像里的目录结构
在配置本地仓库之前,必须先把 RHEL 9 DVD 镜像的目录结构搞清楚。挂载之后你会在根目录下看到 BaseOS 和 AppStream 两个关键目录,这是从 RHEL 8 开始的一个重大变化。
- BaseOS 目录:存放系统底层核心包,像 kernel、glibc、systemd、bash 这些基础组件。
- AppStream 目录:存放应用程序、开发工具、运行时环境、数据库等更上层的软件包。
很多从 CentOS 7 时代过来的人习惯了一个仓库配到底,拿到 RHEL 9 的 DVD 以后想当然地写成单个 baseurl=file:///mnt/,结果 dnf repolist 能看到仓库但安装软件时永远提示找不到包,这就是没搞清楚 BaseOS 和 AppStream 是两套独立 repodata 的原因。后续配本地源时,必须把这两个目录分别配成两个独立的仓库,这是整个流程里最关键的认知门槛。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 制作可启动安装介质:从 U 盘到安装完成
2.1 写入 U 盘前的几个准备
做启动盘之前,先确认三件事。第一,U 盘容量至少 16GB,DVD ISO 本身就超过 10GB,8GB 的 U 盘肯定放不下,我的习惯是直接上 32GB,免得以后还要来回腾空间。第二,确认你在 Linux 环境里有 dd 命令,这是系统自带工具,一般都有。第三,先用 lsblk 看清楚 U 盘对应的设备名,这一步千万别凭记忆猜。
bash复制lsblk
比如你看到 /dev/sdb 是一个没有分区或者只有一个分区的 USB 设备,那它很可能就是 U 盘。这里要特别强调一个容易踩的坑:dd 写入必须指向整个设备节点,比如 /dev/sdb,不是 /dev/sdb1。直接写分区会导致分区表没有被正确写入,U 盘根本没法引导启动。
2.2 用 dd 命令写入 ISO 镜像
确认设备名没问题后,执行:
bash复制sudo dd if=rhel-baseos-9.2-x86_64-dvd.iso of=/dev/sdb bs=4M status=progress oflag=sync
bs=4M 是设置每次读写 4MB 的数据块,提高写入效率;status=progress 会实时显示写入进度,方便你判断还要等多久;oflag=sync 是强制把缓存同步写入 U 盘,避免数据还在缓存里就显示完成。这条命令执行完成需要几分钟时间,10GB 左右的数据拷进 U 盘,USB 3.0 大概三到五分钟,慢的话可能要十分钟。
写入完成后,可以插拔一下 U 盘再执行 lsblk,如果看到 U 盘的分区表发生了变化,说明写入成功。其实还有一个更稳妥的校验方法,直接逐个读回对比 U 盘内容和原始 ISO,但生产环境下我觉得没必要那么较真,用上面的办法确认有没有写入有没有明显异常就够了。
2.3 虚拟机与物理机的引导方式差异
如果是在虚拟机里安装,根本不需要写 U 盘。直接在虚拟机的光驱配置里挂载 DVD ISO 文件,启动顺序设置为从光盘引导,然后开机就会自动进入安装流程。VMware 和 KVM 都支持这种操作,本质上就是虚拟了一个光驱,安装器看到的是 /dev/sr0。
物理机则需要把 U 盘插上,开机进 BIOS/UEFI 设置,把 U 盘调整为第一启动项。UEFI 模式下推荐开启 Secure Boot,RHEL 9 的引导内容由微软签名,默认是兼容的。如果遇到启动卡在引导界面没反应,先尝试关闭 Secure Boot,再不行就换一个 USB 接口,尤其是前置 USB 口有时候供电不稳会导致 U 盘识别异常。
2.4 安装过程中的几个关键选项
从 U 盘或虚拟机光驱引导进入安装界面后,每个步骤都有讲究。安装源那一步保持默认即可。RHEL 9 安装器默认会自动识别当前引导介质作为安装来源,所以不需要去改成网络源。
软件选择这里要结合你的实际用途。如果这是一台要长期跑业务的服务器,选 Minimal Install 或者 Server 都行,后面用本地仓库按需装包才是更干净的做法。如果不清楚自己需要什么,选 Server with GUI 也不是不行,只是会多装几百个包。这里我自己习惯是只选 Minimal Install,因为我有本地仓库,后面装什么完全可控,而且基础环境越干净排查问题越省事。
安装目标磁盘选择上,RHEL 9 默认使用 LVM 逻辑卷加 XFS 文件系统。XFS 是最稳的默认选项,不需要手动改,直接保持自动分区就好。最后设置 root 密码和创建普通用户,等安装完成重启进入系统。安装过程一般十到二十分钟,取决于介质速度。
3. 把 DVD ISO 挂成本地 dnf 仓库:最实用的核心操作
3.1 挂载 ISO 并确认目录结构
系统装完进入命令行,第一件事就是把 DVD ISO 挂载到系统里。如果系统是物理机带光驱的,插入光盘后执行:
bash复制sudo mkdir -p /mnt/rhel9
sudo mount /dev/sr0 /mnt/rhel9
如果是虚拟机里直接用 ISO 文件做光驱,或者你后来把 ISO 拷贝到了服务器本地路径,就用 loop 方式挂载:
bash复制sudo mkdir -p /mnt/rhel9
sudo mount -o loop /data/iso/rhel-baseos-9.2-x86_64-dvd.iso /mnt/rhel9
挂载完成后,用 ls /mnt/rhel9 看一眼。正常会看到 BaseOS、AppStream、images、EFI 等目录。如果连 BaseOS 和 AppStream 都没看到,说明 ISO 挂载有问题或者镜像不完整,不要继续往下配置,先检查挂载。
3.2 编写 BaseOS 与 AppStream 仓库配置
接下来在 /etc/yum.repos.d/ 目录下新建一个本地仓库文件,比如 rhel9-local.repo:
ini复制[rhel9-baseos]
name=RHEL 9 BaseOS (Local DVD)
baseurl=file:///mnt/rhel9/BaseOS
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[rhel9-appstream]
name=RHEL 9 AppStream (Local DVD)
baseurl=file:///mnt/rhel9/AppStream
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
其实 DVD 根目录下自带了一个 media.repo 文件,里面也有两个仓库定义,指向 file:///mnt/BaseOS 和 file:///mnt/AppStream,路径是按根目录挂载写的。如果你把 ISO 挂载到 /mnt 而不是 /mnt/rhel9,那直接用现成的 media.repo 也可以。但我个人更推荐自定义 repo 文件,路径清晰、可控性强,团队其他人接手时一眼就能看明白。
配置好之后执行:
bash复制sudo dnf clean all
sudo dnf repolist
dnf repolist 如果列出了 rhel9-baseos 和 rhel9-appstream 两个仓库,那说明配置成功了。这时候随便装一个包测试下,比如 dnf install -y vim,如果依赖能正常解析,就说明本地仓库已经可以正常使用了。
3.3 签名校验与 gpgkey 导入
RHEL 9 默认对软件包做 GPG 签名校验,这是安全机制的一部分。在 repo 配置里我写的是 gpgcheck=1,这种情况下第一次安装包时需要导入红帽的签名公钥。系统安装时一般已经自动导入了 /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release,但有些精简安装环境可能会漏掉,保险起见手动执行一次:
bash复制sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
如果你不导入 key,安装包时会报类似 "Public key for xxx.rpm is not installed" 的错误。很多新手看到这个就以为是网络问题,实际上是签名校验没过。另外,如果实在图省事,可以把 gpgcheck 改为 0 跳过校验,但生产环境我强烈不建议这么干,绕过签名校验等于把整个系统的包安全机制关闭了,内网里可能没事,但一旦环境被污染,你又无从察觉,风险太大。
3.4 开机自动挂载:一劳永逸的配置方法
仓库配置完成只是第一步,重启之后如果 /mnt/rhel9 没有自动挂载,所有依赖这个路径的仓库配置就全部失效了。为了避免每次开机都要手动 mount,需要把挂载信息写进 /etc/fstab。
如果你用的是物理光驱:
text复制/dev/sr0 /mnt/rhel9 iso9660 ro,nofail 0 0
如果你用的是 ISO loop 文件:
text复制/data/iso/rhel-baseos-9.2-x86_64-dvd.iso /mnt/rhel9 iso9660 loop,ro,nofail 0 0
这里我特别加了 nofail 字段,意思是设备或者文件不存在时,开机不因为这个挂载项报错,系统能正常进入。对于物理光驱来说这个字段尤其重要,因为如果你哪天把光盘拔了,没有 nofail 的话系统启动时挂载失败会直接进入 emergency mode,一台服务器就卡在那等你手工处理了。对于 loop 方式挂载 ISO 文件,nofail 同样保险,万一文件被人挪走了,开机也不至于起不来。
写完 fstab 后先执行 sudo mount -a 验证配置有没有问题,执行无误后再重启一次测试自动挂载是否生效。这一步加上去之后,本地仓库算是做到一劳永逸了。
4. 内网环境实操中的高频问题与排查技巧
4.1 系统未订阅导致 dnf 默认源不可用
RHEL 9 和 CentOS 在软件源机制上最大的差别就是订阅。系统默认的 yum 源全部来自红帽 CDN,没有有效订阅时,dnf repolist 会提示系统未注册,或者仓库列表为空,甚至某些命令会直接卡在等待订阅服务的状态。这是 RHEL 系列最让新手头疼的地方。
解决思路很直接:不依赖注册的订阅源,把本地 DVD 仓库作为唯一启用源。操作上就是先确认 /etc/yum.repos.d/redhat.repo 中默认仓库都是 enabled=0 状态(未订阅时通常是这样),然后配置本地 repo 文件,执行 dnf clean all 和 dnf repolist 确认仓库列表正常。这一步做好以后,系统完全不需要联网,所有包操作都在本地完成,这对内网环境来说反而是最理想的形态。
4.2 挂载 ISO 时找不到介质或者路径不对
最常见的一个错误是提示 "mount: no medium found on /dev/sr0"。如果是在虚拟机上,先去虚拟机的光驱设置里确认 ISO 已经连接且勾选了 "Connected" 选项。很多人创建虚拟机时把 ISO 挂上去了,但后来迁移快照之后连接状态变成未勾选,开机后系统里就看不到光盘了。
另一个容易踩的坑是设备名不对。物理机光驱可能是 /dev/sr0,也可能是 /dev/cdrom 的链接,不同机器可能有差异。稳妥的办法是用 lsblk 查看实际设备列表,找到 type 为 rom 的设备。如果你用的是 loop 挂载 ISO 文件,还要确认内核加载了 loop 模块,大部分 RHEL 9 默认都有,但如果出现 "mount: /dev/loop0: can't open the device" 之类的错误,可能是 loop 设备被占满或模块没加载,可以尝试 modprobe loop 之后重新挂载。
4.3 fstab 写错导致开机进入 emergency mode
/etc/fstab 是系统启动早期就要读取的文件,一旦内容写错,比如设备路径不存在、mount 参数不合法,系统就可能无法完成启动流程,直接进入 emergency mode。遇到这种情况别慌,输入 root 密码进入维护模式,首先执行:
bash复制mount -o remount,rw /
因为 emergency 模式默认根文件系统是只读的,先重新挂载为可写才能修改 fstab。然后打开 /etc/fstab,把刚才写错的那行注释掉或者修正,保存后执行 systemctl reboot 重启。这个流程我在不少服务器上处理过,很多都是把挂载点路径写错,或者忘了加 nofail 导致光驱没盘时系统起不来。所以我前面才反复强调,fstab 里的挂载项一定要带着 nofail,宁可启动时设备没挂上,也不能让整个系统卡死在启动阶段。
4.4 装不上某些应用包,本地源不是万能的
有同学配好本地源后,发现很多开发工具还是装不上,以为是自己配置有问题。其实不是,DVD ISO 里的软件包目录是固定的,它涵盖的是 RHEL 9 发行版基础软件集合,并不等于全网所有 rpm 包都能在这个源里找到。比如很多第三方软件源 EPEL 里的包,DVD ISO 里是没有的。
这种情况下我的建议是:在有外网的环境里,登录 EPEL 或相关软件源,把需要的内网离线安装包先下载成 .rpm 文件,再拷贝进内网,用 dnf install /path/to/xxx.rpm 的方式本地安装。如果能找到依赖包,也可以把 rpm 放在同一个目录下,然后用 dnf localinstall 或者 createrepo 烧录成本地仓库,这样就能在一个内网环境里逐渐沉淀出属于自己团队的应用软件包仓库。这个思路对于长期维护离线环境非常重要,DVD ISO 只是个起点,不是终点。
另外再提醒一个细节:如果你在安装系统时选了 Minimal Install,后续想批量装图形界面或者开发工具,直接用本地源执行 dnf groupinstall "Development Tools",一次性把编译工具链、gcc、make 这些拉齐,比一个一个包手动装省太多时间。
结尾:一些我踩过之后的个人体会
这套流程我自己从前到后跑过很多遍,每次在内网环境交付 RHEL 9 都会被问同一个问题:你们是不是有内部源服务器?不是,其实一张 DVD ISO 就解决了。不过我还是建议,在自己硬盘或者 /repo 目录里固定保留一份 ISO,不要放在容易被清理的临时目录。另外,配置本地仓库后,别急着把所有包一股脑装完,先把 Development Tools 这类基础工具组装齐,后面编译部署的时候你会感谢自己这个决定。这一套打底之后,再配合自己收集的 rpm 包慢慢扩充,内网服务器就再也不会卡在“装个包都费劲”这一步了。
