25.本地yum仓库搭建--CentOS 7

在CentOS 7中从外网下载完整YUM源包并搭建本地仓库 的核心思路是:先通过外网环境同步官方/第三方YUM源的所有软件包到本地目录,再基于该目录搭建本地YUM仓库(HTTP/FTP/本地),最终实现离线环境下的软件安装。以下是完整的思路拆解和实操步骤,涵盖"全量同步源包""搭建本地仓库""客户端配置"全流程:

一、核心思路梳理

  1. 环境准备 :准备一台能访问外网的CentOS 7服务器(作为"同步节点"),安装同步工具(reposync)和仓库元数据生成工具(createrepo)。
  2. 源同步 :通过reposync从外网官方源/EPEL源等同步所有软件包到本地目录(按需选择同步Base/Updates/Extras/EPEL等仓库)。
  3. 元数据生成 :用createrepo为同步后的包目录生成YUM仓库必需的repodata元数据(ISO镜像自带元数据,但手动同步的包需要手动生成)。
  4. 服务暴露:搭建HTTP服务(Nginx/Apache)将本地包目录对外暴露(多机共享),单机则直接本地使用。
  5. 客户端配置:所有离线服务器指向该本地仓库地址,实现离线安装/更新。

二、具体实施步骤

步骤1:同步节点环境准备(外网机器)
1.1 安装必备工具
bash 复制代码
# 安装同步工具reposync、仓库元数据工具createrepo
yum install -y yum-utils createrepo nginx  # nginx用于后续暴露仓库(可选)
1.2 启用需同步的YUM源(确保外网源可用)

检查并启用CentOS官方源(默认已启用,若被修改可恢复):

bash 复制代码
# 备份原有repo(若有)
mkdir -p /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/

# 恢复官方Base源(以阿里云镜像为例,速度更快)
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

# (可选)启用EPEL源(第三方扩展包,如需要则添加)
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

# 清理缓存并更新
yum clean all && yum makecache
步骤2:从外网同步完整YUM源包到本地

reposync是YUM自带的同步工具,可按仓库名称同步所有包到指定目录,核心参数:

  • -r:指定要同步的仓库名称(从yum repolist查看);
  • -p:指定同步后的包存储目录;
  • -n:只同步最新版本的包(可选,减少存储空间);
  • --download-metadata:同步仓库元数据(可选,后续可手动生成)。
2.1 查看可同步的仓库名称
bash 复制代码
yum repolist enabled  # 列出启用的仓库,示例输出:
# repo id               repo name
# base/7/x86_64         CentOS-7 - Base
# epel/x86_64           Extra Packages for Enterprise Linux 7 - x86_64
# extras/7/x86_64       CentOS-7 - Extras
# updates/7/x86_64      CentOS-7 - Updates
2.2 同步核心仓库(Base/Updates/Extras/EPEL)
bash 复制代码
# 创建总仓库目录(按需调整,建议用大容量磁盘)
mkdir -p /data/centos7_repo/{base,updates,extras,epel}

# 同步Base仓库(核心系统包)
reposync -r base -p /data/centos7_repo/ --download-metadata

# 同步Updates仓库(系统更新包)
reposync -r updates -p /data/centos7_repo/ --download-metadata

# 同步Extras仓库(额外工具包)
reposync -r extras -p /data/centos7_repo/ --download-metadata

# (可选)同步EPEL仓库(第三方扩展包)
reposync -r epel -p /data/centos7_repo/ --download-metadata

⚠️ 注意:同步全量包需要大量磁盘空间(Base+Updates+Extras约100G+,EPEL约50G+),建议提前准备大容量存储;若只需基础包,可仅同步Base仓库。

2.3 手动生成/更新仓库元数据(兜底)

若同步时未加--download-metadata,或后续新增了包,需手动生成repodata

bash 复制代码
# 为每个仓库目录生成元数据
createrepo /data/centos7_repo/base/
createrepo /data/centos7_repo/updates/
createrepo /data/centos7_repo/extras/
createrepo /data/centos7_repo/epel/

# 后续新增包后,增量更新元数据(无需全量重建)
createrepo --update /data/centos7_repo/base/
步骤3:搭建HTTP服务暴露本地仓库(多机共享)

用Nginx将同步后的仓库目录对外暴露,供内网离线服务器访问:

