测试配置yum仓库的http镜像


一、基础环境
1、在tvm-base的基础上,复制一个镜像为tvm-yum来测试。
2、网络:
eth0:host-only(用于虚拟内网,手动固定IP,这样从宿主机可以直接连接到这个vm)
eth1:NAT(用于上外网,动态IP)
[root@tvm-yum ~]# cd /etc/sysconfig/network-scripts/
[root@tvm-yum network-scripts]# cat ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.56.254
PREFIX=24
GATEWAY=192.168.56.1

[root@tvm-yum network-scripts]# cat ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp

[root@tvm-yum ~]# ip a s dev eth0 |grep global
    inet 192.168.56.254/24 brd 192.168.56.255 scope global eth0
[root@tvm-yum ~]# ip a s dev eth1 |grep global 
    inet 10.0.3.15/24 brd 10.0.3.255 scope global eth1
[root@tvm-yum ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.3.0        0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.56.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
0.0.0.0         10.0.3.2        0.0.0.0         UG    0      0        0 eth1

3、配置这台服务器为ntp和dns服务器,涉及:
1)ntp服务(防火墙放行:udp 123)
使用脚本配置:https://github.com/opera443399/ops/blob/master/bin/linux/init_datetime.sh
[root@tvm-yum ~]# sh init_datetime.sh s

2)dnsmasq服务 (防火墙放行:udp 53)
[root@tvm-yum ~]# yum -y install dnsmasq
将涉及域名写入hosts文件:
[root@tvm-yum ~]# cat /etc/hosts |grep -v localhost
127.0.0.1 tvm-yum
192.168.56.254 mirrors.office.test
192.168.56.254 ntp.office.test
192.158.56.252 cobbler.office.test

启动服务:
[root@tvm-yum ~]# service dnsmasq start
增加到开机启动:
[root@tvm-yum bin]# chkconfig dnsmasq on



二、配置web服务
1、防火墙放行80端口
2、配置httpd
若没有禁用selinux,则应当这样配置:
[root@tvm-yum ~]# chcon -Rv --type=httpd_sys_content_t /data/yum/repo/
否则,直接禁用selinux

[root@tvm-yum ~]# yum -y install httpd
调整httpd的配置:
[root@tvm-yum ~]# cat /etc/httpd/conf/httpd.conf |grep ServerName |grep ^[^#]
ServerName 127.0.0.1

虚拟主机:
[root@tvm-yum ~]# mv /etc/httpd/conf.d/welcome.conf /tmp/
[root@tvm-yum ~]# cat /etc/httpd/conf.d/mirrors.office.test.conf 
<VirtualHost *:80>
    ServerAdmin pc@office.test
    ServerName mirrors.office.test
    DocumentRoot /data/yum/repo
    
    ErrorLog logs/mirrors.office.test-error_log
    CustomLog logs/mirrors.office.test-access_log common

    <Directory /data/yum/repo>
        options Indexes FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>



3、启动httpd服务
[root@tvm-yum ~]# chown -R apache:apache /data/yum/repo
[root@tvm-yum ~]# service httpd start

接下来需要:
1)配置一个local yum 镜像,并定时从公网的mirrors同步数据。
注1:不需要i386目录,此处只用x86_64的版本。
注2:不需要isos目录,里面存放的是iso文件。
注3:不需要ppc64目录,里面是powerpc架构的。
2)提供local-office.repo文件,供客户端用。


三、配置目录和脚本,制作本地的yum镜像
[root@tvm-yum ~]# mkdir -p /data/yum/repo/{centos,epel}/6 /data/download/ /data/ops/bin/
1、从iso文件拷贝内容。本机目前只有CentOS-6.5的版本,当然,应该用6.6的更佳。
2种方式:
1)上传iso文件到/data/download/

2)也可以直接挂载光碟

[root@tvm-yum ~]# ls /data/download/
CentOS-6.5-x86_64-bin-DVD1.iso  CentOS-6.5-x86_64-bin-DVD2.iso

