Yum (Yellow dog Updater, Modified) 由Duke University团队,修改Yellow Dog Linux的Yellow Dog Updater开发而成,是一个基于RPM包管理的字符前端软件包管理器。能够从指定的服务器自动下载 RPM 包并且安装,可以处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。被Yellow Dog Linux本身,以及Fedora、Red Hat Enterprise Linux采用。——维基百科

   我们的“阿黄”上场了,这条dog非常忠诚可靠,而且确实帮助我们干了很多家务活还不制造垃圾。Yum是基于RPM的前段工具,所以它管理的依然是RPM包,不能忘了主人哦。

   Yum利用的是一种C/S结构,它有客户端和服务端两个部分,客户端可以理解为yum命令本身,而服务端上就是我们的软件包仓库以及“元数据”。这个“元数据”类似于我们的“花名册”,记录了仓库的信息、特征码以及仓库里都有哪些“货”。当阿黄第一次来取货时,它会缓存在自己的窝里一份元数据这个花名册,然后在花名册中找自己想要的骨头,找到以后缓存到家里一份,吃完以后就删掉了,下次再去取骨头时,阿黄会对比一下自己的花名册和服务器的是否一致,不一致的话就更新一下,然后取骨头走人。这就是Yum的基本工作流程,当然它可以自动给我们解决软件包的依赖问题。

   我们知道了阿黄的工作方式那么就来先建立一个仓库吧,要不它去×××骨头呢。如果你连阿黄都没有那么只能先用rpm装一个了,这里就不演示了。要找到仓库我们得先有一张地图,这就是yum的配置文件:

你玩游戏吗?软件包的管理(二)——YUM_linux

 我们来解释一下都是什么意思:

##[main]

##cachedir=/var/cache/yum/$basearch/$releasever

##keepcache=0 --> 是否保持包缓存

##debuglevel=2 --> 调试级别,显示安装时的详细信息级别

##logfile=/var/log/yum.log --> 日志

##exactarch=1 --> 与当前平台是否一致

##obsoletes=1 --> 是否检查包丢弃

##gpgcheck=1 --> 检查来源合法性和包完整性

##plugins=1 --> yum是否支持插件

##installonly_limit=5 --> 安装限制

##bugtracker_url=http://bugs.centos.org/set_project.php?project_id=19&ref=http://bugs.centos.org/bug_report_page.php?category=yum

##distroverpkg=centos-release --> 发行版版本

   这里有一句很重要/etc/yum.repos.d/这个目录下使我们每个仓库的精确地图

你玩游戏吗?软件包的管理(二)——YUM_yum_02

   看我们有这么多,它们都有一个共同点就是以.repo结尾,这就是仓库的标准命名。但到底该用哪个呢,不用担心我们用的是test.repo,因为其他的repo我都在内部给注销掉了,并且每个仓库都有一个cost类似于优先级,默认为1000.我们来看看这个精确地图里的内容吧:

你玩游戏吗?软件包的管理(二)——YUM_软件_03

    解释一下:

各仓库配置

[repositoryid]

# 对于当前系统的yum来讲,此repositoryid用于惟一标识此repository指向,因此,其必须惟一;

name= 

# 当前仓库描述信息;

baseurl=url://path/to/repository/

# 指明repository的访问路径;通常为一个文件服务器上输出的某repository;

url:

ftp服务

ftp://SERVER/PATH/TO/REPOSITORY

http服务

http://SERVER/PATH/TO/REPOSITORY

本地目录:

file:///PATH/TO/REPOSTIROY

enabled={1|0}

此仓库是否可被使用

gpgcheck={1|0}

是否对程序包做校验

gpgkey=url://path/to/keyfile

指明gpgkey文件路径;

cost=#

指明当前repository的访问开销,默认为1000;

 好了,其实这里我们逗了一下阿黄,因为我们给了它地图确没有建立仓库,阿黄是找不到的。现在就来把仓库建立起来吧。需要使用createrepo命令,如果没有装只能用RPM装一下了。

你玩游戏吗?软件包的管理(二)——YUM_linux_04

    这里我么挂载了CentOS的光盘,我们就把他当一个仓库吧,看看它为什么能成为一个仓库呢?

你玩游戏吗?软件包的管理(二)——YUM_管理器_05

    是不是发现有一个叫repodata的目录呢,看看里面是什么

你玩游戏吗?软件包的管理(二)——YUM_管理器_06

    OK,这就是我们的元数据,有了它就代表我们的仓库有被使用权了,如果你还记得我们的地图路径中所指向的应当是repodata目录的父目录,那一串乱七八糟的数字其实就是仓库的特征码了,标识着仓库是否发生过改变。

    

你玩游戏吗?软件包的管理(二)——YUM_软件_07

你玩游戏吗?软件包的管理(二)——YUM_管理器_08

    是不是有了一个叫repodata的目录啊,至于为什么在这个目录中建设,是因为我的主机上配置了httpd服务,当然我们也可以配置一个ftp服务。

    

