柴少的官方网站 技术在学习中进步,水平在分享中升华

Centos6.4 搭建公网yum源服务器

机房太多,服务器太多,只能允许某些有需求的服务器能够出网,这就需要在线上机房搭建一套或者多个yum服务器,方便服务器进行yum安装操作。

之前的博客已经对用光盘搭建本地Yum源和搭建web源做了简单的记录,这里详细的记录一下。

关于光盘搭建内网yum源的url:http://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测试是成功的。

blob.png

博文来自: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/7http://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源下载站。

blob.png

通过上面的截图,我们可以看出,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/

第一次下载时候的截图:

blob.png

第二次再下载:

--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 直接扒官网目录的形式,下载到本地之后每个目录下面,只要是目录就会有哦,如下图:

图片.png

#当然不删除这些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的方式将这个旧官网源扒一遍的话,要稍微有点不一样的,要做一个哪些目录是要下载的列表,如下图:

图片.png

#因为有些目录是没必要下载的,如果你不搞直接wget -r 一个大目录的话,你会发现都下载了好几G了还没有进入主题,会下载很多没用的东西,另外一个每个这种子目录下面都会有一个Source目录,这也是我们所不需要的,也会浪费带宽去下载无用的东西,然后做好要下载的列表之后,就写个简单的for循环脚本,去for循环的去wget就好了,丢到后台让它自己跑就可以了。

作者:忙碌的柴少 分类:yum源服务 浏览:6072 评论:0
留言列表
发表评论
来宾的头像