0x01 前言

家里测试的虚拟机很多,而且生命周期很短,虽然有做虚拟机模版镜像,但我还是喜欢每次新建虚拟机的时候安装常用的包和进行系统升级。

那么问题来了,windows有WSUS服务(基于win server 2012配置WSUS服务)可供配置以达到节省流量的目的,可是Linux呢?

Linux肯定是镜像各种源服务器啦。

0x02 准备

首先要准备一台centos服务器并安装nginx与rsync,最重要的是,这台服务器需要有公网连接。

然后新建目录用于存放镜像文件:

[root@centos-test ~]# mkdir -p /usr/local/local_mirror/

首先配置nginx,nginx可以通过yum安装,也可以参考以下文章:

当然,如果你并没有特殊服务需要编译nginx,那么通过yum安装是最方便的:

[root@centos-test ~]# yum install nginx

安装完毕后直接直接修改nginx.conf即可,将server段修改为以下内容:

server {
    listen                  80;
    server_name             mirror.t.com;

    root                    /usr/local/local_mirror;
    access_log              /var/log/nginx/access.log  main;

    location / {    
      autoindex on; 
      autoindex_exact_size off; 
      autoindex_localtime on; 
    }

}

请注意第三行(高亮行)中的mirror.t.com这个域名,如果你只想通过IP进行访问,请删除此行。如果需要通过域名访问,那么请修改为你的域名。

配置完成后请通过以下命令启动或重新加载nginx:

#启动
[root@centos-test ~]# nginx

#重新加载
[root@centos-test ~]# nginx -s reload

最后就可以通过域名或IP尝试访问。

0x03 rsync

首先要确定你需要镜像的源,以下是我需要用到的源:

  • epel
  • centos7-base
  • centos7-updates
  • centos7-extras
  • centos7-centosplus
  • centos7.3.1611-base
  • centos7.3.1611-updates
  • centos7.3.1611-extras
  • centos7.3.1611-centosplus

如果你经常更新系统或者安装软件,那么你肯定会觉得有些源特别特别慢,所以我一般使用清华大学的开源软件镜像站作为源站,他们的地址是:

在清华大学镜像站中,我找到我所需要的所有连接后,还需要根据实际情况,新建目录。例如epel源:

#镜像站地址
rsync://mirrors.tuna.tsinghua.edu.cn/epel/7/

#新建本地目录
/usr/local/local_mirror/epel/7/

当然,你也可以根据自己的实际情况进行目录命名。

如果你仔细查看源站中的目录结构会发现,里面很有许多你不需要的内容,尤其是安装镜像等文件大小极其庞大的文件。那么我们建立一个不同步文件与文件夹列表:

#新建文件
[root@centos-test ~]# vim /usr/local/local_mirror/exclude.list

#填入内容
SRPMS
aarch64
ppc64
ppc64le
debug
repodata
EFI
LiveOS
images
isolinux
CentOS_BuildTag
EULA
GPL
RPM-GPG-KEY-CentOS-7
RPM-GPG-KEY-CentOS-Testing-7
drpms

为了方便运行,我们新建一个简易的shell脚本:

#建立文件
[root@centos-test ~]# /usr/local/local_mirror/rsync.sh

#填入内容
#epel
rsync -avz --exclude-from=/usr/local/local_mirror/exclude.list rsync://mirrors.tuna.tsinghua.edu.cn/epel/7/ /usr/local/local_mirror/epel/7/
createrepo /usr/local/local_mirror/epel/7/

#centos7-base
rsync -avz --exclude-from=/usr/local/local_mirror/exclude.list rsync://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/ /usr/local/local_mirror/centos/7/os/x86_64/
createrepo /usr/local/local_mirror/centos/7/os/x86_64/

#centos7-updates
rsync -avz --exclude-from=/usr/local/local_mirror/exclude.list rsync://mirrors.tuna.tsinghua.edu.cn/centos/7/updates/x86_64/ /usr/local/local_mirror/centos/7/updates/x86_64/
createrepo /usr/local/local_mirror/centos/7/updates/x86_64/

#centos7-extras
rsync -avz --exclude-from=/usr/local/local_mirror/exclude.list rsync://mirrors.tuna.tsinghua.edu.cn/centos/7/extras/x86_64/ /usr/local/local_mirror/centos/7/extras/x86_64/
createrepo /usr/local/local_mirror/centos/7/extras/x86_64/

