尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Rocky 9.2 搭建局域网 HTTP Yum 源:内网服务器软件部署实战

Rocky 9.2 搭建局域网 HTTP Yum 源:内网服务器软件部署实战 简介内网环境往往无法直接访问互联网为多台服务器统一安装、升级软件依赖十分繁琐。这份资源聚焦于Rocky Linux 9.2系统系统讲解基于HTTP协议搭建局域网YUM源的完整方案适合运维工程师、系统管理员以及需要批量部署RPM包的技术人员参考。文档以实际项目为背景先介绍镜像准备与挂载再说明本地YUM仓库的配置和httpd服务部署最后演示客户机如何修改源地址、清理缓存并验证源是否生效。全文步骤清晰配有具体配置示例与常用命令可帮助读者快速搭建属于自己的内网YUM源提升软件分发效率并保证各服务器版本一致。资源为单个docx文档整体约120KB内容精炼便于阅读和存档。目前已有1692人学习浏览是内网运维场景下非常实用的操作指南。1. 内网装软件装到怀疑人生先搞一个 Rocky 9.2 局域网 yum 源内网环境装软件最痛苦的往往不是命令不会写而是依赖包凑不齐。我手上这几十台 Rocky 9.2 服务器和互联网物理隔离yum install httpd直接报Could not resolve host只能对着屏幕干瞪眼。一台一台配本地源几十台机器全是重复劳动用 rpm 命令一个个装依赖装个 nginx 能折腾一下午。最后落地的方案就是今天拆的这个在 Rocky 9.2 上基于 HTTP 搭建一个局域网 yum 源服务器 192.168.15.100 对外提供 BaseOS 和 AppStream 两个仓库其他机器把 baseurl 指向它yum install就能正常走。这套做法适合内网环境下批量管理 RPM 系服务器的人也适合接手 CentOS 7、openEuler 等环境时快速换源参考——仓库路径稍作调整思路完全一致。2. 为什么选 HTTP 方式选型理由与挂载镜像的细节2.1 三种源方案对比本地源、HTTP 源与 NFS 源先搞清楚一个前提你说你有一个 ISO 镜像要把它变成局域网内所有机器都能用的 yum 源可选方案其实是三个不是只有 HTTP 一种。第一种是每台机器各自挂载 ISO 配本地源。这个做法最笨好处是断网也能用坏处是每台机器都要手动挂载、写 repo 文件几十台机器肝一遍手都酸了而且后续打补丁要一台台重新挂载新镜像版本一致性根本没保障。第二种是 NFS 方式把 ISO 挂载点通过 NFS 共享出去。这个方案在纯内网环境其实很常见配置也不复杂服务器端编辑/etc/exports客户机 mount 一下就行。但 NFS 有一个先天问题——它对网络稳定性敏感客户机如果休眠或者网络闪断挂载点会变成 stale handleyum 直接卡死必须umount -l强制卸载再重挂。另外 NFS 的权限模型在 Windows 客户端那边也容易踩坑如果你内网里还混着别的系统维护成本就上来了。第三种就是今天要做的 HTTP 方式把 ISO 挂载到 Apache 的 DocumentRoot 下让客户机通过http://server/opt/BaseOS/访问。HTTP 无状态、不怕断连客户机每次 yum 操作都是独立的请求哪怕网络抖动也只是这次请求失败下次重试就好。而且 HTTP 方式有一个额外收益挂载点目录本身就是个文件服务器内网传个包、拉个日志都能直接走浏览器或 wget等于顺手多了个局域网文件传输通道。所以在我这个场景里HTTP 是最省心的选择。2.2 挂载 ISOmount 命令的两处关键参数Yum 服务器的前置操作很简单先用 SecureFX 这类工具把Rocky-9.2-x86_64-dvd.iso传到/opt目录下然后创建挂载点并挂载。这里有一个原版步骤里容易翻车的点命令看起来没问题实际执行会报错。# 创建挂载点目录 mkdir -p /var/www/html/opt # 挂载 ISO 镜像注意 -o loop 参数 mount -o loop /opt/Rocky-9.2-x86_64-dvd.iso /var/www/html/opt第一处关键参数是-o loop。ISO 是一个文件而非块设备普通 mount 会报mount: /var/www/html/opt: mount failed或者提示wrong fs type, bad option, bad superblock必须加loop告诉内核把它当作回环设备来处理。第二处是先把/opt目录建好再挂载否则 mount 会提示挂载点不存在。挂载完之后用df -h和ls验证一下确认 ISO 的目录结构和预期一致。Rocky 9.2 的镜像内部结构是标准的 RHEL 9 布局跟 CentOS 9 Stream 一样根目录下有BaseOS和AppStream两个核心目录分别对应两个独立的仓库。# 验证挂载结果 df -h | grep opt ls /var/www/html/opt/正常情况下你应该看到AppStream、BaseOS、EFI、images、isolinux等目录。如果 ls 出来的是一堆乱码或者空目录说明挂载失败先检查-o loop参数和镜像文件完整性ls -l看看 ISO 文件大小是否和源文件一致。2.3 验证挂载结果别急着写 repo 文件我见过不少人在挂载这一步草草看一眼就急着去写 repo 文件结果后面 yum 报File /var/www/html/opt/BaseOS/repodata/repomd.xml not found。这类问题十有八九是挂载没成功或者访问的目录层级不对。验证挂载是否完整最稳的做法是直接检查 repodata 目录因为 yum 源的核心就是repomd.xml它记录了仓库的元数据索引、文件校验信息。# 验证 BaseOS 仓库的元数据是否存在 ls /var/www/html/opt/BaseOS/repodata/repomd.xml # 验证 AppStream 仓库的元数据是否存在 ls /var/www/html/opt/AppStream/repodata/repomd.xml这两条命令如果能正常返回文件路径挂载这一步才算真正过关。这里顺带说一个实用技巧Rocky 9.2 的 DVD ISO 里 BaseOS 和 AppStream 的软件包集合其实覆盖了大多数常用软件但如果你后面发现yum install某个包提示No match for argument说明这个包在 DVD 镜像里没有需要走第 6 章讲的 createrepo 扩展方案把额外的 rpm 包合并进仓库。3. 服务器端配置本地 repo 文件、httpd 服务与防火墙 SELinux3.1 先建好本地 repo 文件两个仓库缺一不可挂载完成只是第一步Yum 服务器这台机器自己也得能认出这个源否则你连yum install httpd都跑不起来。这就需要在/etc/yum.repo.d/下新建一个local.repo文件把本地挂载点作为仓库地址。# /etc/yum.repo.d/local.repo [Rocky-BaseOS] nameRocky-BaseOS baseurlfile:///var/www/html/opt/BaseOS/ enabled1 gpgcheck0 [Rocky-AppStream] nameRocky-AppStream baseurlfile:///var/www/html/opt/AppStream/ enabled1 gpgcheck0这里有一个细节值得多说一句file://后面跟的是绝对路径路径末尾加上斜杠/是规范写法不加也能识别但加了更稳妥避免某些工具拼接 URL 时少一层目录。gpgcheck0表示关闭 GPG 签名校验内网环境里如果你信任这个 ISO 的来源为了省去导入公钥的步骤可以关掉但如果你有安全合规要求建议保留gpgcheck1并执行rpm --import /var/www/html/opt/RPM-GPG-KEY-rockyofficial导入官方密钥后面避坑章会展开讲。系统自带的其他 repo 文件怎么处理原版步骤里用了rm -rf !(local.repo)这个 bash 通配符删除说实话我建议第一次操作的人别这么激进。正确做法是先备份再移除或者更简单——直接把 /etc/yum.repo.d/ 下的原始 repo 文件后缀改成.bak禁用掉。# 备份而非直接删除给自己留后悔药 mkdir -p /etc/yum.repo.d/backup mv /etc/yum.repo.d/*.repo /etc/yum.repo.d/backup/ 2/dev/null执行完之后确认一下目录内容确保local.repo是唯一有效的 repo 文件。ls /etc/yum.repo.d/这里有个血泪教训Rocky 9 系统自带了一个rocky.repo它指向的是互联网源mv掉它你并不会损失什么因为内网也用不到但如果你服务器之后还需要走外网源记得把备份挪回来不然yum makecache会一直报Cannot find a valid baseurl for repo: baseos。3.2 用本地源安装 httpd 并设置开机启动本地源配好之后安装 httpd 就是一个普通的 yum 操作了。这里要注意httpd 这个包在 Rocky 9.2 的 AppStream 仓库里所以如果刚才你只配了 BaseOS 没配 AppStreamyum install httpd会直接提示找不到软件包。# 安装 httpd默认从本地源拉取 yum install -y httpd # 启动 httpd 并设置开机自启 systemctl start httpd systemctl enable httpdsystemctl enable httpd这步我建议必须做否则服务器一旦重启httpd 不会自动起来后面所有客户机的 yum 操作都会报连接拒绝而且这种故障很隐蔽——你检查客户机 repo 文件时看起来一切正常实际是服务端根本没监听端口。启动完成后验证一下 httpd 状态systemctl status httpd如果看到Active: active (running)再配合ss -tlnp | grep 80确认 80 端口在监听服务器这半边就通了。3.3 firewalld 与 SELinux测试环境可关生产环境要开门这一步是原版步骤里争议最大的地方直接systemctl stop firewalld和setenforce 0。测试环境图省事这么干没问题但生产内网也这么干等于是把系统的两道门都拆了。先说 firewalld。内网环境物理隔离风险确实可控但更好看的姿势是只放行 HTTP 服务而不是把整个防火墙关掉# 推荐做法只放行 80 端口 systemctl start firewalld firewall-cmd --permanent --add-servicehttp firewall-cmd --reload这样防火墙依然在保护其他端口80 端口单独开门。如果你不想开防火墙至少把 stop 改成 disable避免重启之后防火墙又活了、http 访问却断了systemctl stop firewalld systemctl disable firewalld再说 SELinux。setenforce 0只是临时把 SELinux 切到 permissive 模式重启之后自动恢复 enforcing。如果 httpd 需要以非默认方式访问文件系统你会看到Permission denied这种场景下的正解是调整 SELinux 布尔值。# 允许 httpd 访问用户创建的文件目录 setsebool -P httpd_use_nfs 1 setsebool -P httpd_read_user_content 1但注意挂载点/var/www/html/opt本身就是 Apache 默认的 DocumentRoot 路径SELinux 上下文是httpd_sys_content_thttpd 按理说可以直接读。我在实际部署中遇到过客户机访问 403 的情况排查到最后发现是 ISO 挂载点目录的 SELinux 上下文不对。保险做法是指定上下文chcon -R -t httpd_sys_content_t /var/www/html/opt执行完再ls -Z /var/www/html/opt确认上下文变成httpd_sys_content_t客户机访问 403 的问题基本就能解决。4. 客户机接入一条 baseurl 的改动与 yum 缓存重建4.1 客户机 repo 文件IP 和路径一字母都不能错服务器端通了之后剩下的操作都在客户机上。核心就是把 local.repo 里的file://换成http://服务器IP/挂载目录/。这里最容易出的坑就是 IP 写错或路径多写少写一层目录。# /etc/yum.repo.d/local.repo [Rocky-BaseOS] nameRocky-BaseOS baseurlhttp://192.168.15.100/opt/BaseOS/ enabled1 gpgcheck0 [Rocky-AppStream] nameRocky-AppStream baseurlhttp://192.168.15.100/opt/AppStream/ enabled1 gpgcheck0注意 URL 的构成逻辑http://192.168.15.100是 Apache 的根/opt对应服务器上的/var/www/html/opt挂载点/BaseOS/和/AppStream/是镜像内部的仓库目录。这个路径可以不经过服务器上直接写/opt/BaseOS完成访问是因为 Apache DocumentRoot 已经把/var/www/html映射为 URL 根路径两者一一对应。写完 repo 文件后先别急着操作 yum用 curl 直接验证 URL 可达性# 验证客户机能否正常访问服务器上的仓库元数据 curl -I http://192.168.15.100/opt/BaseOS/repodata/repomd.xml如果返回HTTP/1.1 200 OK说明网络链路和路径都正确如果返回 404多半是路径写错连接超时则检查服务器防火墙或 IP 配置。这一步能在 10 秒内帮你定位问题比反复执行 yum 快得多。4.2 yum clean all 与 makecache缓存重建的意义客户机之前可能配置过其他源系统里留着旧的缓存和元数据。如果直接yum install可能出现两种诡异现象一是报错提示找不到仓库二是命中的还是旧源的缓存数据装出来的软件版本和服务器镜像对不上。所以换了 repo 文件后强制重建缓存是必不可少的操作。# 清理本地缓存 yum clean all # 重建缓存 yum makecacheyum clean all会清空/var/cache/dnf/下的元数据、软件包缓存和事务历史确保后续操作不会引用旧数据。yum makecache会重新从 baseurl 拉取repomd.xml和各仓库的元数据生成新的缓存索引。这一步执行期间能看到Rocky-BaseOS和Rocky-AppStream两个仓库的下载进度如果某个仓库卡住或者报错说明这个仓库的 URL 或者服务端目录有问题。4.3 用 yum list 和实际安装验证源是否可用缓存重建完成不代表万事大吉我一般习惯分两步验证。第一步先看仓库列表确认两个仓库都被正确识别yum repolist输出中应该能看到Rocky-BaseOS和Rocky-AppStream而且 status 列显示的不是 0。如果 status 显示为 0说明仓库元数据是空的去服务器检查对应目录下是否有 packages 子目录和 repodata。第二步是真正装一个包验证全链路。挑一个依赖较多的软件比如vim或者httpd# 用客户机实际安装一个软件包验证源工作正常 yum install -y vim如果这条命令能顺利解决依赖并安装完成说明局域网 yum 源已经打通。此时再看yum list | wc -l看到的软件包数量应该和 DVD 镜像中包含的数量一致这也顺便帮你确认了源没有缺仓库、缺包。5. 避坑指南从 IP 写错到 rm -rf 翻车的四个典型故障5.1 客户机 yum 报 404先 curl 再改 repo现象客户机上执行yum makecache报Errors during downloading metadata for repo Rocky-BaseOS提示404 - Not Found。原因baseurl 的 URL 路径和服务器实际目录结构不匹配。最常见的是把 IP 写错比如原文里写成192.168.1.100而服务器实际 IP 是192.168.15.100或者漏掉了/opt这一层。我也见过有人把/opt/BaseOS/写成/opt/BaseOS末尾少个斜杠某些旧版工具会拼接出错误路径。解决不折腾 yum先用curl -I http://192.168.15.100/opt/BaseOS/repodata/repomd.xml验证 URL。返回 200问题在仓库配置文件格式返回 404逐层 curl 检查/opt、/opt/BaseOS/的逐步路径看到底是哪一层断了。5.2 服务器重启后客户机全部报连接拒绝fstab 忘写了现象服务器一切正常但重启之后客户机执行yum install直接报Failed to connect to 192.168.15.100 port 80: Connection refused。在服务器本机ss -tlnp | grep 80确认 httpd 已经启动但访问挂载点目录/var/www/html/opt发现是空的。原因ISO 挂载是通过mount命令临时挂载的没有写入/etc/fstab。服务器重启后挂载点目录变成空目录Apache 依然响应请求返回的却是空目录列表客户机自然拉不到任何软件包。解决把挂载信息写入/etc/fstab同时加上_netdev选项防止系统在启动时因为挂载设备未就绪而卡住# 编辑 /etc/fstab追加下面一行 /opt/Rocky-9.2-x86_64-dvd.iso /var/www/html/opt iso9660 loop,ro,_netdev 0 0改完后执行mount -a测试再df -h确认挂载成功。5.3 用 rm -rf !(local.repo) 删文件一时爽回不来现象按网上的教程执行rm -rf !(local.repo)后/etc/yum.repo.d/只剩下 local.repo但yum repolist之后想恢复系统自带源发现备份都没有只能翻文档重新手写。原因!(local.repo)是 bash 的 extglob 扩展通配符前提是shopt -s extglob已经开启。在很多精简环境中默认没开此时命令行为不可预测即使开了这个操作也会把所有的 repo 文件全部删除包括你本来可能需要的rocky.repo、epel.repo。更危险的是如果目录路径写错rm -rf的破坏力是直接且不可逆的。解决我现在的习惯是先备份再移除永不直接删除mkdir -p /etc/yum.repo.d/backup mv /etc/yum.repo.d/*.repo /etc/yum.repo.d/backup/这样即使新 repo 文件写坏了随时能把备份挪回来代价只是两条 mv 命令。5.4 gpgcheck0 的安全隐患是省事还是埋雷现象客户机安装软件包时报The GPG key for package ... is not installed或者Public key for xxxx.rpm is not installed于是有人为了省事直接全局gpgcheck0。原因DVD 镜像自带的 repodata 默认是带 GPG 签名的。关闭校验后 yum 不再检查签名问题一时看不出来但后续如果仓库目录被写入了不安全内容、或者镜像文件被篡改比如下载源文件时 ISO 校验值不一致客户机会毫无感知地安装上被篡改的包。解决不要全局关闭而是导入 Rocky 官方签名密钥# 导入镜像内置的 GPG 密钥 rpm --import /var/www/html/opt/RPM-GPG-KEY-rockyofficial # repo 配置中保留 gpgcheck1客户机不需要单独导入密钥它会通过元数据自动拉取仓库公钥。前提是服务器镜像的RPM-GPG-KEY-rockyofficial文件存在且没被改动过。5.5 SELinux 上下文导致客户机访问 403现象客户机用 curl 访问服务器返回 200但浏览器或 yum 却报403 - Forbidden。服务器上查看 httpd 错误日志提示Permission denied日志指向挂载点目录。原因挂载点目录/var/www/html/opt的 SELinux 上下文不是httpd_sys_content_t。使用 loop 设备挂载 ISO 时文件系统继承的是原镜像文件的上下文如果镜像放在/opt下上下文可能是usr_t或default_tApache 无权读取。解决手工修正上下文并持久化chcon -R -t httpd_sys_content_t /var/www/html/opt如果这一步在挂载后被覆盖可以考虑用semanage fcontext加入永久规则或者干脆把 ISO 文件放到/var/www/html/目录下再挂载这样默认上下文就是正确的。SELinux 的问题有时像玄学但只要记住「Apache 能读什么目录」取决于httpd_sys_content_t排查思路就清晰了。6. 进阶用法开启目录索引、扩展仓库与开机自动挂载6.1 开启目录索引让仓库可视化默认情况下Apache 对没有 index.html 的目录返回 403 Forbidden。客户机 yum 访问 repodata 没问题但你想在浏览器里直接浏览软件包列表就不行。改一下 httpd 的目录配置# 编辑 /etc/httpd/conf.d/autoindex.conf或者直接在 httpd.conf 里打开 Options Indexes Directory /var/www/html Options Indexes FollowSymLinks Require all granted /Directory改完systemctl reload httpd浏览器访问http://192.168.15.100/opt/就能看到 BaseOS、AppStream 等目录树点进去还能直接下载 rpm 包。这在局域网里传文件、抽包做离线分析都特别方便。6.2 用 createrepo 把第三方 rpm 包并进仓库DVD 镜像里的包终归有限内网环境经常要装一些不在镜像里的软件。这时候别直接往 BaseOS 目录里丢 rpm 包必须用 createrepo 重新生成元数据否则 yum 不认。# 在服务器上安装 createrepo yum install -y createrepo_c # 把第三方 rpm 包放到一个目录 mkdir -p /var/www/html/opt/extra/Packages cp /opt/xxx.rpm /var/www/html/opt/extra/Packages/ # 生成仓库元数据 createrepo --update /var/www/html/opt/extra/生成完成后在服务器的 local.repo 里再加一段[Rocky-Extra] nameRocky-Extra baseurlfile:///var/www/html/opt/extra/ enabled1 gpgcheck0客户机同样新增对应段yum clean all yum makecache就能用 yum 安装这些第三方包了。这里注意createrepo --update参数每次新增 rpm 包后重新执行一次它会增量更新元数据比全量重新生成快得多。6.3 开机自动挂载和免密访问习惯挂载写入 fstab 之后每次重启都不用手动 mount。我现在的标准操作是做好 fstab 条目后先mount -a验证一遍再reboot验证一遍确认服务器重启后客户机yum repolist依然正常才收工。这套流程走下来就算服务器重启或者断电客户机那边不需要做任何操作yum 源自动恢复。还有一个小习惯想分享客户机上配置 repo 文件时我始终会把 gpgcheck 保留为 1并且把RPM-GPG-KEY-rockyofficial的导入动作写进部署脚本。每次新机器接入内网跑一遍脚本就完成配置不用手工敲。从那以后我每次搭完源都会强制走一遍「curl 验证 URL → 重启服务器验证 fstab → 客户机实际安装一个包」这个全链路测试确认彻底通了才交付希望帮到你。本文还有配套的精品资源点击获取
返回列表