Centos6.4 搭建公网yum源服务器
机房太多,服务器太多,只能允许某些有需求的服务器能够出网,这就需要在线上机房搭建一套或者多个yum服务器,方便服务器进行yum安装操作。
之前的博客已经对用光盘搭建本地Yum源和搭建web源做了简单的记录,这里详细的记录一下。
关于光盘搭建内网yum源的url:https://blog.51niux.com/?id=30
一、用光盘文件搭建类似于公网yum源服务器
上面的连接有部署过程,这里就不再重复的操作一遍了,首先web环境部署好了,还是nginx。
# mkdir -p /usr/local/nginx/html/centos/6.4/os/x86_64/ #参考官网yum模式,先创建一个6.4的yum源目录
# mkdir /tmp/cdrom/centos6.4 -p #创建光盘挂载目录
# mount -o loop -t iso9660 /ISO/CentOS-6.4-x86_64-bin-DVD1.iso /tmp/cdrom/centos6.4 #挂载光盘镜像
创建yum源的方法一:#如果你只是安装这里还是推荐第一种方法的,省事,但是如果光盘下面没有repodata/,或者你不是一个光盘没有repodata/目录,就要用方法二
# cp -r /tmp/cdrom/centos6.4/* /usr/local/nginx/html/centos/6.4/os/x86_64/ #直接复制光盘下面的所有文件到指定目录就好了
注意:第一种方法,只是适用于服务器优化只安装一些基础包的操作,但是如果你有第三方的源需要yum安装,就需要用第二种方式createrepo 自定义yum源了,要给这个第三方软件包的汇总目录建立索引。
好的yum源创建完成了,进行下一步:
# cd /usr/local/nginx/html/centos/
# ln -s 6.4 6 #为什么要做软连接呢,官网都是版本号做的软连接,下面会说。另外客户端?release=$releasever这个地方取得是大版本号,如不管你是Centos 6.4 6.2 6.3 6.8 去yum的时候都会寻找URL:YUM源地址/centos/6 这个路径,所以如果你服务端不做软连接,客户端的配置文件就要改动。
到此我们服务器的初步搭建已经完毕。
客户端操作:
# vi CentOS-Base.repo #修改yum源只留下下面这段,但是看客户端配置,貌似也跟下面讲的第三种方法很像啊,但是yum源的目录结构设置成这样一是为了规范,而是为了如果做公网yum源,这种方式方便进行同步。
[base]
name=CentOS-$releasever - Base
baseurl=http://192.168.1.112/centos/$releasever/os/$basearch/ #192.168.1.112为我的yum源服务器,也就是将mirror.centos.org替换掉
gpgcheck=1
gpgkey=http://192.168.1.112/centos/$releasever/os/$basearch/RPM-GPG-KEY-CentOS-6
# yum clean all #清空yum缓存
# yum install wget -y #进行yum测试是成功的。
博文来自:www.51niux.com
创建yum源的方法二:
紧接着方法一继续操作,这里就规范操作了,假设我们已经有了centos6.4的光盘做的yum源。
这时候如果我们所有服务器都需要安装第三方的软件,如puppet,mcollective等,想在初始化系统的时候一同yum安装,这时候我们就涉及到了一个自定义第三方epel源的操作。
# yum install createrepo -y #管理yum源需要一个工具,这次我们用这个创建一个自定义的yum源服务器
#现在我们把所有的第三方的rpm包都放到了一个目录下面,把第三方的rpm包以及关联的软件包都放到了 /usr/local/nginx/html/centos/6.4/epel/x86_64/Packages/目录下面:
puppet的软件包:
augeas-libs-0.9.0-4.el6.x86_64.rpm
compat-readline5-5.2-17.1.el6.x86_64.rpm
facter-2.4.1-1.el6.x86_64.rpm
hiera-1.3.4-1.el6.noarch.rpm
libselinux-ruby-2.0.94-5.3.el6.x86_64.rpm
puppet-3.7.5-1.el6.noarch.rpm
ruby-1.8.7.352-7.el6_2.x86_64.rpm
ruby-augeas-0.4.1-3.el6.x86_64.rpm
rubygem-json-1.5.5-3.el6.x86_64.rpm
rubygems-1.3.7-1.el6.noarch.rpm
ruby-irb-1.8.7.352-7.el6_2.x86_64.rpm
ruby-libs-1.8.7.352-7.el6_2.x86_64.rpm
ruby-rdoc-1.8.7.352-7.el6_2.x86_64.rpm
ruby-shadow-2.2.0-2.el6.x86_64.rpm
mcollective相关的软件包:
mcollective-2.8.1-1.el6.noarch.rpm
mcollective-common-2.8.1-1.el6.noarch.rpm
mcollective-facter-facts-1.0.0-1.noarch.rpm
mcollective-puppet-agent-1.9.3-1.el6.noarch.rpm
mcollective-puppet-common-1.9.3-1.el6.noarch.rpm
mcollective-service-agent-3.1.3-1.el6.noarch.rpm
mcollective-service-common-3.1.3-1.el6.noarch.rpm
rubygem-stomp-1.3.2-1.el6.noarch.rpm
注:第三方的rpm包可以去:
http://download.fedoraproject.org/pub/epel/7,http://download.fedoraproject.org/pub/epel/6 链接去下载,当然可能版本不能达到你的要求,你要最新的,可以去相关软件的官网去寻找高版本。
rsync的路径: rsync://mirrors.tuna.tsinghua.edu.cn/epel/
# createrepo -p -d -o /usr/local/nginx/html/centos/6.4/epel/x86_64/ /usr/local/nginx/html/centos/6.4/epel/x86_64/ #目录要指定两次,不然会报错,创建一个第三方的以epel命令的yum源
Spawning worker 0 with 22 pkgs
Saving Primary metadata #这些信息是提示信息,说明创建成功了。
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
# createrepo -p -d -o /usr/local/nginx/html/centos/6.4/epel/x86_64/ #此为错误的操作
Error: Must specify a directory to index. #此为报错信息
Usage: genpkgmetadata.py [options]
# ls -l /usr/local/nginx/html/centos/6.4/epel/x86_64/repodata/ #repodata目录已经产生,这个就是yum源的Meta数据。repodata里面包含了一个以 .xml结尾的文件,这个文件是yum记录了几个压缩包的md5值。
总用量 104
-rw-r--r--. 1 root root 5320 11月 9 14:36 046c5e6689babe88e0ffe2038f51493956c5aedbd1f76503c797fb4a976e65ea-primary.xml.gz
-rw-r--r--. 1 root root 6499 11月 9 14:36 30be72afcca2425d34c9967f87565e868dccfe6b8c630c617f70b0324fe8dc76-other.xml.gz
-rw-r--r--. 1 root root 21977 11月 9 14:36 55e299f59e557fedf8a9d4d73023dc3395809a0bfcb5287d034bcea7a9c117ec-filelists.xml.gz
-rw-r--r--. 1 root root 29446 11月 9 14:36 61d4a1d689eb30816d552b724ebe8cd6109b75f018007d8b046b9562038c2431-filelists.sqlite.bz2
-rw-r--r--. 1 root root 10789 11月 9 14:36 aa98c579269ca319cca373d1b76d45f4fce7c1595e9c1d3a195c904002176760-other.sqlite.bz2
-rw-r--r--. 1 root root 12450 11月 9 14:36 cb6c301b995fbaae1b16a91b4b6ccd676f634be6e61e68b6d125922c166dbc12-primary.sqlite.bz2
-rw-r--r--. 1 root root 2989 11月 9 14:36 repomd.xml
客户端的配置,紧接第一个方法继续在客户端创建一个新的repo文件:
CentOS-epel.repo
[epel]
name=CentOS-$releasever - epel
baseurl=http://192.168.1.112/centos/$releasever/epel/$basearch/
enabled=1
gpgcheck=0
博文来自:www.51niux.com
下面是关于createrepo的详细参数:
createrepo用以创建yum源(软件仓库),即为存放于本地特定位置的众多rpm包建立索引,描述各包所需依赖信息,并形成元数据。
基本语法:createrepo [option] <directory>
常用参数详解
-u --baseurl <url>
指定Base URL的地址
-o --outputdir <url>
指定元数据的输出位置
-x --excludes <packages>
指定在形成元数据时需要排除的包
-i --pkglist <filename>
指定一个文件,该文件内的包信息将被包含在即将生成的元数据中,格式为每个包信息独占一行,不含通配符、正则,以及范围表达式。
-n --includepkg
通过命令行指定要纳入本地库中的包信息,需要提供URL或本地路径。
-q --quiet
安静模式执行操作,不输出任何信息。
-g --groupfile <groupfile>
指定本地软件仓库的组划分,范例如下:createrepo -g comps.xml /path/to/rpms
注意:组文件需要和rpm包放置于同一路径下。
-v --verbose
输出详细信息。
-c --cachedir <path>
指定一个目录,用作存放软件仓库中软件包的校验和信息。当createrepo在未发生明显改变的相同仓库文件上持续多次运行时,指定cachedir会明显提高其性能。
--update
如果元数据已经存在,且软件仓库中只有部分软件发生了改变或增减,则可用update参数直接对原有元数据进行升级,效率比重新分析rpm包依赖并生成新的元数据要高很多。
-p --pretty
以整洁的格式输出xml文件。
-d --database
该选项指定使用SQLite来存储生成的元数据,默认项。
创建Yum源的方法三:
还有一种方法,就是相当于第一种和第二种方法的结合,服务器端用ftp或者http服务器做yum源服务器,直接就创建一个目录,然后把所有的rpm包,不去区分什么光盘自带的包,还是网上下载的rpm包,都统统的丢到一个目录里面。然后用第二种方法创建一个自定义包,如:在ftp目录下面就创建一个centos6.4目录,所有的包都丢里面,然后用createrepo创建一下。
然后客户端:
将/etc/yum.repo/目录下的所有repo文件都移到一个备份目录里面,然后只留下下面的repo文件
cat /etc/yum.repo/ftp.repo
[ftp] #如果是ftp就写[ftp],http就写成http
name=ftp #名字自己定义,同上
baseurl=ftp://yum源IP/centos6.4 # 这里是软件目录的url,ftp://yum源IP/源目录,http协议就改成http://yum源IP/centos6.4
enabled=1 #启动yum源
gpgcheck=0 #不检查GPG-KEY
这第三种方法也是可以的,但是有点糙哈。
博文来自:www.51niux.com
二、创建与公网yum源一致的的yum源服务器
先说一个不陌生的链接:http://mirror.centos.org/centos/ #这是我们安装centos系统,系统里面指定的官网yum源,我们只要是可以访问外网的,便可以进行yum源的下载。我们也会将源repo里面的url指向国内的如:http://mirrors.sohu.com/centos/,http://mirrors.163.com/centos/等,这些都是官网指定的yum源下载站。
通过上面的截图,我们可以看出,centos官网指定了一下大的yum源站点,而这些站点的目录结构跟centos官方的源是一样的,我们所讲的做公网yum源,一般也是从这些公网yum源同步数据到本地。但是呢啊,如mirror.centos.org这种网站,我们想rsync差异化的同步数据到本地,但是却不知道如何定义,人家的模块没有定义为centos,我不知道他的模块名称叫什么,网友知道可以告诉我一下,谢谢。然后就只能在国内这些大的yum源也是官网指定有保障的yum源站点里面找一找了。
这里有一个:rsync.mirrors.ustc.edu.cn #中国科技大学的yum源,好人啊
好了,可以同步的公网yum源找到了,那么下一步就是应该进行同步了,但是呢,官网源从2.1到7,要是都下载下来太大了,而且我们又用不了,然后isos下面的光盘的ISO镜像我们也用不到,然后还有i386的目录我们也用不到,好吧,为了节省带宽和磁盘空间,我们就麻烦点吧。
#mkdir /opt/test
#cd /opt/test
# rsync -avzrLP --include='*/' --exclude='*' rsync://rsync.mirrors.ustc.edu.cn/centos/ /opt/test/ #将官方源的目录结构都给下载下来了
下一步就是进入/opt/test目录,把我们所需要得要下载的目录做一个列表,不需要的也做一个列表,也是日后我们进行rsync所需要的列表。
其实我们只要同步6和7两个目录就行,因为官网都是做的软连接,是6指向的是最新版,7指向的是最新版。我们要把i386的目录摘出去。
# tree -L 2|grep -v i386|grep -v x86_64|awk {'print $NF'}|egrep -v "^$|\.|files"|grep -v isos #好下面的目录就是我们摘出来的要进行下载的目录
centosplus
cloud
contrib
cr
extras
fasttrack
os
sclo
storage
updates
virt
# cat centos.txt 好,那么做这么一个列表
centosplus/x86_64
cloud/x86_64
contrib/x86_64
cr/x86_64
extras/x86_64
fasttrack/x86_64
os/x86_64
sclo/x86_64
storage/x86_64
updates/x86_64
virt/x86_64
#for num in `cat /var/www/html/centos.txt`;do wget -r http://mirror.centos.org/centos/6/$num;done #然后找个目录for循环来拉网站内容就可以了
#for num in `cat /var/www/html/centos.txt`;do wget -r http://mirror.centos.org/centos/7/$num -p /var/www/html/;done #7也一样。
然后下来就需要:rsync://http://centos.ustc.edu.cn #用这个链接进行rsync进行同步了。
还有另外一种方法也不是很高明的方法:
因为我们不知道官网的rsync的同步路径,所以只能去国内的一些yum源服务器去同步,但是毕竟不是官方的,难免不是太安全,那么我就想了一个同步官网的yum源而又不是将整个官网yum源下面的文件全量下载的形式。当然如果哪个网友知道官网的rsync的路径,请告知一下。
第一步:首先还是按照上面的方法wget -r 全量将一些我们需要用到的目录,全量下载下来。这是我们每天定时同步的基础。
第二步:我们可以用curl命令,去抓取网站页面啊,所以还是要借助上面把我们所需要同步的目录做到一个列表里面,用for循环去循环执行curl命令,下面是一个命令的举例:
curl http://mirror.centos.org/centos/7/os/x86_64/Packages/|awk {'print $6,$7'}|awk -F '[">]' {'print $2,$NF'}|grep -v "^$">>/data/centos/7/os/x86_64/centos-list.txt
#这样我们就会将一个目录下面的rpm名称以及修改时间都导入到一个文件里面去,因为不止一个目录嘛,所以要导入的地方也搞成同样的目录插入进去对应的列表。
第三步:那么第二天再进行相同的操作,跟第一天用curl做成的列表一批对,有什么变化,如果有新增的rpm包,我们就可以通过文本列表之间的比对给过滤出来了,然后就可以通过wget去下载单个的文件,而不是去全量的去下载某个目录了。这样我们也能记录我们做了哪些操作,更新了哪些文件等。
这种就需要两个脚本,一个是生成列表脚本,一个是匹配并下载脚本。
当然还有一种方法,也不是什么很高明的方法:
wget -N :-N 只下载比当前文件新的文件
例子:
# wget -r -N http://mirror.centos.org/centos/7/os/x86_64/Packages/
第一次下载时候的截图:
第二次再下载:
--2016-11-15 11:28:36-- http://mirror.centos.org/centos/7/os/x86_64/Packages/389-ds-base-1.3.4.0-19.el7.x86_64.rpm
Reusing existing connection to mirror.centos.org:80.
HTTP request sent, awaiting response... 200 OK
Length: 1746256 (1.7M) [application/x-rpm]
Server file no newer than local file `mirror.centos.org/centos/7/os/x86_64/Packages/389-ds-base-1.3.4.0-19.el7.x86_64.rpm' -- not retrieving.
--2016-11-15 11:28:37-- http://mirror.centos.org/centos/7/os/x86_64/Packages/389-ds-base-devel-1.3.4.0-19.el7.x86_64.rpm
Reusing existing connection to mirror.centos.org:80.
HTTP request sent, awaiting response... 200 OK
Length: 182484 (178K) [application/x-rpm]
Server file no newer than local file `mirror.centos.org/centos/7/os/x86_64/Packages/389-ds-base-devel-1.3.4.0-19.el7.x86_64.rpm' -- not retrieving.
--2016-11-15 11:28:37-- http://mirror.centos.org/centos/7/os/x86_64/Packages/389-ds-base-libs-1.3.4.0-19.el7.x86_64.rpm
Reusing existing connection to mirror.centos.org:80.
HTTP request sent, awaiting response... 200 OK
Length: 644896 (630K) [application/x-rpm]
注意:就没有下载操作了,因为:Server file no newer than local file,服务器没有比本地文件新。
至此,根据这种方式也可以编写一个脚本进行每晚的自动同步工作,也可以从官方同步yum源既作证了本地的yum源服务器的资源是最新的,也能保证yum源服务器资源来源的安全可控度。
#注意:这种wget -r 直接扒官网目录的形式,下载到本地之后每个目录下面,只要是目录就会有哦,如下图:
#当然不删除这些index.html也没事,当然保证一致性最好删除掉,可以进入到centos目录下面,然后执行一条简单的命令:find ./ -name "index.html\?*" -exec rm -rf {} \; #目录下的index.html还是要留下的页面会好看点。
#然后就可以写个检测脚本,很简单,就检测官网首页是不是又产生新的Centos版本目录了,那就说明又出新版了,然后跟本地一对比发现官网有了本地没有,那么就执行下扒官网脚本然后清除下没用的信息,然后进行yum源同步(可能不同机房都有yum源服务器或者是根据电信联通等划分的),然后改变yum源服务器的软连接指向,你的自建yum源又跟官网一致了,一般机房带宽都比较高,所以滞后时间也不会差太多。一个官网yum源某一个版本,如Centos7.4,不含iso目录,并且只下载x86-64的目录(Centos6系统还存在i386的目录,Centos7系列已经没有了,所以Centos6系统的源目录要比Centos7的目录要大很多)总目录大小在30G左右。
当然这些都不是什么复杂的操作,yum源的搭建也不是什么复杂的东西,稍微一想就会有很多方法出来,就记录这么几种吧。
另外:你会发现官网yum源只有最新的yum源,如果你想用以前旧的yum源怎么办呢,比如现在Centos7指向的是Centos 7.3的源,我想下载7.2的源包文件怎么办呢?我想下载Centos 7.2的ISO镜像怎么办呢?
链接地址:http://vault.centos.org #这是官网旧系统的备份源,要是想下载非最新的可以来这里找。
#注意:如果你想用wget -r的方式将这个旧官网源扒一遍的话,要稍微有点不一样的,要做一个哪些目录是要下载的列表,如下图:
#因为有些目录是没必要下载的,如果你不搞直接wget -r 一个大目录的话,你会发现都下载了好几G了还没有进入主题,会下载很多没用的东西,另外一个每个这种子目录下面都会有一个Source目录,这也是我们所不需要的,也会浪费带宽去下载无用的东西,然后做好要下载的列表之后,就写个简单的for循环脚本,去for循环的去wget就好了,丢到后台让它自己跑就可以了。