上一篇我们介绍了软件包管理器后端工具rpm,现在我们来看一下软件包管理器前端工具yum。先来介绍下yum吧。

yumYellowdog Update Modifieryum是一种C/S的架构。是一种依赖于rpm的前端软件包管理工具。工作模式为C/S模式。其服务器工作过程完全依赖于yum仓库。

yum repositoryyum仓库,是一种用来存放所有我们需要用到的rpm包的场所,或者说是文件服务。该文件服务可以是ftpweb,或本地某个file。不管哪种配置机制,其工作机制都是相同的。

yum 有自己的客户端,其工作机制依赖于其配置文件。在配置文件中可以为 yum 指定服务器在什么地方,该服务器可以是 ftp web file 任一个都可以,说白了就是 yum 仓库,在配置文件中还必须指明 yum 仓库名称,简要描述信息,访问位置及当前的 yum 仓库是否要使用等属性。当我们使用 yum 安装软件包时, yum 客户端会试图通过网络去请求到对方主机上或到某个 yum 仓库中获得这个 yum 仓库中所有可以获得的文件列表。当我们使用 yum 去安装某个软件包的时候,这个软件包一定位于我们配置众多的可以使用的 yum 仓库中的某一个中。
上一篇已经提到过, rpm 对处理具有依赖关系的软件包很不方便,但 yum 却可以很方便的处理这种关系。当我们安装的软件包需要另外一个或几个软件包提供的功能或库文件时, yum 会去 yum 仓库自动为我们找到安装该软件包所需的所有的软件包,找到后下载到本地,然后跟该软件包一块安装。比方说:我们安装软件包 X ,但安装 X 需要先安装软件包 L M N Y Z ,使用 yum 安装时, yum 检索发现我们系统上已经安装了 Y Z ,其他三个还没有安装, yum 就会自动去 yum 仓库查找这三个文件,找到后下载到本地,然后跟软件包 X 一块安装。
每当我们需要安装某个 yum 包时,如果 yum 都从新从 yum 仓库下载至本地,这样看起来回很浪费带宽,也会使 yum 的效率极低,所以, yum 为我们提供了元数据文件,我们每次使用 yum 时所下载的文件都会缓存到该文件中,以后的每次操作都会先从这里查找。下面介绍 yum 仓库中的元数据文件。
yum 仓库中的元数据文件包括如下几个:

primary.xml.gz:当前仓库所有RPM包的列表、包含有各包之间的依赖关系、每个RPM包安装生成的文件列表,是最关键的文件;

filelists.xml.gz:当前仓库中所有RPM包的所有文件列表;

other.xml.gz:额外信息,RPM包的修改日志;

repomd.xml:记录的是上面三个文件的时间戳和校验和;

comps-rhel5-server-core.xmlRPM包分组信息。

上面我们提到, yum 可以为我们提供如此强大的功能,而 yum 所有的工作是机制依赖于 yum 仓库的,即 repo 文件,那我们如何为 yum 定义 repo 文件,怎样定义 repo 文件呢?其实,系统有个文件夹,里边存放有 yum 仓库文件,我们只需在 /etc/yum.repos.d/ 目录下创建 .repo 的文件,编辑并输入如下内容就可以使用了。文件内容格式如下:

[Repo_ID]

name=Description

baseurl=

   ftp://

   http://

   file:///

enabled=[1|0]

gpgcheck=[1|0]

gpgkey=

 
如:在该 /etc/yum.repos.d/ 目录下,创建一个文件名为 Server.repo 结尾的文件,编辑输入如下内容:
   
   
   
   
  1. [Base] 
  2. name=RHEL5 Server 
  3. baseurl=ftp://172.16.0.1/pub/Server 
  4. enabled=1 
  5. gpgcheck=0 

这样,我们的yum仓库Server就创建成功了。用ls查看下,可以看到该目录下多了一个文件,那就是Server.repo。当我们有多个yum仓库来源时,比方说我baseurl有好几个,ftp一个,http一个,还有本地某个文件file中,可以再同一个.repo文件中写入多个,但每个格式都必须相同。如:我想在上边一个基础上再添加一个,则可在该文件中输入如下内容,这两个是在同一个文件中哦!命令如下:

   
   
   
   
  1. [Base] 
  2. name=RHEL5 CDROM Server 
  3. baseurl=file:///media/yum/Server 
  4. enable=1 
  5. gpgcheck=0 
  6.  
  7. [Name] 
  8. name=RHEL5 CDROM VT 
  9. baseurl=file:///media/yum/VT 
  10. enable=1 
  11. gpgcheck=0 
 