[root@tvm-yum ~]# mkdir -p /data/yum/repo/centos/6/os/x86_64

2、同步iso文件中的内容:
[root@tvm-yum ~]# mount -ro loop /data/download/CentOS-6.5-x86_64-bin-DVD1.iso /mnt
[root@tvm-yum ~]# rsync -avHPS /mnt/ /data/yum/repo/centos/6/os/x86_64/
[root@tvm-yum ~]# umount /mnt
[root@tvm-yum ~]# mount -ro loop /data/download/CentOS-6.5-x86_64-bin-DVD2.iso /mnt
[root@tvm-yum ~]# rsync -avHPS /mnt/ /data/yum/repo/centos/6/os/x86_64/
[root@tvm-yum ~]# umount /mnt

3、测试httpd服务的访问
访问:
http://mirrors.office.test/centos

抓包信息:
[root@tvm-yum ~]# curl -o /dev/null -v -I http://mirrors.office.test/centos/
* About to connect() to mirrors.office.test port 80 (#0)
*   Trying 192.168.56.254... connected
* Connected to mirrors.office.test (192.168.56.254) port 80 (#0)
> HEAD /centos/ HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: mirrors.office.test
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Tue, 14 Jul 2015 02:32:14 GMT
< Server: Apache/2.2.15 (CentOS)
< Connection: close
< Content-Type: text/html;charset=UTF-8
< 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Closing connection #0



chrome抓包信息:
Remote Address:192.168.56.254:80
Request URL:http://mirrors.office.test/centos/
Request Method:GET
Status Code:200 OK
Remote Address:192.168.56.254:80
Request URL:http://mirrors.office.test/centos/
Request Method:GET
Status Code:200 OK


4、选一个mirrors,通过脚本从mirrors同步。
这里我选择了一个支持rsync协议的镜像:
http://mirrors.ustc.edu.cn/centos/

可以在搜索引擎搜索“rsync epel  6/x86_64/”这类关键词来找mirros,当然这里也有一个centos的列表:
http://www.centos.org/download/mirrors/

配置脚本同步,并放到crontab中定时执行
----------------------------------------
[root@tvm-yum bin]# cat repo_update.sh 
#!/bin/bash
#
# 2015/7/17

f_log='/tmp/repo_update_run.log'

if [ -f /var/lock/subsys/repo_update ]; then
    echo "[`date`] 同步任务已经在执行中。" >>${f_log}
    exit 0
fi

d_centos='/data/yum/repo/centos/6'
d_epel='/data/yum/repo/epel/6'
-d ${d_centos} ||mkdir -p ${d_centos}
-d ${d_epel} ||mkdir -p ${d_epel}


touch /var/lock/subsys/repo_update

### centos ###
echo "[`date`] 开始同步centos"  >>${f_log} 
rsync -avzP --delete --delete-excluded --exclude "isos" --exclude "i386" rsync://mirrors.ustc.edu.cn/centos/6/ /data/yum/repo/centos/6/ 2>>${f_log}
echo "[`date`] 操作结束。"  >>${f_log} 
### epel ###
echo "[`date`] 开始同步epel"  >>${f_log} 
rsync -avzP --delete  --delete-excluded --exclude "i386" --exclude "ppc64" rsync://mirrors.ustc.edu.cn/epel/6/ /data/yum/repo/epel/6/ 2>>${f_log}
echo "[`date`] 操作结束。"  >>${f_log} 

rm /var/lock/subsys/repo_update
echo "[`date`] 完成本次任务。"  >>${f_log} 

chown -R apache:apache /data/yum/repo

----------------------------------------

放到crontab中
[root@tvm-yum ~]# cat <<_NTP >>/var/spool/cron/root
# repo update
0 4 * * * /bin/bash /data/ops/bin/repo_update.sh >/tmp/repo.log 2>&1 &
_NTP



先手动执行一次:
[root@tvm-yum ~]# /bin/bash /data/ops/bin/repo_update.sh >/tmp/repo.log 2>&1 &

5、提供一个office源,供自定义的安装,包含企业定制rpm包,新版本的开源软件的rpm包
[root@tvm-yum ~]# yum install createrepo
[root@tvm-yum ~]# mkdir -p /data/yum/repo/office/centos/6/x86_64
[root@tvm-yum ~]# cd /data/yum/repo/office/6/x86_64
[root@tvm-yum x86_64]# wget 

还可以一次下载多个rpm包:
[root@tvm-yum ~]# wget --execute robots=off -nc -nd -r -l1 -A'*.rpm' http://download.gluster.org/pub/gluster/glusterfs/3.6/LATEST/CentOS/epel-6/x86_64/ 

使用createrepo工具:
[root@tvm-yum x86_64]# createrepo .
[root@tvm-yum ~]# cd -
[root@tvm-yum ~]# chown -R apache:apache /data/yum/repo              
              
6、提供local-office.repo文件
现有的目录:
[root@tvm-yum ~]# tree /data/yum/repo/ -L 3
/data/yum/repo/
├── centos
│   ├── 6
│   │   ├── centosplus
│   │   ├── cloud
│   │   ├── contrib
│   │   ├── cr
│   │   ├── extras
│   │   ├── fasttrack
│   │   ├── os
│   │   ├── SCL
│   │   ├── updates
│   │   └── xen4
│   └── RPM-GPG-KEY-CentOS-6
├── epel
│   ├── 6
│   │   ├── SRPMS
│   │   └── x86_64
│   └── RPM-GPG-KEY-EPEL-6
├── local-office.repo
└── office
    └── 6
        └── x86_64

制作文件:local-office.repo
-----------------------------------
[root@tvm-yum ~]# cat /data/yum/repo/local-office.repo 
#
# local-office.repo
# 2015/8/6
# 包含:Centos-Base, epel, office源。
#

# ------------------ 包含基础的os里面的rpm包
[base]
name=CentOS-$releasever - Base
baseurl=http://mirrors.office.test/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.office.test/centos/RPM-GPG-KEY-CentOS-$releasever

#released updates - 包含可以更新的包
[updates]
name=CentOS-$releasever - Updates
baseurl=http://mirrors.office.test/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.office.test/centos/RPM-GPG-KEY-CentOS-$releasever

#additional packages that may be useful - 包含额外的包
[extras]
name=CentOS-$releasever - Extras
baseurl=http://mirrors.office.test/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.office.test/centos/RPM-GPG-KEY-CentOS-$releasever

#additional packages that extend functionality of existing packages - 包含功能扩展的包
[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://mirrors.office.test/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.office.test/centos/RPM-GPG-KEY-CentOS-$releasever

#contrib - packages by Centos Users - 包含用户贡献的包
[contrib]
name=CentOS-$releasever - Contrib
baseurl=http://mirrors.office.test/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.office.test/centos/RPM-GPG-KEY-CentOS-$releasever

# ------------------ epel - 包含额外的包
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
baseurl=http://mirrors.office.test/epel/6/$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=http://mirrors.office.test/epel/RPM-GPG-KEY-EPEL-$releasever

[epel-debuginfo]
name=Extra Packages for Enterprise Linux 6 - $basearch - Debug
baseurl=http://mirrors.office.test/epel/6/$basearch/debug
failovermethod=priority
enabled=0
gpgkey=http://mirrors.office.test/epel/RPM-GPG-KEY-EPEL-$releasever
gpgcheck=1

[epel-source]
name=Extra Packages for Enterprise Linux 6 - $basearch - Source
baseurl=http://mirrors.office.test/epel/6/SRPMS
failovermethod=priority
enabled=0
gpgkey=http://mirrors.office.test/epel/RPM-GPG-KEY-EPEL-$releasever
gpgcheck=1

# ------------------ office - 包含企业定制rpm包,新版本的开源软件的rpm包
[office]
name=enterprise office repo
baseurl=http://mirrors.office.test/office/$releasever/$basearch/
gpgcheck=0
enabled=1

-----------------------------------

注意:
/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 这个key一开始是不存在的,这里由http服务来提供,在repo文件中指向到对应的URL:
gpgkey=http://mirrors.office.test/epel/RPM-GPG-KEY-EPEL-$releasever

GPG-KEY在这里:
[root@tvm-yum ~]# cp /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 /data/yum/repo/centos/
[root@tvm-yum ~]# cp /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 /data/yum/repo/epel/
默认安装centos后已经有了RPM-GPG-KEY-CentOS-6,RPM-GPG-KEY-EPEL-6可以通过安装公网的epel源来获取:
# rpm -Uvh http://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm

当然了,我们应该移除现有的repo文件,仅使用上面提供的自己的repo配置即可:
【在本地】
[root@tvm-yum ~]# mv /etc/yum.repos.d/*.repo /tmp/
[root@tvm-yum ~]# cp /data/yum/repo/local-office.repo /etc/yum.repos.d/local-office.repo
【在客户端】
[root@tvm-rpm ~]# mv /etc/yum.repos.d/*.repo /tmp/ \
&& wget http://mirrors.office.test/local-office.repo -O /etc/yum.repos.d/local-office.repo \
&& yum clean all \
&& yum makecache





四、等mirros同步完成后,开始测试
1、本机测试
先清除缓存:
[root@tvm-yum ~]# yum clean all
Loaded plugins: fastestmirror, security
Cleaning repos: base extras updates
Cleaning up Everything
Cleaning up list of fastest mirrors

试着更新下系统:
[root@tvm-yum ~]# yum update
(略)
(369/369): yum-utils-1.1.30-30.el6.noarch.rpm                                 | 110 kB     00:00     
-----------------------------------------------------------------------------------------------------
Total                                                                 16 MB/s | 430 MB     00:26     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
(略)
  yum.noarch 0:3.2.29-60.el6.centos                                                                  
  yum-plugin-fastestmirror.noarch 0:1.1.30-30.el6                                                    
  yum-plugin-security.noarch 0:1.1.30-30.el6                                                         
  yum-utils.noarch 0:1.1.30-30.el6                                                                   

Replaced:
  libsss_autofs.x86_64 0:1.9.2-129.el6                                                               

Complete!
[root@tvm-yum ~]# 
[root@tvm-yum ~]# cat /etc/issue
CentOS release 6.6 (Final)
Kernel \r on an \m

2、瞧,已经升级到6.6的版本,建议reboot一下先。
reboot前,先将httpd服务加入开机启动。
[root@tvm-yum centos]# chkconfig httpd on
[root@tvm-yum centos]# chkconfig --list |grep httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off


用update升级系统后,在/etc/yum.repos.d/里面更新了CentOS相关的repo文件,因此在重启后可以考虑移除
[root@tvm-yum ~]# mv -f CentOS-* /etc/yum.repos.d/ /tmp/


五、客户端使用local-office.repo文件
[root@tvm-rpm ~]# yum update
符合预期。
[root@tvm-rpm ~]# yum install nginx
[root@tvm-test conf.d]# nginx -v
nginx version: nginx/1.8.0
符合预期。



ZYXW、参考
1、Creating a local repo (Mirror) with CentOS 6.2+
http://darktraining.com/93/

2、Creating Local Mirrors for Updates or Installs
https://wiki.centos.org/HowTos/CreateLocalMirror

3、List of CentOS Mirrors
http://www.centos.org/download/mirrors/

4、How To Set Up and Use Yum Repositories on a CentOS 6 VPS
https://www.digitalocean.com/community/tutorials/how-to-set-up-and-use-yum-repositories-on-a-centos-6-vps