#centos7-centosplus
rsync -avz --exclude-from=/usr/local/local_mirror/exclude.list rsync://mirrors.tuna.tsinghua.edu.cn/centos/7/centosplus/x86_64/ /usr/local/local_mirror/centos/7/centosplus/x86_64/
createrepo /usr/local/local_mirror/centos/7/centosplus/x86_64/

#centos7.3.1611-base
rsync -avz --exclude-from=/usr/local/local_mirror/exclude.list rsync://mirrors.tuna.tsinghua.edu.cn/centos/7.3.1611/os/x86_64/ /usr/local/local_mirror/centos/7.3.1611/os/x86_64/
createrepo /usr/local/local_mirror/centos/7.3.1611/os/x86_64/

#centos7.3.1611-updates
rsync -avz --exclude-from=/usr/local/local_mirror/exclude.list rsync://mirrors.tuna.tsinghua.edu.cn/centos/7.3.1611/updates/x86_64/ /usr/local/local_mirror/centos/7.3.1611/updates/x86_64/
createrepo /usr/local/local_mirror/centos/7.3.1611/updates/x86_64/

#centos7.3.1611-extras
rsync -avz --exclude-from=/usr/local/local_mirror/exclude.list rsync://mirrors.tuna.tsinghua.edu.cn/centos/7.3.1611/extras/x86_64/ /usr/local/local_mirror/centos/7.3.1611/extras/x86_64/
createrepo /usr/local/local_mirror/centos/7.3.1611/extras/x86_64/

#centos7.3.1611-centosplus
rsync -avz --exclude-from=/usr/local/local_mirror/exclude.list rsync://mirrors.tuna.tsinghua.edu.cn/centos/7.3.1611/centosplus/x86_64/ /usr/local/local_mirror/centos/7.3.1611/centosplus/x86_64/
createrepo /usr/local/local_mirror/centos/7.3.1611/centosplus/x86_64/

#赋予权限
[root@centos-test ~]# chmod +x /usr/local/local_mirror/rsync.sh

最后运行脚本:

[root@centos-test ~]# /usr/local/local_mirror/rsync.sh

同步时间会很长,时间的长短视乎你的网络速度。一切顺利的话,完成后再次访问的界面如下:

0x04 客户机

需要先将客户机上原有的repo源做备份处理:

#备份到root目录
[root@centos-test ~]# cp -r /etc/yum.repos.d /root/

#删除原先内容
[root@centos-test ~]#  rm -f /etc/yum.repos.d/*

然后新建home.repo:

#新建home.repo
[root@centos-test ~]# vim /etc/yum.repos.d/home.repo

#填入内容
[epel-home]
name=name=Terence homebase mirror
baseurl=http://mirror.t.com/epel/7/x86_64/
enabled=1
gpgcheck=0

[centos7-base]
name=name=Terence homebase mirror
baseurl=http://mirror.t.com/centos/7/os/x86_64/
enabled=1
gpgcheck=0

[centos7-updates]
name=name=Terence homebase mirror
baseurl=http://mirror.t.com/centos/7/updates/x86_64/
enabled=1
gpgcheck=0

[centos7.3.1611-base]
name=name=Terence homebase epel mirror
baseurl=http://mirror.t.com/centos/7.3.1611/os/x86_64/
enabled=1
gpgcheck=0

[centos7.3.1611-updates]
name=name=Terence homebase epel mirror
baseurl=http://mirror.t.com/centos/7.3.1611/updates/x86_64/
enabled=1
gpgcheck=0

完成后清除源先的缓存再建立缓存:

#清除缓存
[root@centos-test ~]# yum clean all

#建立缓存
[root@centos-test ~]# yum makecache

最后查询一个rpm安装包进行验证:

[root@centos-test ~]# yum info rxjava
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
可安装的软件包
名称    :rxjava
架构    :noarch
版本    :1.0.13
发布    :2.el7
大小    :698 k
源    :epel-home
简介    : Reactive Extensions for the JVM
网址    :https://github.com/ReactiveX/RxJava
协议    : ASL 2.0
描述    : RxJava a library for composing asynchronous and
         : event-based programs using observable sequences
         : for the Java VM.

在第10行(高亮行)中可以看到,安装源义经改为了epel-home这个源。

0x05 结语

上面我所同步的源,文件大小在32GiB左右。请预留出足够的空间用于存储文件。另外在同步简易shell脚本中的 createrepo 命令可能会导致高CPU使用率,第一次建立repo数据库后可以使用:

createrepo --update

这个命令来更新数据库,而不需要重新建立。

最新的配置文件请浏览我的私有gitlab:

0x06 相关视频

https://www.bilibili.com/video/av20423498/