前言

内部主机在无公网网络或不占用公网带宽的情况下更新/安装软件包。挂载系统镜像做为本地仓库源数据,基本能解决大部分需求,但有时需要更新大量软件包,这时就需要本地仓库数据和官方仓库数据保持一致。
本文主要实现基于挂载系统镜像和同步官方数据的本地仓库

约定

本地仓库目录:/data/repo
ftp/web服务安装配置不在此介绍
服务端 OS 仓库 ip:192.168.100.10
客户端 主机ip :192.168.100.100
系统镜像:Centos6.x86_64.iso

准备

服务端:
系统镜像文件上传到主机/data 目录下
挂载iso镜像

#mkdir /data/repo/cdrom
#mount -o loop /data/Centos6.x86_64.iso /data/repo/cdrom

同步/下载官方源数据

官方提供镜像地址列表 https://www.centos.org/download/mirrors/
因完整源数据数据量大(大概有300G+),这里只获取需要的数据源(centos 6系)
创建相关目录
os:基础包源
updates:更新/升级包源
extras:扩展包源
epel:额外包源

mkdir -p /data/repo/centos/6/{os,updates,extras}/x86_64
mkdir -p /data/repo/epel/6/x86_64

这里有以下几种方式获取源数据(根据具体环境,任选一种即可)
1.rsync
仓库主机需要公网访问权限,亦可将办公电脑作为数据中转站(先同步到办公电脑,再推送到仓库主机上)
源数据同步到本地(需要源地址支持rsync协议)
远程同步到本地,数据源地址在前,本地目录在后
本地同步到远程,数据源目录在前,目的地址在后

#rsync -artv rsync://mirrors.shu.edu.cn/centos/6/os/x86_64/ /data/repo/centos/6/os/x86_64
#rsync -artv rsync://mirrors.shu.edu.cn/centos/6/updates/x86_64/ /data/repo/centos/6/updates/x86_64
#rsync -artv rsync://mirrors.shu.edu.cn/centos/6/extras/x86_64/ /data/repo/centos/6/extras/x86_64

#rsync -artv --exclude=debug rsync://mirrors.shu.edu.cn/epel/6/x86_64/ /data/repo/epel/6/x86_64

-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, --recursive 对子目录以递归模式处理
-v, --verbose 详细模式输出
-t, --times 保持文件时间信息
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件,不覆盖更新的文件

2.ftp
此种方式适用于仓库服务器无法访问公网情况,使用可访问公网的电脑,通过ftp客户端将源数据下载到本地,然后再将数据上传到仓库服务器
目录结构与上述方式相同,具体步骤不做描述

3.yum makecache
配置yum文件

cat /etc/yum.repo.d/yum.repo
[Base]
name=CentOS-Base
baseurl=http://mirrors.shu.edu.cn/centos/$releasever/os/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://mirrors.shu.edu.cn/centos/$releasever/os/$basearch/RPM-GPG-KEY-CentOS-6
[Updates]
name=CentOS-Updates
baseurl=http://mirrors.shu.edu.cn/centos/$releasever/updates/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://mirrors.shu.edu.cn/centos/$releasever/os/$basearch/RPM-GPG-KEY-CentOS-6
[Extras]
name=CentOS-Extras
baseurl=http://mirrors.shu.edu.cn/centos/$releasever/extras/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://mirrors.shu.edu.cn/centos/$releasever/os/$basearch/RPM-GPG-KEY-CentOS-6
[Epel]
name=CentOS-Epel
baseurl=http://mirrors.shu.edu.cn/epel/$releasever/$basearch/
enabled=1
gpgcheck=0

如果系统获取不到变量或获取不正确,可将变量替换为对应的版本和架构,如

$releasever 替换为 6
$basearch 替换为 x86_64
http://mirrors.shu.edu.cn/centos/$releasever/os/$basearch/
替换为
http://mirrors.shu.edu.cn/centos/6/os/x86_64
centos 可使用如下命令获取读应变量值
rpm -qi centos-release
arch

清空原有缓存,并建立数据缓存

yum clean all
yum makecache

获取仓库列表

yum repolist 

同步镜像到本地

默认同步所有包
reposync -r
仅同步最新的包
reposync -n
请根据各自需求同步
cd /data/repo
reposync -r Base
reposync -r Updates
reposync -r Extras
reposync -r Epel

建立元数据索引

createrepo -d Base
createrepo -d Updates
createrepo -d Extras
createrepo -d Epel

可上传自有rpm包到仓库,上传后使用createrepo -u 仓库目录,更新仓库索引即可。
以上三种方式,前两种都可以同步到元数据索引,因此不需要重新建立,最后一种数据未下载完,因此不确认是否有repodata目录,如有此目录且目录不为空,基本就是包含索引的。
到此就完成了元数据的创建,可使用ftp/nginx 服务作为外部访问,配置时将根目录配置为/data/repo目录即可

客户端使用本地yum源

配置客户端yum文件

cat /etc/yum.repo.d/yum.repo
[Base]
name=CentOS-Base
baseurl=http://192.168.100.10/centos/6/os/$basearch/
enabled=1
gpgcheck=1
[Updates]
name=CentOS-Updates
baseurl=http://192.168.100.10/centos/6/updates/$basearch/
enabled=1
gpgcheck=1
[Extras]
name=CentOS-Extras
baseurl=http://192.168.100.10/centos/6/extras/$basearch/
enabled=1
gpgcheck=1
[Epel]
name=CentOS-Epel
baseurl=http://192.168.100.10/epel/6/$basearch/
enabled=1
gpgcheck=0

清空缓存并更新

yum clean all
yum update -y

到此,客户端就可以使用本地yum源更新/安装软件了

Issue:

  1. yum grouplist时报错,无法获取group信息
    更新/创建组索引
    这里需要注意下使用comps.xml 文件,完整文件名不统一,但文件名后面肯定是“comps.xml”
    cd /data/repo/centos/6/os/x86_64/
    createrepo -g repodata/2318fd068164b0f042845474d6a22262798b9f0d1f49ad1bf9f95b953089666d-c6-x86_64-comps.xml ./