###############################################################################
#
Name : Mahavairocana
#
Author : Mahavairocana
#
QQ : 10353512
#
WeChat : shenlan-qianlan
#
Blog : http://www.cnblogs.com/Mahavairocana/
#
Description : You are welcome to reprint, or hyperlinks to indicate the
#
source of the article, as well as author
information.
###############################################################################
一:服务简介
借助于yun软件仓库,可以完成安装。卸载,自动升级rpm软件包等任务,能自动查找并且解决rpm包之间的依赖关系,无需网络管理员去手动的安装每一个rpm包,特别是在一个拥有大量linux主机的本地网络中么构建一台源服务器,可以大大缓解软件的安装。
YUM是Yellow dog Updater Modified的简称,yum是软件的仓库,它可以是http或ftp站点,也可以是本地软件池,但必须包含rpm的header, header包括了rpm包的各种信息,包括描述,功能,提供的文件,依赖性等.正是收集了这些 header并加以分析,才能自动化地完成余下的任务.
二:运行原理
Yum的大概工作流程:当客户机或本机(本地yum)使用yum安装软件时,执行yum -y install 要安装的软件名时,yum机制会根据在客户机事先配置以.repo为后缀的文件找到yum源也就是yum仓库,最为关键的是,在此文件中的baseurl项指定了yum仓库的软件数据库,客户机安装软件的请求首先到达软件数据库。软件数据库中记录了每个rpm数据包的包头信息以及依赖关系,找到要安装的软件包以及依赖关系软件包后,到rpm包文件中找到软件包,下载到本地,最后安装。
yum的工作需要两部分来合作,一部分是yum服务器,还有就是client的yum工具。下面分别介绍两部分工作原理。
yum服务器
所有要发行的rpm包都放在yum服务器上以提供别人来下载,rpm包根据kernel的版本号,cpu的版本号分别编译发布。yum服务器只要提供简单的下载就可以了,ftp或者httpd的形式都可以。yum服务器有一个最重要的环节就是整理出每个rpm包的基本信息,包括rpm包对应的版本号,conf文件,binary信息,以及很关键的依赖信息。在yum服务器上提供了createrepo工具,用于把rpm包的基本概要信息做成一张"清单",这张"清单""就是描述每个rpm包的spec文件中信息。
yum client端
client每次调用yum install或者search的时候,都会去解析/etc/yum.repos.d下面所有以.repo结尾的配置文件,这些配置文件指定了yum服务器的地址。yum会定期去"更新"yum服务器上的rpm包"清单",然后把"清单"下载保存到yum自己的cache里面,根据/etc/yum.conf里配置(默认是在/var/cache/yum下面),每次调用yum装包的时候都会去这个cache目录下去找"清单",根据"清单"里的rpm包描述从而来确定安装包的名字,版本号,所需要的依赖包等,然后再去yum服务器下载rpm包安装。(前提是不存在rpm包的cache)
三:服务搭建
1. 安装工具createrepo yum install createrepo 2. 建立repo发布目录 mkdir /var/www/yum/centos/5/{i386,x86_64} mkdir /var/www/yum/centos/6/{i386,x86_64} 3. 用rpmbuild生成两个rpm包,比如说下面几个包,版本号不一样,包名字不一样 rpm_test-0.0.1-3.noarch.rpm rpm_test-0.0.2-3.noarch.rpm rpm_test2-0.0.2-3.noarch.rpm 4. copy rpm包到发布目录下 cp rpm_test-0.0.* /var/www/yum/centos/5/i386/ 5. 用createrepo生成meta信息 createrepo -o /var/www/yum/centos/5/i386/ /var/www/yum/centos/5/i386 3/3 - rpm_test-0.0.1-3.noarch.rpm Saving Primary metadata Saving file lists metadata Saving other metadata 6. 配置apache或者nginx到发布目录 在createrepo之后会在/var/www/yum/centos/5/i386/生成下面的目录和文件 tree repodata/ repodata/ |-- filelists.xml.gz |-- other.xml.gz |-- primary.xml.gz `-- repomd.xml gunzip filelists.xml.gz gunzip primary.xml.gz filelists.xml里面记录了所有rpm包列表,版本号,配置文件等 <package pkgid="19c82aa653a394ee1f7dbc7b694fbf0221bc1848" name="rpm_test" arch="noarch"><version epoch="0"
ver="0.0.1" rel="3"/><file>/usr/local/rpm_test/conf/test.conf</file><file>/usr/local/rpm_test/test.py</file><file
type="dir">/usr/local/rpm_test/conf</file></package> ... primary.xml里面记录描述了rpm包的依赖等信息
四、配置详解
1、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来存储生成的元数据,默认项。
2、yum 详解
Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。
基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
基本语法: yum [options] COMMAND
常用参数详解
-h:显示帮助信息; -y:对所有的提问都回答“yes”; -c:指定配置文件; -q:安静模式; -v:详细模式; -d:设置调试等级(0-10); -e:设置错误等级(0-10); -R:设置yum处理一个命令的最大等待时间; -C:完全从缓存中运行,而不去下载或者更新任何头文件。 参数 install:安装rpm软件包; update:更新rpm软件包; check-update:检查是否有可用的更新rpm软件包; remove:删除指定的rpm软件包; list:显示软件包的信息; search:检查软件包的信息; info:显示指定的rpm软件包的描述信息和概要信息; clean:清理yum过期的缓存; shell:进入yum的shell提示符; resolvedep:显示rpm软件包的依赖关系; localinstall:安装本地的rpm软件包; localupdate:显示本地rpm软件包进行更新; deplist:显示rpm软件包的所有依赖关系。 实例 部分常用的命令包括: 自动搜索最快镜像插件:yum install yum-fastestmirror 安装yum图形窗口插件:yum install yumex 查看可能批量安装的列表:yum grouplist 安装 yum install #全部安装 yum install package1 #安装指定的安装包package1 yum groupinsall group1 #安装程序组group1 更新和升级 yum update #全部更新 yum update package1 #更新指定程序包package1 yum check-update #检查可更新的程序 yum upgrade package1 #升级指定程序包package1 yum groupupdate group1 #升级程序组group1 查找和显示 yum info package1 #显示安装包信息package1 yum list #显示所有已经安装和可以安装的程序包 yum list package1 #显示指定程序包安装情况package1 yum groupinfo group1 #显示程序组group1信息yum search string 根据关键字string查找安装包 删除程序 yum remove | erase package1 #删除程序包package1 yum groupremove group1 #删除程序组group1 yum deplist package1 #查看程序package1依赖情况 清除缓存 yum clean packages #清除缓存目录下的软件包 yum clean headers #清除缓存目录下的 headers yum clean oldheaders #清除缓存目录下旧的 headers
3、yum 客户端配置
yum.conf
[root@Mahavairocana ~]# cat /etc/yum.conf [main] cachedir=/var/cache/yum #yum下载的RPM包的缓存目录 keepcache=0 #缓存是否保存,1保存,0不保存。 debuglevel=2 #调试级别(0-10),默认为2(具体调试级别的应用,我也不了解)。 logfile=/var/log/yum.log #yum的日志文件所在的位置 exactarch=1 #在更新的时候,是否允许更新不同版本的RPM包,比如是否在i386上更新i686的RPM包。 obsoletes=1 #这是一个update的参数,具体请参阅yum(8),简单的说就是相当于upgrade,允许更新陈旧的RPM包。 gpgcheck=1 #是否检查GPG(GNU Private Guard),一种密钥方式签名。 plugins=1 #是否允许使用插件,默认是0不允许,但是我们一般会用yum-fastestmirror这个插件。 installonly_limit=3 #允许保留多少个内核包。 exclude=selinux* #屏蔽不想更新的RPM包,可用通配符,多个RPM包之间使用空格分离。 # This is the default, if you make this bigger yum won't see if the metadata # is newer on the remote and so you'll "gain" the bandwidth of not having to # download the new metadata and "pay" for it by yum not having correct # information. # It is esp. important, to have correct metadata, for distributions like # Fedora which don't keep old packages around. If you don't like this checking # interupting your command line usage, it's much better to have something # manually check the metadata once an hour (yum-updatesd will do this). # metadata_expire=90m # PUT YOUR REPOS HERE OR IN separate files named file.repo # in /etc/yum.repos.d [root@Mahavairocana ~]#
[root@Mahavairocana ~]# cat /etc/yum.repos.d/CentOS-Base.repo
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client. You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#
[base] #其中serverid是用于区别各个不同的repository(必须有一个独一无二的名称。
name=CentOS-$releasever - Base #是对repository的描述,支持像$releasever $basearch这样的变量;
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra#baseurl
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ #是服务器设置中最重要的部分,只有设置正确,
才能从上面获取软件。其中url支持的协议有 http:// ftp:// file://三种。baseurl后可以跟多个url,你可以自己改为速度比较快的镜像站
gpgcheck=1 #是gpg验证是否开启的选项,1是开启,0是不开启,生产环境建议开启。
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
enabled=[1 or 0]#当某个软件仓库被配置成 enabled=0 时,yum 在安装或升级软件包时不会将该仓库做为软件包提供源。使用这个选项,可以启用或禁用软件仓库。
#通过 yum 的 --enablerepo=[repo_name] 和 --disablerepo=[repo_name] 选项,或者通过 PackageKit 的"添加/删除软件"工具,也能够方便地启用和禁用指定的软件仓库
几个变量:
$releasever,发行版的版本,从[main]部分的distroverpkg获取,如果没有,则根据redhat-release包进行判断。
$arch,cpu体系,如i686,athlon等
$basearch,cpu的基本体系组,如i686和athlon同属i386,alpha和alphaev6同属alpha。
对yum.conf设定完成,我们就可以好好体验yum带来的方便了。
五、最佳实践
再redhat系列,yum称之为yum源,如果一个公司有多种Linux类操作系统,那么就只能称之为镜像站了,国内典型的镜像站如清华、天翼云、网易等,部分站点提供了在线同步功能,测试了下速度相当快,我们可以再公司内部搭建一个镜像站,供内部服务器加固使用;
附录清华镜像站:https://mirrors.tuna.tsinghua.edu.cn/
使用https://mirrors.tuna.tsinghua.edu.cn/status 可以查看清华目前所有缓存的镜像大小、状态、以及种类;