ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RHEL 9无可用软件源?dnf/yum仓库配置方法:国内镜像源与本地ISO源实战

RHEL 9无可用软件源?dnf/yum仓库配置方法:国内镜像源与本地ISO源实战 刚装完 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命令执行时会先扫描这个目录读取所有enabled1的仓库下载仓库元数据也就是软件列表然后根据列表去对应地址拉取 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.repovim /etc/yum.repos.d/cs9.repo写入以下内容以清华源为例[BaseOS] nameCentOS Stream $releasever - Base - tuna baseurlhttps://mirrors.tuna.tsinghua.edu.cn/centos/9-stream/BaseOS/$basearch/os/ enabled1 gpgcheck0 [AppStream] nameCentOS Stream $releasever - AppStream - tuna baseurlhttps://mirrors.tuna.tsinghua.edu.cn/centos/9-stream/AppStream/$basearch/os/ enabled1 gpgcheck0用阿里云源的话把地址换成baseurlhttps://mirrors.aliyun.com/centos/9-stream/BaseOS/$basearch/os/ baseurlhttps://mirrors.aliyun.com/centos/9-stream/AppStream/$basearch/os/这里有两个地方特别容易踩坑第一路径中的9-stream必须写死不能用$releasever变量自动替换。因为 RHEL 系统的$releasever默认是9而镜像站的目录名是9-stream如果写成$releasever/BaseOS实际访问的就是/centos/9/BaseOS/404 错误没跑了。第二gpgcheck0是配合学生场景的临时做法因为红帽系统里没有 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 两个仓库都处于启用状态了。接下来随便装一个软件验证最小化系统里最常用的就是wgetdnf 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] nameRHEL DVD - BaseOS baseurlfile:///mnt/cdrom/BaseOS enabled1 gpgcheck0 [AppStream] nameRHEL DVD - AppStream baseurlfile:///mnt/cdrom/AppStream enabled1 gpgcheck0注意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/下是否有enabled1的文件Cannot find a valid baseurlbaseurl 路径不存在确认镜像站路径、$releasever是否写错、挂载目录是否存在Public key for xxx.rpm is not installed开了 gpgcheck 但没导入 key暂时gpgcheck0或导入对应仓库的 GPG keyFailed 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/AppStream5.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 makecacheBaseOS 仓库直接报 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 文件明明存在。这时候多半是仓库被enabled0了或者文件后缀不是.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我的建议是配置练习阶段统一gpgcheck0把功能跑通再考虑安全校验。如果以后在正式环境、生产服务器上部署再认真导入官方 key 并开启校验。RedHat 系系统导入 GPG key 的命令是rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release但如果你的环境是 RHEL 配 CentOS Stream 源这个 redhat key 也不匹配。所以最简单的临场处理还是gpgcheck0同时确保 https 访问避免中间人问题对学生实验来说足够安全了。5.5 几个保命小习惯配置源的次数多了我总结出几个保命习惯希望对你有用第一不要直接删 repo 文件移动到 backup 目录。删掉容易重建时需要回忆原内容很浪费时间移动到 backup 目录后随时可以恢复。第二配置前先拍虚拟机快照。尤其是做源这种会动系统目录的操作出错后恢复快照比手工排查快得多。学生党最惨的不是配错而是配错以后系统起不来又不想重装。第三本地源和网络源不要同时开启。RHEL 的本地 DVD 仓库和 CentOS Stream 网络仓库虽然包的大版本一致但具体版本号可能不同同时开启容易造成依赖冲突甚至出现“同一个包两个版本”的诡异现象。用哪个开哪个其他仓库设为enabled0。第四先定位网络问题再配置源。不少同学把 repo 文件改了几十遍都不成功最后发现是虚拟机根本连不上网。配源前的自检那几步别嫌麻烦真的管用。我现在的习惯是宿舍里用国内镜像源解决日常软件安装到了断网机房直接挂载那张 ISO 切到本地源。两种方案各准备一个 repo 文件用的时候修改enabled就能快速切换既保证了速度也保证了离线能力。希望这篇文章能帮你少走点弯路下次再遇到“红帽装完装不了软件”的问题不再是一脸懵。
返回列表