1. yum概述
之前在上一篇文章里提到的rpm包管理器虽然在数据库中为用户指定了程序包之间的依赖关系,但用户仍需根据程序包的依赖关系去手动使用rpm命令来安装每个程序包,过程略为繁琐。而yum作为前端管理工具则为用户解决这一问题。
yum的全称为:Yellow dog Updater, Modifier,是通过修改Yellow Dog Linux的Yellow Dog Updater开发而成。
yum是基于rpm包管理器的前端程序包管理器,可以从指定服务器上自动下载程序包,并自动分析程序包的元数据、自动处理程序包之间的依赖关系,能一次性安装完所有依赖的包,而无须繁琐地一次次安装所有依赖包。
需要注意的是,yum前端管理工具是基于rpm管理功能的,因此yum不能脱离rpm而存在。yum只是让程序包管理起来更为方便,但不意味着可以取代rpm。另外,yum访问文件服务器(仓库)的模式是基于C/S架构的,而文件服务器(仓库)则需要以某种共享服务方式将其提供的程序包及包相关的元数据提供给其他主机使用,通常使用到的协议有http、https、ftp、nfs等。此外,还可以使用光盘作为本地仓库或者自己制作本地仓库,通常使用到的协议是file。
因此对于用户来讲,使用yum这样的前端程序管理工具比直接使用rpm就要简便得多了。下面介绍yum的工作原理。
2. yum的工作原理
要能使用yum这个工具来安装程序包,首先要确保系统上支持rpm包管理功能,并且安装了yum程序。以下将使用yum下载程序包的流程绘制成图:
当用户使用yum去请求安装某一个程序包时,yum工具会先去yum配置文件中查找yum仓库指向的路径,根据该路径去访问远程或本地的文件服务器,这个服务器作为yum仓库并且存储了众多的rpm包以及包相关的元数据文件。当yum根据仓库路径访问到仓库后,会首先尝试请求获取rpm包的元数据文件并缓存至本地(/var/cache/yum目录),而这个元数据文件包括了该仓库所有rpm包的程序包名、版本号、依赖性以及每个程序包所提供的capabilities等。而后,yum根据用户要安装的程序包名去元数据文件里查找,看看仓库里是否有用户请求下载的程序包文件,如果找到了则根据元数据文件分析该程序包的依赖关系并分析本地系统上有哪些包已安装、哪些包还没安装,再将所有用户需要安装且本地尚未安装的程序包名列出来,并以客户端的角色发送至文件服务器(仓库)请求下载之。如果请求成功,则yum将要安装的程序包文件也缓存至本地并执行安装操作。安装完成之后将缓存的程序包文件删除以节约空间,而缓存中只留下元数据文件。
为什么只缓存元数据而不缓存程序包呢?因为程序包一般只安装一次即可,很少会再安装第二次,而且基于节约空间的考虑,因此yum在安装完程序包后会将缓存中的程序包删除。而缓存元数据好处则是当下一次用户使用yum请求安装程序包时可以节约带宽,无需再次重新请求获取全部的元数据文件,并且可以提高本地分析程序包的速度。
当用户第二次使用yum请求安装程序包时,基于实时同步更新缓存以及节约带宽的考虑,yum会先请求下载yum仓库下rpm包元数据的校验码文件至本地,将其与本地缓存上的元数据校验码相比较,如果相同,说明无须更新;如果不同,则说明仓库中rpm包已经更新,因此yum会重新请求下载仓库上的元数据文件以更新元数据缓存。接着同样是分析程序包依赖性、请求要安装的全部程序包等。
3. yum客户端配置文件
yum的配置文件主要有/etc/yum.conf和/etc/yum.repos.d/*.repo,其中/etc/yum.conf为主配置文件,为所有yum仓库提供公共配置;而/etc/yum.repos.d目录下以.repo结尾的文件则为各yum仓库的指向提供配置信息。需要注意的是,在CentOS发行版中,/etc/yum.repos.d目录下使用多个以.repo结尾的仓库配置文件是为了方便管理,既可以用多个以.repo结尾的文件分别配置多个不同的仓库指向,又可以在一个.repo文件中配置多个仓库指向。而且,当同时存在多个同一类的仓库时,每个仓库称为镜像,yum支持镜像列表插件并且只使用其中的一个仓库指向即可,因为同一类仓库中的程序包是相同的。这时应该使用离用户较近的镜像站点,在repo选项中可通过开销(cost)指定具体使用哪一个仓库。当同时存在多个不同类的仓库时,每个仓库中的程序包各不相同,yum也可同时分析、使用这些仓库。
我们通常在/etc/yum.repos.d目录下配置yum的指向路径相关信息,而在这个配置文件中的仓库指向的定义选项主要有以下几项:
[repositoryID] //仓库名 name=Some name for this repository //对repo作功能性说明; baseurl=url://path/to/repository/ //仓库指向的路径,可指向多个路径; enabled={1|0} //是否启用该仓库,默认为1(启用); gpgcheck={1|0} //是否要对程序包数据的来源合法性和数据完整性做校验; gpgkey=URL //指定GPG密钥文件的访问路径,可由仓库提供; enablegroups={1|0} //是否允许以组的方式管理仓库; failovermethod={roundrobin|priority} //当baseurl同时指向多个仓库路径时,可指定以什么方式选择url去访问仓库,以及当某一路径访问 失败时,可指定如何再选择路径;roundrobin是随机挑选路径访问,priority是自上而下选择路径访 问;默认为roundrobin; cost= //开销;开销越小,该仓库url更优;默认为1000.
各类型文件服务器:
示例:使用光盘当做本地yum仓库
(1) 挂载光盘至某目录,例如/media/cdrom
# mount -r -t iso9660 /dev/cdrom /media/cdrom
(2) 创建配置文件
[CentOS7] name=this is a local repo. baseurl=file:///media/cdrom gpgcheck=0 enabled=1
4. yum命令的用法
配置好本地仓库指向后,就可以使用yum安装程序包了,接下来介绍yum命令如何使用:
语法格式:
yum [options] [command] [package ...]
常用选项:
--nogpgcheck:禁止进行gpg check;
-y:自动回答为"yes"
-q:静默模式;
--disablerepo=repoidglob:临时禁用此处指定的repo;支持glob风格通配,表示某一类repo;
--enablerepo=repoidglob:临时启用此处指定的repo;支持glob风格通配,表示某一类repo;
--noplugins:临时禁用所有插件。
yum的子命令用法:
(1)显示仓库列表:
# yum repolist [all|enabled|disabled]
(2)显示程序包:
# yum list [all | glob_exp1] [glob_exp2] [...] # yum list {available|installed|updates} [glob_exp1] [...]
(3)安装程序包:
# yum install package1 [package2] [...]
(4)重新安装:
# yum reinstall package1 [package2] [...]
相当于:rpm -ivh --replacepkgs
(5)升级程序包:
# yum update [package1] [package2] [...]
(6)降级程序包:
# yum downgrade package1 [package2] [...]
相当于:rpm -Uvh --oldpackage
(7)检查可用升级:
# yum check-update
(8)卸载程序包:
# yum remove | erase package1 [package2] [...]
注意:依赖于此包的程序会一同被卸载。
(9)查看程序包information:
# yum info [...]
(10)查看指定的特性(可以是文件)是由哪个程序包所提供:
# yum provides | whatprovides feature1 [feature2] [...]
相当于rpm -qf FILE;
(11)清理本地缓存:
# yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
(12)构建缓存:
# yum makecache [fast]
(13)搜索:
# yum search string1 [string2] [...]
以指定的关键字搜索程序包名及summary信息;匹配方式为模糊匹配;
(14)查看指定包所依赖的capabilities:
# yum deplist package1 [package2] [...]
(15)查看yum事务历史:
# yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollbac k|new|sync|stats]
仅能查到有改动的历史,例如安装、升级、卸载等。
(16)安装及升级本地程序包:
# yum localinstall rpmfile1 [rpmfile2] [...] (maintained for legacy reasons only - use install) # yum localupdate rpmfile1 [rpmfile2] [...] (maintained for legacy reasons only - use update)
注意:本地程序包指非仓库的程序包,可以是从互联网上下载的程序包。当本地程序包的安装存在依赖关系并且该包依赖于仓库里的程序包时,使用此选项可借助yum安装这个本地程序包。但从CentOS 6/7后,直接install选项指定本地rpm程序包即可,即:# yum install local_rpmfile.
(17)包组管理的相关命令:
# yum groupinstall group1 [group2] [...] # yum groupupdate group1 [group2] [...] # yum grouplist [hidden] [groupwildcard] [...] # yum groupremove group1 [group2] [...] # yum groupinfo group1 [...]
5. yum的repo配置文件中可用的变量
前面提到,/etc/yum.repos.d目录下的配置文件能为yum指明仓库的路径及其相关信息,而使用不同平台类型的用户可通过镜像网站来安装仓库里的程序包。而在/etc/yum.repos目录下的配置文件中,通过引用变量来表示baseurl可以使yum自动指向适合其平台的仓库路径,这样即使不会配置yum的repo配置文件的用户也可使用默认的yum源,可方便镜像源管理员的管理。
在yum的repo配置文件中可用的变量有:
①$releasever:当前OS的发行版的主版本号; ②$arch:平台; ③$basearch:基础平台;例如i386,i486,i586,i686的基础平台为i386,即只要是32位的系统统统视 为i386基础平台;常见的基础平台有i386, x86_64, ppc等; ④$YUM0-$YUM9:供用户自定义的内部变量;
示例:baseurl=http://apt.sw.be/fedora/$releasever/en/$basearch/dag
6. 创建yum仓库--createrepo命令
如果管理上百台服务器主机,则当全部主机要求从互联网上某个文件服务器下载安装某个程序包时,会对带宽造成极大的消耗,为了节约带宽,可将远程文件服务器上的yum仓库镜像至本地,做成本地服务器,而全部主机只需通过内网访问本地服务器即可下载安装程序包,大大节约了带宽。
前面提到,一个yum仓库不仅包括众多的rpm包,还包括包相关的元数据文件。因此要创建仓库,除了要提供rpm包之外,还需要为所有rpm包制作元数据文件,而在Linux上只需通过执行createrepo命令就可以创建出元数据文件,createrepo是通过读取各个rpm包上的元数据信息并堆积形成元数据文件来实现的。
接下来简单介绍createrepo命令的使用:
createrepo命令:
createrepo - Create repomd (xml-rpm-metadata) repository
用于创建yum仓库的元数据目录文件(repodata)
常用选项:
--basedir:可通过此选项将repodata目录输出到当前rpm程序包的父目录去;
命令演示:
这里以/local_repo/Packages目录下事先复制过来的rpm包作为使用示例,如图:
开始创建元数据目录文件repodata:
再次ls查看:
可以发现,当前目录下多了一个repodata目录。
切换至repodata目录查看:
需要注意的是,rpm包的元数据文件是使用UUID来命名文件的,其中filelists类文件用来存放程序包文件名列表,而primary类文件则可用于存放程序包(组)的版本号、依赖性信息等。另外,repodata目录下的repomd.xml文件即为元数据的校验码文件。
7. 即将取代yum的dnf
虽然yum功能强大,并且支持许多插件扩展功能,但yum在设计体系上存在一些不足的地方,例如,yum在安装程序包时,如果突然中断,则下一次重新安装时yum无法识别该程序包是否已安装,而dnf主要就是为了解决yum这一缺陷的,预测将来dnf会取代yum这个工具。