yum 还为我们提供了 yum 命令,下面看一下 yum 的用法及各个选项吧。因为 yum 在安装软件包时会考虑所有依赖关系,因此,在执行 yum 命令时,会显示很多信息,所以我们只给出部分命令的截图。

yum [options] [command] [package ...]

    -y :自动回答为 yes
    --nogpgcheck :忽略 gpg 检查
yum 的各选项包括如下几个:
list : 列表
    all
    available : 可用的,仓库中有但尚未安装的

    installed: 已经安装的

    updates :可用的升级
rpm 包太多,截图很不方便,这里只给出命令,不在给出截图。命令如下:
   
   
   
   
  1. # yum list all 
假如我们想显示 yum 开头的 rpm 包,可使用如下命令:
   
   
   
   
  1. # yum list all yum* 

软件包管理器前端工具yum的使用_第1张图片

clean :清理缓存

    [ packages | headers | metadata | dbcache | all ]

如:我们清除下本机 yum 缓存,命令及代码如下所示:
   
   
   
   
  1. # yum clean all 
repolist :显示 repo 列表及其简要信息
    all
       enabled :默认
       disabled
采用其默认选项,我们现在去显示下 repo 列表及简要信息,命令及执行结果如下所示:
   
   
   
   
  1. # yum repolist 

软件包管理器前端工具yum的使用_第2张图片

 
 
install :安装
    使用格式为: # yum install PACKAGE_NAME
现在我们去安装 mysql-server.i386.rpm 包,我们知道当有依赖关系时,系统会自动为我们搜索所有这样的包,下载至本地,然后几个包一块安装。命令及执行结果如下,截图太大,只给出部分截图:
   
   
   
   
  1. # yum install mysql-server.i386 

软件包管理器前端工具yum的使用_第3张图片

update :升级
update_to :升级为指定版本
remove|erase :卸载,会卸载所有依赖该包的软件包,要慎用,所以这里我们不在演示效果。只给出命令 # yum remove php53-pdo
info :查询信息,当我们想查询某个 rpm 包时可以使用该命令。如:我们查询下有关 zsh 包的信息,命令及执行结果如下所示:
   
   
   
   
  1. # yum info zsh 

软件包管理器前端工具yum的使用_第4张图片

provides|whatprovides :查看指定文件或特性是有哪个包生成的,如我们来查看下 /etc/inittab 是由哪个包生成的。命令及执行结果如下所示:
   
   
   
   
  1. # yum provides /etc/inittab 

软件包管理器前端工具yum的使用_第5张图片

如何创建 yum 仓库:
createrepo,我们必须先安装该rpm包才能使用其提供的功能,这里不再演示。
 
 
 
 

练习:
写一个脚本,完成以下功能
说明:此脚本能于同一个repo文件中创建多个Yum源的指向;
1、接受一个文件名做为参数,此文件存放至/etc/yum.repos.d目录中,且文件名以.repo为后缀;要求,此文件不能事先存在,否则,报错;
2、在脚本中,提醒用户输入repo id;如果为quit,则退出脚本;否则,继续完成下面的步骤;
3repo name以及baseurl的路径,而后以repo文件的格式将其保存至指定的文件中;
4enabled默认为1,而gpgcheck默认设定为0
5、此脚本会循环执行多次,除非用户为repo id指定为quit
 
 
参考答案:
   
   
   
   
  1. #!/bin/bash 
  2. REPOFILE=/etc/yum.repos.d/$1 
  3. if [ -e $REPOFILE ];then 
  4.     echo "$1 exists." 
  5.        exit3 
  6. fi 
  7.   
  8. read -p "repo_id:" REPOID 
  9. until [ $REPOID == 'quit' ];do 
  10.     echo "[$REPOID]" >> $REPOFILE 
  11.        read -p "repo_name:" REPONAME 
  12.        echo "name=$REPONAME" >> REPOFILE 
  13.        read -p "baseurl:" BASEURL 
  14.        echo "baseurl=$BASEURL" >> REPOFILE 
  15.        echo -e "enabled=1\ngpgcheck=0" >> $REPOFILE 
  16.        read -p "repo_id:" REPOID 
  17. done