刚装完 RedHat 9.0 的那一刻,你应该也经历过这种“系统是新的,但仓库是空的”的尴尬。
在实验室电脑上装好系统,兴奋地打开终端,第一件事当然是敲dnf install vim。结果系统直接怼回来一句 “There are no enabled repositories”。一开始我还以为是网络问题,后来才明白,红帽官方仓库压根不向普通用户开放,需要先注册订阅(subscription-manager),而注册订阅又需要红帽账号、开发者订阅或学校授权。对只想把课程作业跑起来的学生来说,这层门槛比想象中麻烦得多。
于是就有了今天的这些经验。我不打算教你破解订阅,只分享学生党最实用、也最稳妥的两条路:一条是配置国内镜像源,适合宿舍/实验室能上网的环境;另一条是搭建本地源,适合机房断网、手里只有 ISO 安装镜像的离线环境。两条路我都实际跑过,今天一次性讲清楚,顺便把踩过的坑也记录下来。
1. 为什么红帽装完总像“裸奔”:仓库和订阅的那些事
很多从 Ubuntu 转过来的同学,第一反应是上网搜“RedHat 9.0 国内镜像源”,然后发现一个残酷的事实:红帽官方仓库在国内根本没有公开镜像,官方默认源必须用订阅账号登录后才能看到。要搞懂这个问题,得先弄明白包管理器的“源”到底是什么。
1.1 源到底是什么
可以把 yum/dnf 的软件源理解成手机应用商店。Ubuntu 自带的应用商店默认连到全世界的服务器,换源就是给它换一个更快的应用商店入口;而 RedHat 系的软件管理逻辑也差不多,只不过它的配置文件是一段一段的.repo文件,放在/etc/yum.repos.d/目录下。
每个.repo文件里写着软件仓库的地址、是否启用、是否校验 GPG 签名等信息。dnf install命令执行时,会先扫描这个目录,读取所有enabled=1的仓库,下载仓库元数据(也就是软件列表),然后根据列表去对应地址拉取 RPM 包。
所以当终端提示 “There are no enabled repositories” 时,意思就是dnf扫描了一圈,发现没有任何可用的仓库地址。系统是装好了,但“软件商店”是空的,什么都装不了。
1.2 红帽官方源为什么不能直接用
红帽(Red Hat)的企业级 Linux 产品 RHEL(也就是我们口中的 RedHat 9.0)和 CentOS 最大的区别,在于它的软件仓库是收费订阅制的。官方仓库里不仅有 BaseOS、AppStream 等常用仓库,还有各类扩展仓库,但这些仓库的元数据需要通过subscription-manager register注册你的红帽账号之后才能获取。
学生党最常见的三种情况:
- 没有红帽账号,或者注册完发现免费订阅只能绑定几台机器;
- 在虚拟机里装的 RHEL,不想为了装个
gcc去折腾订阅认证; - 校园网、机房网络虽然能上外网,但跑
dnf makecache时连接红帽官方服务器特别慢,经常超时。
这就导致“白装了一个系统”的错觉。实际上系统本身没问题,真正的问题是仓库没配好。
1.3 学生党的三条可行路线
| 路线 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 官方开发者订阅 | 想用纯正 RHEL 仓库,且能注册红帽账号 | 软件包最全、最正宗 | 注册流程麻烦,免费订阅有限制 |
| 国内镜像源(兼容仓库) | 宿舍/实验室有网,追求速度 | 配置快、下载快、软件多 | 本质是借用 CentOS Stream 仓库,版本不完全等同于 RHEL |
| 本地源(ISO 挂载) | 机房断网、内网隔离、考试环境 | 完全离线可用,稳定可靠 | 只能装 ISO 里自带的软件包,扩展性差 |
我在课程作业和日常虚拟机里用得最多的是“国内镜像源 + 本地源”组合:平时在宿舍用镜像源联网装软件,到了断网的机房,挂载同一张 ISO 就是现成的本地源。两种方案相互独立,配好一次能省一学期的事。
2. 动手前准备:镜像下载、系统安装与网络自检
这一步千万别跳过。很多时候配置源失败,不是命令的问题,而是系统环境本身就有隐患,比如 ISO 下载不完整、安装时没开网络、最小化装完自带工具太少等等。
2.1 拿到 RedHat 9.0 安装镜像
标题里说的“RedHat 9.0”,正式名称是 RHEL 9。下载安装镜像有两个常用渠道:
- 红帽官网注册开发者账号后,可以从官方下载中心拿到 ISO;
- 学校/实验室提供的校内镜像站,或者老师直接发的安装包。
拿到 ISO 后第一件事是校验完整性。Linux 下用系统自带的校验工具检查,Windows 下可以用命令或图形工具算一下 SHA256,确保和你拿到的校验值一致。这一点学生容易忽略,如果镜像损坏,VMware 里安装刚开始就会报“找不到安装源”之类的错。
2.2 虚拟机安装时别忽略“最小化”
我强烈建议学生用 VMware Workstation 或 VirtualBox 装 RHEL 9,而不是直接在物理机上开干。虚拟机有两大好处:一是可以随时拍快照,配坏了恢复只需要 10 秒;二是虚拟机的光驱可以直接挂载 ISO 文件,对后面做本地源非常方便。
安装到“软件选择(Software Selection)”这一步时,默认“带 GUI 的服务器”会装一堆图形包,等的时间很久。如果只是练命令、搭服务、跑实验,直接选“最小化安装(Minimal Install)”即可。最小化系统占资源少,启动也快,后面缺什么用dnf补什么,反而能真正理解软件包管理的过程。
选最小化安装的另一个原因在于:本地源的验证场景更真实。GUI 系统自带很多共享库,你很难判断dnf install gcc到底有没有真的从仓库拉包成功;最小化系统干干净净,装没装上一目了然。
2.3 装完第一件事:查看系统信息
系统装完后,先别急着配源,用几个命令确认一下基本信息:
cat /etc/redhat-release uname -m dnf repolist df -hcat /etc/redhat-release看一下当前的 RHEL 大版本号,后面的配置要依赖这个版本信息;uname -m确认架构,绝大多数 x86 机器输出x86_64,也有同学在用 ARM 虚拟机,路径会不同;dnf repolist查看当前已经启用的仓库列表——刚才说了,红帽默认没有启用任何仓库,所以大概率输出空列表;df -h确认磁盘剩余空间,避免后续软件装到一半磁盘满了。
2.4 网络能不能用,先测两行命令
很多同学配置镜像源失败,最后排查了半天,才发现虚拟机压根没联网。三个命令快速确认:
ip a ping -c 3 mirrors.tuna.tsinghua.edu.cn ping -c 3 223.5.5.5第一行看网卡有没有拿到 IP,第二行测域名能不能解析、通不通,第三行是直接 ping 阿里 DNS 的 IP。如果第二行失败但第三行成功,说明 DNS 配置有问题;如果两个都失败,检查虚拟机的 NAT/桥接模式设置。这一步能帮你快速排除“源写错了”之外的网络因素。
3. 方案A:配置国内镜像源,让宿舍网络满血复活
必须有网才能用这个方案。我测试下来,清华源和阿里源速度都还不错,学生在校园网环境下,下载速度能达到 10MB/s 以上,和红帽官方源动不动几 KB/s 相比完全是两个世界。
3.1 为什么选 CentOS Stream 9 兼容源
这里必须说清楚一个关键点:国内镜像站(清华、阿里、中科大等)并没有提供“RHEL 官方仓库”的镜像,因为红帽官方仓库本身需要订阅认证,镜像站没法直接同步。
那为什么还能配国内源?因为我们借用的对象是 CentOS Stream 9。RHEL 9 和 CentOS Stream 9(以及 Rocky Linux、AlmaLinux 9)在软件包层面高度兼容,因为 CentOS Stream 本来就是 RHEL 的上游/开发版,很多 RPM 包可以直接通用。对于学生做实验、跑课程项目来说,用 CentOS Stream 的仓库来给 RHEL 装软件,是目前最简单、最合法的替代方案。
要提醒的是:这并不完全等于 100% 兼容。个别软件可能因为库版本差异装不上或运行异常,但概率很低。真遇到装不上的包,再考虑本地源或者官方订阅也不迟。
3.2 禁用官方订阅源,别乱删
RHEL 9 安装完,/etc/yum.repos.d/目录下通常会存在几个redhat.repo或类似命名的文件,这些默认仓库指向红帽官方订阅服务。最佳实践不是rm删掉,而是重命名禁用:
cd /etc/yum.repos.d/ mkdir backup mv redhat.repo backup/把不用的源移到backup/目录里,之后想恢复直接挪回来,不用重新编辑。避免新手手抖把系统自带的 repo 文件删了又想找回的麻烦。
3.3 写 repo 文件:清华源/阿里云源配置
接下来在/etc/yum.repos.d/目录下新建一个 repo 文件,名字可以随便起,比如cs9.repo:
vim /etc/yum.repos.d/cs9.repo写入以下内容(以清华源为例):
[BaseOS] name=CentOS Stream $releasever - Base - tuna baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/9-stream/BaseOS/$basearch/os/ enabled=1 gpgcheck=0 [AppStream] name=CentOS Stream $releasever - AppStream - tuna baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/9-stream/AppStream/$basearch/os/ enabled=1 gpgcheck=0用阿里云源的话,把地址换成:
baseurl=https://mirrors.aliyun.com/centos/9-stream/BaseOS/$basearch/os/ baseurl=https://mirrors.aliyun.com/centos/9-stream/AppStream/$basearch/os/这里有两个地方特别容易踩坑:
第一,路径中的9-stream必须写死,不能用$releasever变量自动替换。因为 RHEL 系统的$releasever默认是9,而镜像站的目录名是9-stream,如果写成$releasever/BaseOS,实际访问的就是/centos/9/BaseOS/,404 错误没跑了。
第二,gpgcheck=0是配合学生场景的临时做法,因为红帽系统里没有 CentOS Stream 的 GPG key,直接开签名校验会报 “Public key not available” 的错误。如果想要更安全,也可以先下载 CentOS Stream 的公共 key 再导入,但对大多数实验环境来说,先关闭校验把源跑通更重要。
3.4 刷新缓存并验证安装
写完 repo 文件以后,执行刷新:
dnf clean all dnf makecache如果前面的配置没问题,makecache会显示下载元数据的进度条,最后输出 “Metadata cache created.” 之类的结果。再执行:
dnf repolist就能看到 BaseOS 和 AppStream 两个仓库都处于启用状态了。
接下来随便装一个软件验证,最小化系统里最常用的就是wget:
dnf install -y wget装完用wget --version确认可用。这一步跑通,说明国内镜像源已经配置成功,后面装gcc、make、vim、git都是同样的操作。
3.5 可选:EPEL 扩展源怎么装
CentOS Stream 源解决了基础软件和常用软件,但有些包(比如htop、ncdu、fail2ban)在 BaseOS/AppStream 里根本没有,这时候就要加 EPEL 源。EPEL 是 Fedora 社区维护的扩展软件仓,里面都是红帽系通用的软件包。
正常 CentOS 系统直接用dnf install epel-release就能装,但 RHEL 里没有这个包。一个学生友好的操作方法是:先把 EPEL 的 rpm 包下载回来再安装。清华源里也有:
cd /tmp wget https://mirrors.tuna.tsinghua.edu.cn/epel/epel-release-latest-9.noarch.rpm rpm -ivh epel-release-latest-9.noarch.rpm安装完成后,/etc/yum.repos.d/下会出现epel.repo和epel-testing.repo,再去把源地址手动改成清华镜像站就行。EPEL 源同样建议把gpgcheck改为0或者导入其 key,否则可能又卡在签名校验上。
4. 方案B:本地源搭建,断网机房也能装软件
如果说镜像源解决的是“有网但慢”的问题,那本地源解决的就是“完全没网也不慌”的问题。我大二那会儿,学校机房的网络经常全校断网,老师又要求当场装环境跑程序,这时候手里的一张某 RHEL ISO 就是救命稻草。
4.1 本地源的核心逻辑
RHEL 9 的 DVD 安装镜像本身就是一个完整的软件仓库。ISO 里面有BaseOS和AppStream两个目录,里面存放了大量 RPM 包,以及对应的repodata元数据。只要把这个 ISO 挂载到文件系统里,再写 repo 文件指向挂载目录,dnf就能从里面装软件,全程不需要联网。
这就是所谓“本地源”,本质上和手机把安装包下载到内存卡里离线安装一样。RHEL 9 所有 DVD 镜像中,BaseOS 目录负责系统基础软件,AppStream 目录负责应用软件和运行时环境,两个都必须配置。
4.2 挂载 ISO 镜像
有两种情况:一种是虚拟机光驱直接挂载了 ISO,另一种是 ISO 文件已经拷贝到了硬盘某个目录。
虚拟机光驱方式,RHEL 9 装完系统后,光驱设备通常是/dev/sr0,执行:
mkdir -p /mnt/cdrom mount /dev/sr0 /mnt/cdrom如果 ISO 文件已经放到/root/rhel-9.x.iso,用 loop 方式挂载:
mkdir -p /mnt/cdrom mount -o loop /root/rhel-9.x.iso /mnt/cdrom挂载成功后,可以ls /mnt/cdrom看到根目录下有BaseOS、AppStream等目录,说明 ISO 内容已经可见。
4.3 写本地 repo 文件
同样在/etc/yum.repos.d/里新建一个文件,比如dvd.repo:
[BaseOS] name=RHEL DVD - BaseOS baseurl=file:///mnt/cdrom/BaseOS enabled=1 gpgcheck=0 [AppStream] name=RHEL DVD - AppStream baseurl=file:///mnt/cdrom/AppStream enabled=1 gpgcheck=0注意baseurl的格式是file://后面跟绝对路径,三个斜杠后面紧跟目录,多一个少一个都不行。gpgcheck同样先设为0,因为 DVD 官方包的校验 key 不一定在最小化系统里。
配置好后执行:
dnf clean all dnf makecache dnf repolist如果能看到 BaseOS 和 AppStream 两个 repo 且数字不是 0,本地源就通了。
4.4 开机自动挂载
断网环境下的虚拟机,重启后 ISO 挂载会失效,repo 源当然也用不了,每次都得手动mount一遍很烦。把它写进/etc/fstab实现开机自动挂载:
echo "/dev/sr0 /mnt/cdrom iso9660 defaults,ro 0 0" >> /etc/fstab重启后执行df -h | grep cdrom检查是否自动挂载成功。如果安装方式不是光驱而是 ISO 文件,则把第一列改成对应文件路径,格式不变。这个操作我强烈建议在还没配置任何业务软件的干净系统上先写完,否则重启完发现源没了,那种感觉真的很酸爽。
4.5 实际验证:从零安装 gcc
光配置完不算数,实装一次才让人放心。断网环境下最典型的场景就是装编译工具链:
dnf install -y gcc make如果一切顺利,系统会自动从/mnt/cdrom/BaseOS和/mnt/cdrom/AppStream拉取依赖包,整个过程不需要外网。装完后写个最简单的 C 文件测试:
cat > hello.c <<EOF #include <stdio.h> int main() { printf("hello local repo\n"); return 0; } EOF gcc hello.c -o hello ./hello看到一个可执行文件正常输出,比任何检查命令都有说服力——本地源这条路彻底走通了。
5. 常见问题与避坑记录
以下问题都是我在实际配置过程中遇到过的,有学生最常见的,也有我自己摸索很久才解决的。整理成速查表先过一遍,后面再挑几个展开讲。
5.1 问题速查表
| 现象 | 常见原因 | 解决办法 |
|---|---|---|
There are no enabled repositories | 没有启用任何 repo | 检查/etc/yum.repos.d/下是否有enabled=1的文件 |
Cannot find a valid baseurl | baseurl 路径不存在 | 确认镜像站路径、$releasever是否写错、挂载目录是否存在 |
Public key for xxx.rpm is not installed | 开了 gpgcheck 但没导入 key | 暂时gpgcheck=0,或导入对应仓库的 GPG key |
Failed to download metadata for repo | 网络不通、DNS 无法解析、镜像站临时故障 | 先 ping 域名;换一个镜像站试 |
mount: /mnt/cdrom: wrong fs type | 设备不是 ISO9660 或者设备名不对 | 用lsblk查看真实设备名 |
安装软件提示Nothing provides ... | 包在仓库里不存在,或仓库版本与系统不兼容 | 开启 EPEL 源;或改用官方订阅源 |
Error: Protected multilib versions | 仓库同时提供 32 位和 64 位包冲突 | 关闭多余 repo,只保留一个 BaseOS/AppStream |
5.2 案例一:ISO 挂载失败
有次在 VirtualBox 里挂载 RHEL 9 ISO,执行mount /dev/sr0 /mnt/cdrom直接报wrong fs type, bad option, bad superblock。我一度以为 ISO 损坏,折腾半天才发现问题出在光驱设备名上。
VirtualBox 挂载的光驱不一定叫/dev/sr0,它可能是/dev/sr1或者通过 SATA 控制器识别成了/dev/cdrom之外的名称。排查方法很简单:
lsblk blkidlsblk能列出所有块设备,一眼看出光驱到底对应哪个名字;blkid可以看到设备格式。如果你用的 VMware 虚拟机,光驱默认多数是/dev/sr0,但装了多个光驱或者连接了 U 盘的情况就要注意。
另外,在最小化系统里,有时候没有安装kmod相关的模块,loop 设备不可用,执行mount -o loop也会失败。可以先modprobe loop加载模块,再挂载一次。
5.3 案例二:makecache 404 和 repolist 为 0
这个坑几乎每个配过 CentOS Stream 源的 RHEL 用户都会碰到。
我刚配置完国内镜像源,执行dnf makecache,BaseOS 仓库直接报 404。打开浏览器访问清华源目录才发现问题:镜像站目录是https://mirrors.tuna.tsinghua.edu.cn/centos/9-stream/BaseOS/x86_64/os/,而我把 repo 文件里的路径写成了$releasever/BaseOS/,系统自动替换成了9/BaseOS/,这个目录根本不存在。
解决方案前面也提了:写死9-stream而不是用$releasever变量。同理,如果你想用阿里源,路径开头必须是centos/9-stream/,如果写成centos/9/,一样是 404。
另一个常见现象是dnf repolist输出为空,但 repo 文件明明存在。这时候多半是仓库被enabled=0了,或者文件后缀不是.repo。dnf只认/etc/yum.repos.d/目录下以.repo结尾的文件,名字写成了.repo.bak虽然重命名安全,但也意味着它不被加载。
5.4 案例三:gpg key 校验失败
GPG 是软件包签名校验机制,相当于确认“这个 RPM 确实是官方发布的,而不是被篡改过的”。国内镜像站里下载的包虽然大概率没问题,但学生的实验环境里,经常因为找不到 key 导致安装中断:
Public key for gcc-xxx.rpm is not installed我的建议是,配置练习阶段统一gpgcheck=0,把功能跑通再考虑安全校验。如果以后在正式环境、生产服务器上部署,再认真导入官方 key 并开启校验。RedHat 系系统导入 GPG key 的命令是:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release但如果你的环境是 RHEL 配 CentOS Stream 源,这个 redhat key 也不匹配。所以最简单的临场处理还是gpgcheck=0,同时确保 https 访问避免中间人问题,对学生实验来说足够安全了。
5.5 几个保命小习惯
配置源的次数多了,我总结出几个保命习惯,希望对你有用:
第一,不要直接删 repo 文件,移动到 backup 目录。删掉容易,重建时需要回忆原内容,很浪费时间;移动到 backup 目录后,随时可以恢复。
第二,配置前先拍虚拟机快照。尤其是做源这种会动系统目录的操作,出错后恢复快照比手工排查快得多。学生党最惨的不是配错,而是配错以后系统起不来又不想重装。
第三,本地源和网络源不要同时开启。RHEL 的本地 DVD 仓库和 CentOS Stream 网络仓库,虽然包的大版本一致,但具体版本号可能不同,同时开启容易造成依赖冲突,甚至出现“同一个包两个版本”的诡异现象。用哪个开哪个,其他仓库设为enabled=0。
第四,先定位网络问题再配置源。不少同学把 repo 文件改了几十遍都不成功,最后发现是虚拟机根本连不上网。配源前的自检那几步,别嫌麻烦,真的管用。
我现在的习惯是:宿舍里用国内镜像源解决日常软件安装,到了断网机房,直接挂载那张 ISO 切到本地源。两种方案各准备一个 repo 文件,用的时候修改enabled就能快速切换,既保证了速度,也保证了离线能力。希望这篇文章能帮你少走点弯路,下次再遇到“红帽装完装不了软件”的问题,不再是一脸懵。