第一步是挂载iso镜像并验证/mnt/repodata/repomd.xml是否存在,若缺失则说明镜像无有效仓库结构;rocky/almalinux 9需分别处理baseos与appstream子目录。

挂载ISO镜像到固定路径并验证repodata存在
本地局域网Yum源服务器的第一步,不是急着装httpd或改配置,而是确认ISO镜像里真有能用的仓库结构。很多翻车案例都卡在这:挂载成功了,ls /mnt能看到Packages目录,但ls /mnt/repodata报错“no such file”,说明镜像压根没带元数据——比如你拿的是精简版Live ISO或自定义裁剪镜像。
实操建议:
- 先用
mount /dev/cdrom /mnt或mount -o loop /path/to/CentOS-7-x86_64-DVD-1810.iso /mnt挂载,别跳过-o loop参数(尤其在无光驱虚拟机里) - 立刻检查
/mnt/repodata/repomd.xml是否存在:test -f /mnt/repodata/repomd.xml && echo ok || echo missing - Rocky Linux 9 / AlmaLinux 9 镜像结构已拆分,BaseOS 和 AppStream 是两个独立子目录,需分别挂载或软链接合并,不能只认
/mnt根路径
用httpd暴露本地仓库路径,避免SELinux和防火墙拦截
把file://本地源改成http://局域网源,本质就是让/var/www/html变成镜像内容的Web入口。但默认配置下,httpd根本读不了/mnt下的文件——SELinux策略会拦,firewalld会封80端口,甚至httpd进程本身可能没开httpd_can_network_connect布尔值。
实操建议:
- 别直接
ln -s /mnt /var/www/html/centos7,而要用cp -r /mnt/* /var/www/html/centos7/(或rsync -av --exclude='repodata' /mnt/ /var/www/html/centos7/再单独createrepo),否则SELinux上下文不继承 - 运行
semanage fcontext -a -t httpd_sys_content_t "/var/www/html/centos7(/.*)?",再restorecon -Rv /var/www/html/centos7 -
setsebool -P httpd_can_network_connect 1(某些发行版需要,比如启用了mod_proxy时) - 确认
firewall-cmd --list-ports含80/tcp,没有就加:firewall-cmd --permanent --add-port=80/tcp && firewall-cmd --reload
客户端repo文件必须用baseurl=http://,且禁用gpgcheck或导入正确key
客户端配错baseurl是最常见的连不上原因。写成baseurl=file:///mnt只能本机用;写成baseurl=http://10.0.0.10但没带路径,会404;更隐蔽的是gpg校验失败——服务端ISO里的GPG key和客户端expect的key不匹配,yum makecache卡在“Importing GPG key”不动。
实操建议:
- 客户端repo中
baseurl必须完整指向HTTP路径,例如baseurl=http://10.0.0.10/centos7(注意结尾无斜杠,否则AppStream子目录可能拼错) - 若不想处理密钥,直接设
gpgcheck=0;若要启用校验,得从服务端/mnt/RPM-GPG-KEY-*拷key过来,再rpm --import RPM-GPG-KEY-centosofficial - Rocky/AlmaLinux 9 客户端必须同时启用两个repo段:
[BaseOS]和[AppStream],且baseurl分别指向http://ip/BaseOS和http://ip/AppStream,缺一不可
测试时用curl直连repomd.xml,比yum命令更快定位问题
当你执行yum makecache失败,别急着查yum日志。90%的网络层问题,curl -I http://10.0.0.10/centos7/repodata/repomd.xml一条命令就能判明:返回200说明HTTP通、路径对、权限够;403是SELinux或目录权限问题;404是路径写错或文件没拷全;超时则是防火墙或路由不通。
实操建议:
- 在服务端本机测:
curl -I http://localhost/centos7/repodata/repomd.xml,排除DNS和网络问题 - 在客户端测同地址,确认是否跨主机生效
- 如果
repomd.xml能访问但yum仍报错,大概率是repodata里记录的包路径仍是file://相对路径——这是ISO自带元数据的硬伤,必须用createrepo --update /var/www/html/centos7重生成(尤其对非标准挂载结构)
关键点不在“怎么搭”,而在于“怎么证伪”:每一步都要用最轻量的方式验证上层依赖是否真实成立。镜像有没有repodata、httpd能不能读文件、客户端能不能GET到XML、XML里的包路径能不能被解析——漏掉任一环,后面所有操作都是空中楼阁。











