CentOS 10本地yum源配置指南:ISO挂载与repo文件详解

发布时间:2026/10/23 5:43:41
CentOS 10本地yum源配置指南:ISO挂载与repo文件详解 CentOS 10也就是 CentOS Stream 10出来之后我身边不少人踩到的第一个坑就是包管理。默认源卡、部分源失效、装软件反复超时这些在老版本上忍一忍就算了但到 10 这一代DNF5 带来了不少行为变化网上很多旧版 yum 源配置教程直接不能照搬。我最近在两台干净的 CentOS 10 机器上重装了系统把本地 yum 源挂载这套流程完整过了一遍包括 ISO 镜像挂载、repo 文件编写、缓存刷新以及开机持久化现在把过程记录下来给同样需要离线装包或者做内网源的朋友做一个参考。这套方案解决的核心问题很明确在没有外网或者网络不稳定的环境里用 CentOS 10 的安装镜像作为软件源通过本地挂载的方式让 dnf/yum 能够顺利安装、升级软件。整个过程不依赖任何额外服务一条 mount 命令加一个 repo 文件就能干活。适合刚接触 CentOS 10 的新手也适合需要在隔离网络内部署环境的运维人员。1. 为什么 CentOS 10 一定要自己配 yum 源1.1 CentOS 10 的包管理变化到底有多大CentOS 10 已经不是过去那个“免费 RHEL 复制版”了它是 CentOS Stream 模式下的下一个大版本。最直接的感受是包管理器从 yum 换成了 DNF5。命令层面yum还是能用的因为它是 dnf 的符号链接但底层解析逻辑、缓存目录、仓库配置的读取方式都有变化。官方默认带的仓库虽然好用但很多时候你拿到的机器是精简安装或者所在的网络环境访问不了外部镜像站。还有更常见的情况是公司内网完全离线装系统的时候用了 CentOS 10 的 ISO结果装完发现想装个 vim、nginx、编译工具链都报错因为系统默认没有可用的软件源。这时候本地挂载 ISO 镜像就成了最务实的解。1.2 三种典型场景对照我总结了一下自己遇到的情况基本可以归成三类。第一类纯离线环境。内网机器不允许出网光盘或者 U 盘里有 CentOS 10 的安装镜像这时候把镜像挂到本地目录配置成 file:// 源所有 rpm 包全部本地读取速度极快还不受带宽限制。第二类网络源质量太差。有些网络环境下外部镜像站连通性不稳定装个包要重试好多次。本地挂载镜像做兜底源再用默认源做补充两边共存互不干扰。第三类局域网互联。一台机器挂载好镜像后通过 NFS 或者 HTTP 共享出去整个网段的机器一起用不用每台都去手动挂 ISO。1.3 搞懂“挂载”和“yum 源”之间的关系很多新手一开始会把“挂载”和“配置源”当成两件事其实它们是一件事的前后两步。挂载是操作系统层面的动作把 ISO 镜像文件变成一个可访问的目录配置 yum 源则是包管理器层面的动作告诉 dnf 去哪个目录找 repodata 元数据和 rpm 包。打个比方挂载就是把一箱零件搬到操作台上配置源就是告诉装配工“零件在工具箱第二个抽屉里”。抽屉没搬到位后面的配置怎么都白搭。所以每一步都要确认清楚尤其是挂载完成后的目录结构很多人就是栽在这里。2. 拿到镜像后先别急看清目录结构再动手2.1 ISO 镜像里的仓库目录和旧版本完全不同如果你用过 CentOS 7 甚至更早的版本可能会记得挂载 ISO 之后repodata 目录就在根目录下一个源搞定所有事情。但 CentOS 8 之后就改了ISO 根目录下不再直接放 repodata而是按仓库拆分为 BaseOS、AppStream 等子目录。CentOS 10 延续了这个设计。镜像挂载后典型的目录结构是这样的/mnt/cdrom/ ├── AppStream/ │ ├── repodata/ │ └── Packages/ ├── BaseOS/ │ ├── repodata/ │ └── Packages/ ├── CRB/ │ ├── repodata/ │ └── Packages/ ├── images/ └── isolinux/这里的关键点在于每个仓库子目录都有属于自己的 repodata/repomd.xml 文件。写 yum 源时baseurl 必须精确指到仓库子目录这一层而不是指到 /mnt/cdrom 根目录。如果指到根目录dnf 会报找不到 repomd.xml。我见过太多照搬 CentOS 7 旧教程的案例把 baseurl 写成 file:///mnt/cdrom然后 makecache 报错第一反应是网络问题查半天最后才发现是路径层级不对。2.2 创建挂载点与文件校验开始动手之前做三件准备工作。第一步创建挂载点我习惯用 /mnt/cdrom简单好记mkdir -p /mnt/cdrom第二步确认镜像文件完整。ISO 文件如果下载不完整或者校验值不对mount 可能能挂上但读取到某个 rpm 包时会报文件系统错误或者 CRC 错误。下载页面一般会提供 SHA256 校验值用 sha256sum 比对。sha256sum CentOS-Stream-10-*.iso第三步确认当前用户有 root 权限。mount 和修改 /etc/yum.repos.d/ 下的文件都需要 root 身份建议直接切到 root 或者用 sudo。2.3 一个容易被忽略的细节loop 设备ISO 镜像本身是一个普通文件要通过 loop 设备把它模拟成块设备才能挂载。现在主流内核都启用了 loop 模块大多数情况下 mount -o loop 直接能用。但极简安装的内核可能没加载挂载时报no loop device available或者提示找不到 loop 设备。处理办法很简单手动加载模块再重试modprobe loop如果还不行检查 /dev/loop0 是否存在。存在的话用显式指定方式挂载mount -o loop/dev/loop0 CentOS-Stream-10-*.iso /mnt/cdrom3. 实测挂载 ISO 并写 repo 文件一个完整流程3.1 挂载命令的选择与验证把 ISO 挂到 /mnt/cdrom。如果镜像文件就在当前目录命令直接写mount -o loop CentOS-Stream-10-*.iso /mnt/cdrom这里有个自检小技巧挂载完不要急着配源先看目录有没有挂对。用 df 或者 lsblk 检查lsblk | grep cdrom输出里应该能看到 /dev/loop0 以及后面的挂载点 /mnt/cdrom。接着进入目录逐个查看仓库子目录ls /mnt/cdrom/ ls /mnt/cdrom/BaseOS/repodata/repomd.xml ls /mnt/cdrom/AppStream/repodata/repomd.xml只要 repomd.xml 文件存在路径就没问题。这是整个配置过程中最重要的验证动作。3.2 编写本地 repo 文件两个仓库别漏CentOS 10 下官方大仓库至少包含 BaseOS 和 AppStream安全相关软件可能还要用到 CRB。我建议大家在 repo 文件里把镜像里存在的仓库都写进去用不到的时候反正也不影响需要的时候就能直接用。在 /etc/yum.repos.d/ 下新建一个独立文件不要随便改动系统自带的那些 repo 文件。我习惯命名为 local.repo内容如下[c10-local-baseos] nameCentOS Stream 10 - Local BaseOS baseurlfile:///mnt/cdrom/BaseOS enabled1 gpgcheck0 [c10-local-appstream] nameCentOS Stream 10 - Local AppStream baseurlfile:///mnt/cdrom/AppStream enabled1 gpgcheck0 [c10-local-crb] nameCentOS Stream 10 - Local CRB baseurlfile:///mnt/cdrom/CRB enabled1 gpgcheck0注意看 baseurl 的写法file://协议后跟的是绝对路径不是普通的文件路径写法。有人写成file:///mnt/cdrom/BaseOS也有人会漏掉一个斜杠结果 dnf 怎么都识别不了。3.3 刷新缓存并验证源可用配置写完先清理缓存再重建dnf clean all dnf makecacheDNF5 下 makecache 的输出会有进度条如果看到Metadata cache created或者类似表述说明源没问题。然后执行dnf repolist输出里应该能看到 c10-local-baseos 和 c10-local-appstream 这两个仓库状态是启用的。再做一次真正的软件安装测试最好选一个镜像里肯定包含的包dnf install -y vim-enhanced如果能顺利解析依赖并完成安装说明本地源已经完全可用。这一步我每次都会做因为 repolist 正常不代表包真的在预期路径只有实际装一次才能确认。3.4 开机自动挂载fstab 的正确姿势机器一旦重启手动 mount 的 ISO 就会掉。如果你的环境需要长期使用本地源得把挂载关系写进 /etc/fstab。格式如下/path/to/CentOS-Stream-10-xxx.iso /mnt/cdrom iso9660 loop,ro 0 0第一列写镜像文件的完整路径第二列写挂载点第三列文件系统类型先用 iso9660第四列是挂载选项loop 表示作为 loop 设备挂载ro 表示只读。如果镜像文件系统实际是 UDF 格式第三列改成 udf 即可这个在挂载报wrong fs type的时候可以试。写完之后先别急着直接 reboot用下面命令验证 fstab 配置没有语法错误mount -a如果没有新报错这条命令什么都不会输出。它会把 fstab 里没挂上的条目全部挂一遍。确认没问题后再重启或者直接mount -o loop /path/to/CentOS-Stream-10-xxx.iso手动挂载也可以反正最终效果一致。补充一个细节fstab 里镜像路径如果包含空格需要用转义符\040替代空格。不想记这个规则的话最简单的办法是把 ISO 文件放到一个没有空格的路径下比如 /opt/iso/ 目录。4. 排坑实录容易翻车的细节一次说完4.1 网络旧教程最容易误导的 repomd.xml 报错这是我在各个平台上被问得最多的问题。报错信息大致长这样Errors during downloading metadata for repository c10-local-baseos: - Curl error (-37): Couldnt open file /mnt/cdrom/repodata/repomd.xml问题基本都出在 baseurl 指向了 /mnt/cdrom也就是镜像根目录。老版本 CentOS 7 这么写没问题但 CentOS 10 的 ISO 里repodata 被拆到 BaseOS、AppStream 等子目录。解决办法就是把 baseurl 改成指向对应仓库子目录。还有一种情况是目录结构里根本没有 BaseOS 目录只有 packages 或者 repodata 直接出现在根目录这种一般是用了精简版镜像或者 boot ISO。精简版镜像的 packages 很少不适合做完整本地源建议换成 DVD 版或者完整版 ISO。4.2 gpgcheck 到底要不要开我在本地源的配置里默认写了 gpgcheck0这是有意为之。离线环境下如果镜像本身来源可靠关掉签名检查是最省事的做法因为 CentOS 10 的密钥文件名在不同版本里有差异我在 /etc/pki/rpm-gpg/ 下见过好几个不同命名的 key 文件手动指定 gpgkey 如果写错文件名反而会报Public key for xxx.rpm is not installed。如果对安全要求高必须开签名检查先把官方密钥导入rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-*然后把 repo 文件里的 gpgcheck 改成 1并去掉 gpgkey 那一行的注释。注意导入密钥的命令里通配符的含义把目录下所有密钥一次性导入避免漏掉导入。验证装包时不再报公钥错误就算配置成功。4.3 DNF5 命令行为差异CentOS 10 默认的包管理是 DNF5和之前的 dnf 4 相比有几个细节需要注意。第一dnf clean all和dnf makecache仍然有效但缓存目录路径可能不同清理完输出会提示缓存目录位置不用特别在意。第二dnf repolist仍然可用但想看到更详细的信息用dnf repolist -v。在 DNF5 里部分选项的缩写形式变了有些旧脚本里写的yum --noplugins这样的参数不一定继续兼容。第三yum命令在 CentOS 10 中是存在的它是指向 dnf 的符号链接。但不要因此就认为所有 yum 插件都能继续用有些第三方插件没有适配 DNF5加载时会报警告。如果警告不影响装包可以忽略如果有影响把 /etc/yum.conf 里相关的插件配置注释掉。4.4 想要禁用网络源只保留本地源怎么操作有些场景要求安装软件必须全部来自本地源比如离线安全审计。这时候直接把系统自带的仓库全部禁用再安装时指定仅用本地仓库dnf install --disablerepo* --enablerepoc10-local-* nginx这条命令的星号要注意用单引号包住防止 shell 通配符展开。还有一种做法是直接编辑 /etc/yum.repos.d/ 下系统自带的 repo 文件把每个源的 enabled1 改成 enabled0不过这样改动面太大而且系统升级时有可能被覆盖不如安装时手动指定来得干净。4.5 makecache 卡住不动的解决思路本地挂载源理论上是纯本地读取不该卡住。但如果你用的不是 file:// 协议配的源而是用 http:// 指向局域网内的共享服务makecache 卡住多半是网络服务的问题。先 curl 测试一下 baseurl 的 HTTP 响应是否正常curl -I http://192.168.1.10/centos10/BaseOS/repodata/repomd.xml如果响应正常再检查客户端 DNS 和防火墙。如果响应超时排查服务端 nginx 权限配置重点看目录是否有 execute 权限repodata 文件是否能正常读取。注意不要把这个问题带进本地挂载场景自己切源时先确认用的是 file:// 协议。5. 本地源还能怎么玩局域网共享与离线同步5.1 一台机器挂载整个内网共用本地挂载如果只在一台机器上用其实有点浪费。我一般在服务器上挂载好 ISO 后通过 NFS 共享给内网的其他机器。服务端操作dnf install -y nfs-utils mkdir -p /srv/centos10 mount -o loop CentOS-Stream-10-*.iso /mnt/cdrom这里不建议直接把 /mnt/cdrom 作为 NFS 导出目录某些情况下 loop 挂载的目录权限会有限制跨国 NFS 授权时有点别扭。我习惯把 ISO 内容重新 bind 到另外的导出目录mkdir -p /srv/centos10 mount --bind /mnt/cdrom /srv/centos10然后在 /etc/exports 里加一行/srv/centos10 192.168.1.0/24(ro,sync,no_root_squash)改完导出配置后生效exportfs -ra客户端那边只要挂载 NFS 路径repo 文件写法不变mount -t nfs 192.168.1.10:/srv/centos10 /mnt/cdrombaseurl 照样写 file:///mnt/cdrom/BaseOS。这样整个网段的机器都能使用同一份源不用每台机器都去单独放 ISO 文件。5.2 做离线仓库同步让本地源更完整如果镜像里的包不够用需要把线上仓库完整同步到本地用dnf reposync可以做到。先安装对应工具包然后指定仓库 ID 同步dnf install -y dnf-plugins-core dnf reposync --repoidbaseos --download-path/data/centos10/baseos同步完成后生成的目录里有 Packages 和 repodata可以继续通过 createrepo_c 重新生成元数据。这个流程更适合做企业内部持续分发的离线源和单纯的 ISO 挂载形成互补。第一次同步数据量很大建议挂在带宽稳定的时候跑同步完成后验证方式和前面一样重点确认 repomd.xml 存在。5.3 实际使用中的一点心得踩过几次坑之后我现在配置本地源会按固定节奏来先挂载、再看目录、再写 repo、再 makecache、最后装包验证。每一步都有明确的验证动作不会盲目继续。因为 CentOS 10 的 repodata 拆分了所以ls repodata这个动作我会做两遍BaseOS 一遍、AppStream 一遍。写 repo 文件时我习惯把一个仓库内容完整写完后放一个空行再写下一个方便出错时快速定位是哪个仓库的配置问题。最后再分享一个小技巧ISO 挂载源虽然是只读的但 dnf 的 makecache 会产生缓存文件这些缓存不受 ISO 只读影响所以离线环境下用本地源装包并不会额外占用 ISO 所在磁盘的写空间。不过/var/cache/dnf如果放在系统盘装大批量包之前记得看一眼剩余空间避免把系统盘给撑满。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询