3.1 配置Nginx
bash 复制代码
# 创建Nginx根目录软链接(或直接修改root路径)
mkdir -p /usr/share/nginx/html/centos7_repo
ln -s /data/centos7_repo/* /usr/share/nginx/html/centos7_repo/

# 编辑Nginx配置(确保80端口监听)
vi /etc/nginx/nginx.conf

核心配置(默认已满足,确认即可):

nginx 复制代码
server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;  # 仓库目录挂载到该路径下
    autoindex on;  # 开启目录浏览(便于验证)
}
3.2 启动Nginx并放行端口
bash 复制代码
# 启动Nginx并设置开机自启
systemctl start nginx
systemctl enable nginx

# 放行80端口(生产环境)
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload

# 关闭SELinux(若有访问权限问题)
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
3.3 验证仓库可访问

浏览器访问 http://<同步节点IP>/centos7_repo/base/,能看到Packagesrepodata目录即成功。

步骤4:离线客户端配置本地YUM源

在所有内网离线服务器上,配置指向同步节点的YUM源:

4.1 备份原有外网源
bash 复制代码
mkdir -p /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/
4.2 新建本地仓库配置文件

创建/etc/yum.repos.d/local-centos7.repo,内容如下(替换为同步节点的内网IP):

properties 复制代码
[local-base]
name=Local CentOS 7 Base
baseurl=http://192.168.1.100/centos7_repo/base
enabled=1
gpgcheck=1
gpgkey=http://192.168.1.100/centos7_repo/base/RPM-GPG-KEY-CentOS-7

[local-updates]
name=Local CentOS 7 Updates
baseurl=http://192.168.1.100/centos7_repo/updates
enabled=1
gpgcheck=1
gpgkey=http://192.168.1.100/centos7_repo/base/RPM-GPG-KEY-CentOS-7

[local-extras]
name=Local CentOS 7 Extras
baseurl=http://192.168.1.100/centos7_repo/extras
enabled=1
gpgcheck=1
gpgkey=http://192.168.1.100/centos7_repo/base/RPM-GPG-KEY-CentOS-7

[local-epel]
name=Local CentOS 7 EPEL
baseurl=http://192.168.1.100/centos7_repo/epel
enabled=1
gpgcheck=1
gpgkey=http://192.168.1.100/centos7_repo/epel/RPM-GPG-KEY-EPEL-7
4.3 验证本地YUM源
bash 复制代码
# 清理原有缓存
yum clean all

# 生成本地仓库缓存(关键步骤)
yum makecache

# 测试安装(如安装vim)
yum install -y vim

三、优化思路(按需选择)

1. 缩小同步范围(节省磁盘空间)

若不需要全量包,可通过reposync--pkglist参数指定仅同步需要的包:

bash 复制代码
# 创建需要同步的包列表文件
echo -e "vim\ngcc\nnginx" > /tmp/package-list.txt

# 仅同步列表中的包及依赖(需结合yumdownloader)
yumdownloader --resolve --destdir=/data/centos7_repo/base/Packages/ $(cat /tmp/package-list.txt)
createrepo --update /data/centos7_repo/base/
2. 定时增量同步(保持仓库更新)

创建定时任务,定期同步外网最新包到本地:

bash 复制代码
# 编辑定时任务
crontab -e

# 添加每周日凌晨2点同步updates仓库
0 2 * * 0 /usr/bin/reposync -r updates -p /data/centos7_repo/ --download-metadata && /usr/bin/createrepo --update /data/centos7_repo/updates/
3. 单机本地仓库(无需Nginx)

若仅单机使用,无需搭建HTTP服务,直接将同步后的目录作为本地源:

properties 复制代码
[local-base]
name=Local CentOS 7 Base
baseurl=file:///data/centos7_repo/base
enabled=1
gpgcheck=1
gpgkey=file:///data/centos7_repo/base/RPM-GPG-KEY-CentOS-7

四、常见问题排查

  1. reposync同步慢/失败
    • 更换国内镜像源(如阿里云、清华源);
    • 增加--timeout=300参数延长超时时间;
    • 网络不稳定时,可分多次同步(reposync支持断点续传)。
  2. yum makecache报错"无法找到repodata"
    • 检查baseurl路径是否正确(IP/目录名是否拼写错误);
    • 确认同步节点的Nginx已启动,80端口可访问;
    • 执行createrepo重新生成元数据。
  3. GPG校验失败
    • 确认gpgkey路径正确,或临时设置gpgcheck=0(测试用,生产不推荐);
    • 手动下载GPG密钥到本地:wget https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 -O /data/centos7_repo/base/
  4. 磁盘空间不足
    • 仅同步必要仓库(如仅Base);
    • 使用reposync -n只同步最新版本包;
    • 挂载大容量磁盘到/data目录。

核心逻辑总结

外网同步(reposync)→ 本地元数据生成(createrepo)→ (可选)HTTP暴露(Nginx)→ 客户端指向本地源,核心是保证"包文件"和"repodata元数据"的完整性与可访问性,既解决了离线环境的软件安装问题,又能通过增量同步保持仓库与外网源一致。

相关推荐
wanhengidc8 小时前
高性价比云手机 多端同步
运维·服务器·科技·智能手机·云计算
知识分享小能手8 小时前
CentOS Stream 9入门学习教程,从入门到精通,CentOS Stream 9 的过滤器 —— 语法详解与实战案例(18)
linux·学习·centos
AI视觉网奇8 小时前
Meta-Llama-3.1-8B-bnb-4bit 下载加载
linux·开发语言·python
素雪风华8 小时前
只使用Docker+Maven实现全自动化流程部署服务;Docker创建ffmpeg环境;
java·运维·后端·docker·容器·自动化·maven
roman_日积跬步-终至千里8 小时前
【运维-架构】Starrocks生产级运维脚本设计与实现
运维
学习3人组8 小时前
docker运行报错启动守护进程
linux·运维·centos
绵羊20238 小时前
索拉非尼作用机制
linux
小张帅三代8 小时前
华为昇腾服务器ubuntu安装Anaconda步骤
运维·服务器·ubuntu
杜子不疼.8 小时前
【Linux】 进程控制(二):进程等待(wait/waitpid) 与 子进程获取(status)
linux·运维·服务器