你玩游戏吗?软件包的管理(二)——YUM_linux_09

    当然这个ftp我没有配置成repo仓库,而是共享了我写的一些脚本。好了,一切具备只欠东风了:


##yum:系统不能有两个yum进程同时启动

##command is one of:

##* install package1 [package2] [...] --> -y自动回答为yes

##* update [package1] [package2] [...] --> 升级

##* update-to [package1] [package2] [...]

##* check-update --> 检查可用升级,需要配置升级路径

##* upgrade [package1] [package2] [...]

##* upgrade-to [package1] [package2] [...]

##* distribution-synchronization [package1] [package2] [...]

##* remove | erase package1 [package2] [...] --> 卸载一个被依赖的包时会将依赖它的包都卸载

##* list [...] 

##yum list extras [glob_exp1] [...] --> 机器上装了,但是yum仓库中没有

##yum list obsoletes [glob_exp1] [...] --> 机器上装了,但是有更新的版本

##yum list recent --> yum仓库中新添加的包

##* info [...] --> 查询包的信息

##* provides | whatprovides feature1 [feature2] [...] --> 查询指定文件由哪个程序包安装完成

##* clean [ packages | metadata | expire-cache | rpmdb | plugins | all ] --> 清理包|元数据|过期缓存|rpm数据库|插件|所有

##* makecache --> 创建缓存

##* groupinstall group1 [group2] [...]

##* groupupdate group1 [group2] [...]

##* grouplist [hidden] [groupwildcard] [...] --> 组列表,可以一下安装|卸载一个组

##* groupremove group1 [group2] [...] --> 

##* groupinfo group1 [...] --> 显示包租详情,安装和使用时包组要用""引起来,CentOS7中使用install就可以了,如:yum install @"Server Platform Development"

##* search string1 [string2] [...] --> 在包名和sumary信息中搜索指定的关键字

##* shell [filename]

##* resolvedep dep1 [dep2] [...]

##* localinstall rpmfile1 [rpmfile2] [...] --> 安装本地的程序包文件而不是仓库中的,CentOS7之后使用install就可以了

##   (maintained for legacy reasons only - use install)

##* localupdate rpmfile1 [rpmfile2] [...] --> 升级本地的程序包文件而不是仓库中的

##   (maintained for legacy reasons only - use update)

##* reinstall package1 [package2] [...] --> 覆盖安装

##* downgrade package1 [package2] [...] --> 降级

##* deplist package1 [package2] [...]

##* repolist [all|enabled|disabled] --> 显示全部|可用|禁用仓库信息

##* version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]

##* history       [info|list|packages-list|packages-info|summary|addon-info|redo|undo|roll-back|new|sync|stats]

##* load-transaction [txfile]

##* check

##* help [command]

   好好好,不要慌不要忙,让我给你演示一下就会很明白了:

你玩游戏吗?软件包的管理(二)——YUM_软件_10

    这里clean all就是清空所以缓存,repolist是查看仓库列表,因为172网段是在教室的IP段所以连不上,不过我一经把本机的http服务器的IP给改过了,所以xen4是可用的。

你玩游戏吗?软件包的管理(二)——YUM_linux_11

你玩游戏吗?软件包的管理(二)——YUM_linux_12

    install就是安装了,-y是自动回答为yes,我们看到安装xen使用了DVD1和xen4这两个仓库。

你玩游戏吗?软件包的管理(二)——YUM_管理器_13

    info为查看包的相关信息

你玩游戏吗?软件包的管理(二)——YUM_管理器_14

    update为升级软件包,这里不需要升级

你玩游戏吗?软件包的管理(二)——YUM_linux_15

    我们有时会遇到要安装一个包组,可以使用grouplist查看以后再使用groupinstall安装就可以了,不再演示。

    

你玩游戏吗?软件包的管理(二)——YUM_linux_16

    remove卸载软件包

  好了,这大致就是yum的使用情况了,其他的选项大家使用man或者在实践当中继续学习吧。这里在补充一个小知识点:

    yum有内置变量,用于保存当前平台的相信息;客户端下载配置文件后可以自动选择适合自己arch的rpm包

    (1) $raleasever: 当前OS发行版的主版本号;

    例如,对CentOS 6.6 x86_64,主版本号为6;

    (2) $arch:平台

    i386, i486

    (3) $basearch: 基础平台, 例如i686, i586, i486以及i386的基础平台同为i386;

    (4) $YUM0-$YUM9 --> 自定义使用的变量


##如果6升级为6.1,我们可以ln 6 --> 6.1这样客户端不用改变就可以升级到6.1的安装包仓库   例如:

    baseurl=http://repo.magedu.com/centos/$releasever/$basearch

    当前系统为CentOS 6.6 x86_64

    http://repo.magedu.com/centos/6/x86_64

 希望本文能够给您带来帮助,如有错误敬请指正,拜谢!