ARTICLE DETAIL

资讯详情

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

龙蜥8.8本地yum源配置:ISO挂载与内网离线实战

龙蜥8.8本地yum源配置:ISO挂载与内网离线实战 1. 为什么要在龙蜥 8.8 上折腾本地 yum 源龙蜥操作系统Anolis OS8.8 是我这两年在生产环境里装得比较多的一个版本它跟 RHEL 8、CentOS 8、Rocky 8 属于同一代际的软件包体系底层用的是 rpm dnf/yum 这套包管理逻辑。默认情况下装完系统它指向的是龙蜥官方的软件仓库只要网络通yum install就能直接拉包。但现实里的服务器环境往往没那么理想内网机器不出外网、机房带宽掐得死、安全策略只允许访问白名单地址甚至有些测试机干脆就是物理隔离的。这时候配一个本地 yum 源就是最省事的解法。所谓本地 yum 源说人话就是把安装镜像ISO里的软件包目录或者你自己攒的一堆 rpm 包挂到本地某个路径上再写一个 repo 配置文件告诉 yum“仓库就在这台机器本地别去网上找了”。它解决的核心问题有三个一是内网无外网环境下依然能装软件二是批量部署时避免几十台机器同时去外网拉同一批包把出口带宽吃满三是版本可控你不会因为上游仓库某天更新了某个包导致今天装出来的环境和上周装的不一样。这篇内容适合谁看如果你刚接手一批龙蜥 8.8 的内网服务器不知道怎么让yum install正常跑起来那这篇就是给你写的。如果你已经会配本地源但每次配完总是报一堆errors during downloading metadata for之类的错那也可以看看后面排查章节。全文我会按“设计思路 → 原理细节 → 动手实操 → 问题排查”的顺序来每一步都尽量讲清楚为什么这么做而不是只丢一堆命令让你照抄。先说清楚一个前提本地 yum 源的本质是“把远程 HTTP/FTP 仓库替换成file://本地仓库”。理解这一点后面所有配置都是围绕它展开的你也就能举一反三不管是龙蜥、Rocky 还是 CentOS思路完全一致。2. 动手前的整体设计与思路拆解2.1 本地源的两种实现路线怎么选配本地 yum 源实操里其实有两条主流路线选哪条取决于你的场景。第一条叫ISO 挂载法。龙蜥 8.8 官方发布的是 DVD ISO里面已经打包好了 BaseOS 和 AppStream 两大仓库的完整 rpm 集合。你只需要把这个 ISO 文件放到服务器上用mount挂到一个目录然后指向这个目录即可。优点是干净、离线、可复制缺点是 ISO 里的包版本是固定的后续想装新版本的包还得换镜像。第二条叫自建仓库法。你可以从有外网的机器上把需要的 rpm 包下载下来用createrepo生成索引再挂到内网给其他机器用。也可以直接把一堆 rpm 扔进一个目录用createrepo建元数据。这条路适合包依赖比较杂、需要长期维护一套自定义软件集的场景比如公司内部有自研 rpm 要分发。对绝大多数“内网机器装完系统想正常用 yum”的需求ISO 挂载法是最优解。为什么因为龙蜥 8.8 的 ISO 本身就是官方构建好的完整仓库repodata索引齐全不用你自己生成挂上去就能用出错的概率最低。所以下面的实操我以 ISO 挂载法为主线最后再补一段自建仓库的扩展做法。提示选路线之前先确认一件事——你手上有没有龙蜥 8.8 的完整 DVD ISO如果有走 ISO 挂载如果只有最小化安装镜像boot ISO那里面没有完整包集合就得考虑自建仓库或换用完整镜像。2.2 为什么建议保留原有 repo 文件而不是直接删很多教程会告诉你“把 /etc/yum.repos.d/ 下的文件全删掉再写自己的”。我个人的习惯是不删而是用 enable/disable 的方式管理。原因很简单万一你哪天需要临时连外网装个包或者排查问题时想对比官方源的配置原文件还在改个开关就能切换回来。龙蜥 8.8 的官方 repo 文件通常在/etc/yum.repos.d/目录下命名类似anaconda.repo、AnolisOS-BaseOS.repo、AnolisOS-AppStream.repo这些。每个文件里是一个或多个[section]段段的开关是enabled1或enabled0。我的做法是新建一个自己的本地源 repo 文件然后把官方那些文件里每个 section 的enabled改成 0。这样默认只走本地源需要时再切回来两条路互不干扰。这里有个细节enabled的判断是按 section 来的不是一个文件一个开关。你把文件里所有[xxx]段下面的enabled都改成 0这个文件才真正不起作用。如果只改了文件名或者注释掉一行很容易出现“我明明配了本地源但它还是去连外网”的怪现象。2.3 目录规划要提前想清楚本地源挂载点放在哪个目录最好一开始就定死后面所有配置都引用这个路径别今天/mnt/cdrom、明天/opt/iso否则你自己都会乱。我一般用两种命名风格如果只是临时挂镜像用/mnt/anolis8如果是长期固定挂载用/opt/repo/anolis8因为/opt通常是给第三方或自建软件留的语义更清晰。另外要考虑开机自动挂载的问题。如果是物理机长期使用建议写进/etc/fstab重启后挂载点自动恢复不用每次都手动 mount。但写 fstab 有个坑——如果 ISO 文件路径变了或者被删了开机时挂载失败可能导致系统进入紧急模式。所以我的经验是先手动 mount 验证一圈确认没问题了再写 fstab并且一定要加nofail选项让挂载失败时不影响正常启动。3. 龙蜥 8.8 本地源的核心细节与原理拆解3.1 yum 找仓库的完整逻辑链要配好本地源得先搞明白 yum 到底是怎么找到仓库的。这中间其实串了好几层任何一层断了都会报错。第一步yum龙蜥 8 里实际是 dnf 的兼容层启动时会读/etc/yum.repos.d/目录下所有.repo结尾的文件。注意是目录下所有文件不是某一个所以任何一个 repo 文件配错都可能导致整体报错。第二步每个 repo 文件里的[section]段会被解析成一个“仓库定义”。关键字段有name仓库描述随便写、baseurl仓库地址、enabled是否启用、gpgcheck是否校验签名、gpgkey签名公钥地址。其中baseurl就是决定本地还是远程的关键——写file:///开头就是本地写http://或ftp://就是远程。第三步yum 拿到baseurl后会去这个地址下面找repodata/repomd.xml这个文件。这个文件是仓库的“目录索引”里面记录了有哪些包、依赖关系、校验信息。如果找不到repomd.xml就会报Cannot find a valid baseurl for repo或者Failed to download metadata。这也是为什么本地源目录必须是一个经过 createrepo 生成过索引的仓库简单地把一堆 rpm 扔进目录是没用的。第四步拿到repomd.xml后yum 再拉取具体的元数据文件primary、filelists 等然后就能根据yum install的参数去匹配包了。整条链路里第三步是最容易出问题的。ISO 挂载法之所以靠谱就是因为龙蜥 ISO 的目录下本来就有现成的repodata/省掉了自己生成索引这一步。3.2 baseurl 的三种写法与各自适用场景baseurl有三种常见写法理解它们的区别能帮你在不同场景里少踩坑。写法示例适用场景注意事项本地目录file:///mnt/anolis8单机挂 ISO最常用必须是三个斜杠少斜杠会解析失败内网 HTTPhttp://10.0.0.1/repo一台机器做仓库多台机器共用需要额外部署 web 服务挂载点直连直接用挂载目录路径不推荐兼容性差部分工具不认建议统一用 file://最容易踩的坑是file://后面的斜杠数量。正确写法是file://加绝对路径如/mnt/anolis8合起来就是file:///mnt/anolis8总共三个斜杠。只写两个斜杠file://mnt/anolis8会被当成主机名直接报错。这个细节看着蠢但我第一次配的时候就栽在这上面对着错误信息看了半天。还有一点baseurl路径的末尾不要带多余斜杠file:///mnt/anolis8和file:///mnt/anolis8/虽然多数情况都能用但统一不带尾斜杠能避免一些 yum 版本解析的边界问题。3.3 gpgcheck 该开还是该关gpgcheck1表示 yum 在安装包之前会校验包的 GPG 签名确保包没被篡改。官方源默认是开的配套要有gpgkey指向公钥文件。本地源配的时候很多人为了省事直接gpgcheck0。我的建议是能用就尽量开。龙蜥 8.8 的 ISO 里通常自带 RPM-GPG-KEY 文件路径在镜像根目录下一般是RPM-GPG-KEY-AnolisOS-8。你可以把这个文件复制到本地某个位置然后在 repo 里写gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-AnolisOS-8gpgcheck1就能正常工作。开签名校验的意义在于万一 ISO 传输过程中损坏或者被人动过手脚校验会发现包签名对不上直接报错而不是稀里糊涂装上一个有问题的包。当然如果是纯内网测试环境图省事gpgcheck0也不是不行但你得清楚这是用安全性换便利。生产环境我还是强烈建议开。3.4 本地源和远程源共存的优先级有时候你会遇到这种情况本地源里只有 BaseOS 和 AppStream但你想装一个 EPEL 里的包。这时候就得让本地源和某个远程源共存。yum 处理多个仓库时默认是“合并所有启用的仓库”不会自动分优先级。如果你希望某个包优先从本地源装可以用priority字段需要装yum-plugin-priority龙蜥 8 里叫dnf-plugin-优先级或者用exclude排除某些包。不过在纯离线环境下这个问题不存在因为外网源根本连不上yum 自然会从能连的本地源里找。真正需要注意的是那些“半通不通”的网络环境——外网时好时坏yum 每次都要先超时等半天才 fallback 到本地源体验极差。这种环境下直接把外网源的enabled关掉走纯本地反而更稳定。4. 龙蜥 8.8 本地源配置完整实操4.1 环境确认与前置检查动手之前先做几项检查能避免后面一多半的莫名错误。先确认系统版本别拿 CentOS 的 ISO 去配龙蜥的源虽然包体系同源但仓库结构和 GPG 签名不完全一样cat /etc/os-release你会看到Anolis OS release 8.8之类的字样。同时确认下 dnf/yum 是否可用yum --version再看下当前有哪些仓库在启用yum repolist all这条命令会列出所有仓库及其启用状态很直观。如果输出里有一堆红色enabled的外网源等下就要处理它们。接着确认 ISO 文件在哪。假设你把它放在了/root/AnolisOS-8.8-x86_64-dvd.iso先用ls确认文件存在、大小正常完整 DVD 镜像通常几个 G如果只有几百 M多半是 boot 镜像没有完整包。这一步很关键网上很多“本地源配不上”的问题根子是拿了个最小化镜像当完整镜像用。4.2 创建挂载点并挂载 ISO挂载点目录选/mnt/anolis8mkdir -p /mnt/anolis8 mount -o loop /root/AnolisOS-8.8-x86_64-dvd.iso /mnt/anolis8-o loop是关键参数它告诉系统把普通文件当成块设备来挂载。ISO 文件本身是个文件不是物理光驱所以要靠 loop 设备来模拟。挂完验证一下ls /mnt/anolis8正常情况下你能看到BaseOS、AppStream、EFI、images、isolinux、RPM-GPG-KEY-AnolisOS-8这些目录和文件。重点确认两点一是BaseOS和AppStream目录存在它们是龙蜥 8 的两大主仓库二是每个目录下面有没有repodata子目录。有repodata才说明这是个完整仓库。如果ls出来啥都没有或者只看到几个文件说明 ISO 没挂上或者挂的是错误镜像回到上一步检查。注意挂载点目录在挂载前如果是非空的挂载后原内容会被“遮盖”卸载后才恢复。所以别把重要文件放在挂载点目录里。4.3 备份并处理原有 repo 文件进到 repo 配置目录cd /etc/yum.repos.d/ ls你会看到官方的那几个 repo 文件。我习惯先整体备份一份mkdir -p /root/repo-backup cp -a /etc/yum.repos.d/*.repo /root/repo-backup/然后处理原有源。可以用 sed 批量把enabled1改成enabled0sed -i s/^enabled1/enabled0/g /etc/yum.repos.d/*.repo注意这里正则写的是行首^enabled确保不会误伤注释行里的内容。执行完可以cat一两个文件确认改对了。为什么不直接rm掉前面说过留个后路。而且有些系统的 repo 文件里还包含[local]之类的段全删了反而要重建。改 enabled 是最小侵入的做法。4.4 编写本地源 repo 文件在/etc/yum.repos.d/下新建一个文件比如叫local-anolis.repovi /etc/yum.repos.d/local-anolis.repo内容分两段BaseOS 和 AppStream 各一段[local-BaseOS] nameLocal AnolisOS 8.8 BaseOS baseurlfile:///mnt/anolis8/BaseOS enabled1 gpgcheck1 gpgkeyfile:///mnt/anolis8/RPM-GPG-KEY-AnolisOS-8 [local-AppStream] nameLocal AnolisOS 8.8 AppStream baseurlfile:///mnt/anolis8/AppStream enabled1 gpgcheck1 gpgkeyfile:///mnt/anolis8/RPM-GPG-KEY-AnolisOS-8这里有几个点要解释。为什么分两段因为龙蜥 8.8 把包分在 BaseOS 和 AppStream 两个仓库里BaseOS 放系统基础组件AppStream 放应用流和较新版本的软件比如各种开发语言、数据库。只配 BaseOS 的话你会发现很多常用包搜不到。gpgkey直接指向挂载目录里的公钥文件这样无论机器有没有外网都能校验。如果挂载目录里没有这个文件找找是否叫别的名字用ls /mnt/anolis8 | grep -i gpg查一下。写完后清理缓存并刷新yum clean all yum makecacheyum clean all清掉旧的元数据缓存yum makecache重新从本地源拉取索引。如果这两条命令都能顺利完成说明本地源基本配好了。makecache成功了会有类似 “Metadata cache created” 的提示。4.5 验证本地源是否真正生效配好不等于生效得验证。第一条命令yum repolist输出里应该只有local-BaseOS和local-AppStream两个仓库且都是enabled状态。如果还看到外网源说明前面 sed 没改全回去检查。第二条命令实际装个包试试yum install -y treetree是个小工具很多最小化安装的系统里没有。如果它能从本地源装上基本就稳了。安装过程中留意输出的仓库名应该是你的local-BaseOS或local-AppStream。想更彻底地验证可以关掉网络再试如果方便的话或者用一个明确只存在于本地的包测试。还能用yum --disablerepo* --enablerepolocal-* list available | head显式只启用本地仓库看能不能列出可用包列表。4.6 配置开机自动挂载如果这台机器要长期用这个本地源重启后手动 mount 就没了所以得写 fstab。打开/etc/fstab加一行/root/AnolisOS-8.8-x86_64-dvd.iso /mnt/anolis8 iso9660 loop,ro,nofail 0 0解释下这几个字段ISO 文件路径、挂载点、文件系统类型iso9660、挂载选项。loop表示用 loop 设备ro是只读挂载ISO 本来就是只读明确写上更稳nofail是关键——万一 ISO 文件被删或损坏开机不会因为挂载失败卡在紧急模式。写完后不要直接重启测试先用mount -a这条命令会按 fstab 重新挂载所有条目如果这行有问题会立刻报错比重启才发现问题强得多。mount -a通过后再df -h | grep anolis确认挂载成功。注意改 fstab 是危险操作改之前先备份cp /etc/fstab /etc/fstab.bak。nofail一定要加否则 ISO 丢失时系统可能启动不了。5. 自建仓库的扩展做法5.1 什么时候需要自建仓库ISO 挂载法覆盖了大部分场景但有两种情况它不够用。一是你手上只有 boot 镜像没有完整 DVD二是你需要在内网集中管理一批自定义 rpm比如公司自研的软件包、从各个渠道攒来的第三方包。这时候就得上createrepo自建仓库。自建仓库的核心逻辑是把 rpm 包集中放进一个目录用工具生成repodata索引然后像 ISO 一样把这个目录挂出来给 yum 用。关键工具就是createrepo_c龙蜥 8 里 createrepo 的 C 实现版本速度更快。5.2 批量下载 rpm 包的实操思路要自建仓库先得有包。从有外网的机器上批量下载 rpm推荐用dnf download配合--resolve参数把依赖一起拉下来dnf download --resolve --alldeps --destdir/opt/rpms tree--resolve会自动解析并下载依赖包--alldeps连那些已经被满足的依赖也一起下。这样下载下来的是一个自包含的包集合搬到内网后不会因为缺依赖装不上。如果一次性要下一批包可以写个包名列表循环处理或者直接用reposync把整个仓库同步下来dnf reposync --repoidlocal-BaseOS --download-path/opt/rpmsyncreposync会把指定仓库的所有包同步到本地目录适合做完整镜像但下载量可能很大量力而行。5.3 生成仓库索引并挂载使用把下载好的 rpm 集中到/opt/repo/custom/Packages目录然后生成索引createrepo_c /opt/repo/custom如果提示命令不存在先装上yum install -y createrepo_c生成后目录下会出现repodata子目录这就成了标准的 yum 仓库。接下来写 repo 文件指向它[custom] nameCustom Local Repo baseurlfile:///opt/repo/custom enabled1 gpgcheck0自建仓库如果没有做签名gpgcheck只能关掉。这也提醒我们自建仓库要额外注意包的来源可信度别什么包都往里扔——这条供应链上的任何一环被污染影响的都是所有用这个源的内网机器。6. 常见问题与排查技巧实录6.1 典型报错速查表配本地源过程中我遇到过和听说过的报错整理成一张表对着症状找原因报错信息根本原因解决办法Cannot find a valid baseurl for repobaseurl 写错或挂载点没挂上检查file:///三个斜杠ls挂载点确认有 repodataFailed to download metadata for repo仓库目录下没有 repodata确认 ISO 是完整 DVD自建仓库要跑 createrepo_cerrors during downloading metadata for repository外网源连不上还在启用关掉外网源的 enabled或检查网络GPG key retrieval failedgpgkey 路径不对或文件不存在ls确认公钥文件位置检查路径Package xxx is not available包不在已启用的仓库里yum repolist看仓库是否启用确认包在哪个仓库repomd.xml not found挂载成功但目录结构不对进去看是不是多套了一层目录errors during downloading metadata for这个报错特别常见尤其是你明明配了本地源却还报这个——那十有八九是某个外网源没关干净yum 在尝试连它然后超时。排查方法就是yum repolist看还有哪些 enabled 的仓库挨个处理。6.2 挂载相关的问题排查挂载失败最常见的原因是 ISO 文件损坏或者路径写错。用file命令看看这个 ISO 是不是真的 ISOfile /root/AnolisOS-8.8-x86_64-dvd.iso正常会显示ISO 9660 CD-ROM filesystem data。如果显示的是别的那这个文件根本不是可挂载的镜像。另一个坑是重复挂载。如果你 mount 了两次到同一目录虽然一般不报错但会产生重叠挂载卸载时可能只卸掉一层容易把人绕晕。用mount | grep anolis8看看到底挂了几层。清理时把对应层数都 umount 掉。还有一种情况mount命令成功但ls挂载点还是空的。这通常是因为目录在挂载前就有内容挂载没真正生效或者挂载的是个空 ISO。可以用df -h看这个挂载点的已用空间如果显示 0说明挂的是空镜像。6.3 yum 缓存与元数据的问题yum makecache报错的时候先别急着改 repo 文件很多时候是缓存在作祟。完整的清理流程是yum clean all rm -rf /var/cache/dnf/* yum makecacheyum clean all清的是 yum/dnf 层面的缓存/var/cache/dnf/是实际存储位置。有时候 clean 没清干净直接手动删目录更彻底。这个操作我踩过不止一次——明明 repo 改对了但它一直用旧缓存报错清完立刻就好。还有一个细节如果你换了 ISO比如从 8.6 换到 8.8即使挂载点没变也一定要yum clean all。因为元数据里记录了包的路径和校验值换了镜像但缓存还在会各种对不上。这个坑在版本升级时特别容易中招。6.4 我踩过的几个真实坑第一个坑baseurl里用了挂载目录的软链接。有次为了路径好看我建了个/opt/repo软链指向/mnt/anolis8结果 yum 解析软链时行为不一致报找不到仓库。后来老实写成实际挂载路径就好了。所以baseurl建议直接写真实路径别套软链。第二个坑SELinux。龙蜥 8.8 默认 SELinux 是 enforcing 状态某些情况下它会影响 yum 访问非标准路径的仓库文件。如果你把仓库放在/opt这种非标准位置又开了 enforcing可能遇到权限拒绝。排查方法getenforce如果返回Enforcing可以用semanage fcontext给仓库目录打上合适的标签或者临时setenforce 0验证是不是 SELinux 的锅。生产环境不要长期关 SELinux要正确地打标签。第三个坑ISO 权限。如果 ISO 文件放在某个目录普通用户没读权限而你又用非 root 去 mount会因为读不到文件而失败。确保 ISO 文件本身可读并且用 root 或有 sudo 权限的账号操作。第四个坑repolist里仓库名重复。如果你手滑两个 repo 文件里写了同名的[local-BaseOS]段yum 会以其中一个为准另一个的配置被悄悄忽略导致你以为改了配置却没生效。用grep -r local-BaseOS /etc/yum.repos.d/检查有没有重名。7. 长期维护的一点个人经验配完本地源不是一劳永逸后面还有几件事值得留意。先说 ISO 的存放位置。别把它随手放在/root或者某个临时目录万一哪天清理磁盘给删了fstab 里那行nofail虽然不会让系统起不来但 yum 就废了运维半夜被叫起来是大概率事件。我建议在/opt或者专门的数据盘建个/data/iso目录ISO 集中放这里权限设成 root 只读再把挂载配置和 ISO 路径写进运维文档。这个习惯看似啰嗦但换过几次机器之后你会发现文档比记性可靠。再一个是版本更新的问题。龙蜥 8.8 这个版本安全更新和 bug 修复包是持续发布的ISO 里的包是发布那一刻的快照。如果你有安全合规要求光挂个静态 ISO 是不够的短期应急可以长期得考虑把 ISO 和前一批累积更新包一起用或者定期找有外网的机器reposync一次把新包同步进自建仓库再createrepo_c --update更新索引。--update的好处是只处理新增和变化的包比全量重新生成快很多仓库大了之后这个差异非常明显。还有一个我自己常用的技巧把本地源的启用状态做成一个简单脚本一键切换本地源和外网源。核心就是改那几行enabled再yum clean all yum makecache。临时要装个本地没有的包跑一下脚本切到外网装完切回来。比手动一个个改文件省事也避免手滑改错。脚本不复杂几行 sed 就够了放到/usr/local/bin下用熟了是真香。最后提一句批量场景。如果你有几十台龙蜥 8.8 要配本地源一台台敲命令太慢。这时候可以考虑在一台机器上把本地源目录通过内网 HTTP 共享出来其他机器在 repo 文件里写这台机器的http://地址就不用每台都挂 ISO 了。这在离线集群里是很常见的做法一台做仓库节点其余做客户端维护成本一下就下来了。前提是仓库节点的 web 服务和防火墙策略要配好客户端能访问到那个端口这个改造本身不复杂但能省下大量重复劳动。
返回列表