我们在之前的章节中讲到了Linux的程序包管理的基础与实现,后面也讲述了RPM包的管理命令实现了管理包的功能,主要用的是rpm命令,那么rpm实现程序管理总结如下:

   rpm命令实现程序管理:
      安装:-ivh, --nodeps, --replacepkgs
      卸载:-e, --nodeps, --replacepkgs
      升级:-Uvh, -Fvh, --nodeps, --oldpackage
      查询:-q, -qa, -qf, -qi, -qd, -qc, -q, --scripts, -q --chagelog, -q --pvevides, -q --requires
      校验:-V
    
      导入GPG密钥:--import, -K, --nodigest, --nosignature
      数据库重建:--initdb, --rebuiliddb

  那么在接下来的章节中,我们继续来将Linux程序包管理。

一、Linux程序包管理

  在上一章中我们讲述过,使用rpm包管理程序会有一些问题,比如说安装包之间存在这依赖关系,一旦安装时,如果很复杂的话,安装时需要很长时间才能完成,因为我们必须要想办法手动解决依赖关系,当然,我们可以使用--nodeps来忽略安装包之间的依赖关系,其导致的结果就是,安装时没有问题,但使用时会就有些问题,所以说为了能够保证正常使用的前提下,就必须要解决依赖关系。而手动解决通常是一件很麻烦的事情,那么我们就要采用高于.deb或高于.rpm包的底层管理工具,它能实现前端自动解决依赖关系,完成正常的安装,解决用户的后顾之忧,在这种场景下完成对应的CentOS系统当中有两个前端安装工具,一种为yum,另一种是新版的dnf

  由于CentOS还没有官方支持的dnf工具,该工具在Fedora22+当中才刚开始引入,不过在CentOS 7中使用dnf也并非不可能,yum是一款C/S架构的程序包管理工具,在本地客户端可达的网络服务器,首先该服务器是一个文件服务器,要提供文件存储并提供文件服务等功能,提供了很大的存储空间去放置我们所能使用的各种rpm包,而后整个目录通过文件共享的服务功能输出到外部主机能够进行访问,而后任何一个Linux主机,本身支持rpm包的基本功能,同时在这个基础之上又能使用yum工具,而yum的工作原理是当用户安装某个程序包时,使用yum命令接收到由用户所安装到的包请求之后,该命令就会尝试根据本地的配置文件提供的服务器路径访问地址URL,那么yum接收到所谓的安装包程序之后,尝试着通过本地的配置文件指令的URL去找远程网络服务器主机。

1.1 yum工作原理

  为了避免将网络远程服务器所提供的所有安装包下载到本地,远程服务器和yum它们彼此之间互相工作的模式为:这个服务器要提供一个叫做程序包的仓库(repository),对于这个仓库要有元数据信息或者要有描述性的数据信息,这个信息文件存放这文件包的名字、版本以及包与包之间的依赖关系等,都存放在该文件中,所以当这个yum客户端试图通过远程网络服务器去获取某个安装包时,yum客户端首先请求将元数据信息文件发送过来,下载至本地之后放置在本地的一个缓存区域中,yum客户端就开始分析本地元数据当中有没有用户去请求的安装包名,如果有,读取这个包,尝试着分析该包的依赖关系,而分析依赖关系也根据这个元数据文件,因为这个元数据文件定义在网络上的服务仓库所有的安装包,以及程序包之间的依赖关系,所以yum客户端在本地通过该文件分析完成之后,而后又查询本地所被依赖的安装包,分析完成之后剩余未安装的包列举出来,最后扮演文件服务器去在该网络主机中下载程序包,下载完成之后先缓存在本地,之后开始执行类似于rpm的安装操作。而安装时首先会安装被依赖的安装包,安装完成之后则返回客户端提示安装成功,之后将缓存下来的安装包删除,以节约空间。但元数据文件不会删除,等到下次安装时,可直接读取该元数据文件。

  yum客户端每一次都会去请求网络主机上的元数据,以检测数据包等信息是否发生改变,当然频繁请求也会占用带宽,所以元数据可能不止一个,有的存放包名,有的存放版本等,除此之外,还有特殊文件,这个特殊文件记录了每一个元数据文件的校验码,所以在请求时,先请求的是校验码,缓存在本地进行对比,如果校验码一样,本地缓存有效,否则请求元数据。

  对于应用场景来讲,yum首先是客户端,也是一个自我独立的管理组件,这个组件需要请求远程网络服务主机上的仓库,从仓库中下载元数据文件,在本地能够完成yum的查询等操作,当进行安装时,yum需要请求网络服务器去下载该程序包文件进行安装,这并不是传统的C/S,而是访问机制为C/S架构。

  为了能够进行快速访问,全球有许多的镜像站,我们可以找一个能够快速访问并且受信任的镜像站访问就可以了。该配置文件能够指向一大推镜像服务器,我们称之为镜像列表,从镜像列表当中挑选出符合一个,我们就能够进行访问。

1.2 yum缺点

  yum在设计上是有很大缺陷的,其缺点为:比如虽然能够解决依赖关系,但在某个安装过程中如果半途中止时,下一次重启安装时将无法解决,因此dnf主要就是应该解决这个问题的。但使用dnf时和yum是没有什么区别。

1.3 yum与rpm

  因此对于我们来讲,首先对于本地Linux上要有yum客户端及工具还有yum命令,第二步yum本身需要通过配置文件去找到该网络主机或者本地主机的远程仓库,所以这个配置文件作为管理员需要指定,那么第三步就是如果互联网带宽足够大的话,可以使用互联网上某个机构提供的仓库,尤其是镜像站点中的仓库,毕竟有许多较为新版的安装包。或许可以将远程服务器的镜像到本地。

  但其实yum并不是rpm命令的取代者,它只是rpm的前端管理工具,意味着yum需要依赖rpm的存在,如果仅有yum是不可以的。

  如果在本地创建yum仓库的话,我们甚至还得需要配置一台服务器主机,一般来说yum支持的文件服务器共有两种,一种是ftp,另一种是http,无论是哪一种,都得需要通过URL来进行输出,把程序包复制在存储空间之后,还得需要创建一个元数据文件,这个元数据我们可以使用命令来创建完成,对于元数据文件并不是凭空而来,而是分析每一个程序包自带的rpm数据抽取出来给罗列堆积在文件中实现的。而创建元数据文件的命令为:createrepo

  不过该命令可能创建高级仓库比较难,因为高级仓库有可能要对程序包进行分组,在安装时我们可以对这个一个组的程序包进行安装,而且创建该组时使用.xml格式的。意味着我们必须精通xml的语法才可能编写,好在我们必须选择。

1.4 yum的由来

  其实yum是由yellow dog所研发的,那么yum的全称为Yellow Update Modifiter,yum要依赖于它的yum仓库,全称为yum repository,简称为yum repo,那么我们将yum的特性总结如下:

   CentOS: yum, dnf

   URL: http://mirrors.aliyun.com

   YUM: Yellow Dog, Yellow Update Modifter

   yum repository: yum repo
      存储了众多rpm包,以及包相关的元数据文件(放置于特定的目录下:repodata);

  需要注意一点的是:repodata所在的路径,就是仓库所指向的路径。

  一个仓库在访问时有多种路径,一般都是由文件服务器来提供的,我们在文件服务器上通过某种协议来对用户进行访问。

      文件服务器:
         ftp://
         http://
         nfs://
         file:///

1.5 yum客户端

  yum本身就是一个独立程序包来可以进行安装,也有自己的配置文件,共有两段组成,其配置文件路径在:

   yum客户端:
      配置文件:
         /etc/yum.conf:为所有仓库提供公共配置;
         /etc/yum.repos.d/*.repo:为仓库的指向提供配置;

  对于用户来说,我们在/etc/yum.repos.d/目录下去配置yum源仓库配置文件,名称必须得是.repo,那么我们接下来看一下yum是如何使用仓库的。
  yum仓库的配置格式为,每一个中括号都代表着仓库的ID,且具有唯一性,之后我们指明它的名字和URL等信息用来配置进行定义。需要注意的是,等号
=左右是不能有分隔符的,否则就会有语法错误。

    仓库指向的定义:
       [repositoryID]
       name=Some name for this repository
       baseurl=url://path/to/directory/
       enabled={1|0}
       gpgcheck={1|0}
       gpgkey=URL
       enablegroups={1|0}
       failovermethod={roundrobin|priority}
           默认为:roundroin,意为随机挑选;
       cost=
           默认为1000;

  具有了这些概念之后,我们就可以开始配置yum指向,而后开始使用仓库,以及使用yum命令了。

二、yum命令的用法

2.1 安装包管理的相关命令

  yum有许多的子命令,其命令用法格式为:

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

  yum刚才讲到过有许许多多的子命令,每一个子命令都用于实现不同的管理功能,在man手册中记录了许多的子功能,我们总结出来并查看。

       command is one of:
        * install package1 [package2] [...]
        * update [package1] [package2] [...]
        * update-to [package1] [package2] [...]
        * update-minimal [package1] [package2] [...]
        * check-update
        * upgrade [package1] [package2] [...]
        * upgrade [package1] [package2] [...]
        * upgrade-to [package1] [package2] [...]
        * distribution-synchronization [package1] [package2] [...]
        * remove | erase package1 [package2] [...]
        * autoremove [package1] [...]
        * list [...]
        * info [...]
        * provides | whatprovides feature1 [feature2] [...]
        * provides | whatprovides feature1 [feature2] [...]
        * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
        * makecache [fast]
        * groups [...]
        * search string1 [string2] [...]
        * shell [filename]
        * resolvedep dep1 [dep2] [...]
           (maintained for legacy reasons only - use repoquery or yum provides)
        * localinstall rpmfile1 [rpmfile2] [...]
           (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]
        * repoinfo [all|enabled|disabled]
        * repository-packages   [package2] [...]
        * version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]
        * history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
        * load-transaction [txfile]
        * updateinfo [summary | list | info | remove-pkgs-ts | exclude-updates | exclude-all | check-running-kernel]
        * fssnapshot [summary | list | have-space | create | delete]
        * fs [filters | refilter | refilter-cleanup | du]
        * check
        * help [command]

  以上可以看的出来子命令很多,我们例举一些常用的子命令来总结一下该命令的用法,其总结如下:
  那么第一个就是显示如何显示仓库列表,该子命令为repolist,可以显示所有、启用和禁用的,默认显示启用的。

   显示仓库列表:
     repolist [all|enabled|disabled]

  第二个简述的是如何显示程序包我们使用list子命令,不仅可以显示所有,还可以使用glob通配机制。

   显示程序包:
       list
         # yum list [all | glob_exp1] [glob_exp2] [...]
         # yum list {available|installed|updates} {glob_exp1} {...}

我们学会如何列出并显示程序包之后,可以安装程序包,当有多个版本时,可以指明版本安装,默认安装最新版,该子命令为install。

   安装程序包:
      install package1 [package2] [...]
    
      reinstall package1 [package2] [...]

  接下来说的是升级某个程序包,该子命令为update。

   升级程序包:
      update [package1] [package2] [...]
    
      downgrade package1 [package2] [...] (降级)

  那么还有一个叫做ckeck-update,该子命令为检查有哪些升级包可用。

   检查可用升级:
      ckeck-update

  如果在系统里面卸载一个程序包时,需要注意的是,卸载时,如果依赖于该程序包的程序也会被卸载,那么卸载使用remove子命令。

   卸载程序包:
      remove | erase package1 [package2] [...]

  我们如果想查看某一个程序包的简要信息,显示类型和rpm -qi命令基本相同,比如大小、日期、修改时间等,我们可以用info子命令。

   查看程序包的information:
      info [...]

  还有就是可以查看某个特性或查看某个命令是由那个安装包提供的,该子命令为provides,相当于rpm -qf

   查看指定的特性(可以是某文件)是由那个程序包所提供:
      provides | whatprovides feature1 [feature2] [...]

  clean子命令是清理缓存的子命令,如果不想删除元数据文件就要使用该子命令,还可以指定清理那种,或者清理所有。

   clean [ packages | metdata | expire-cache | rpmdb | plugins | all ]

  除了清理缓存,我们还可以构建缓存,该子命令为makecache,此操作可以不用做,因为在安装时就会自动构建缓存。

   构建缓存:
      makecache

  根据关键字可以搜索相关的信息,可以用search子命令,后面跟上关键字即可。

   搜索:
      search string1 string2 [...]
    
      以指定的关键字搜索程序包及summary信息;

  我们还可以查看指定所依赖的程序包提供的功能。

   查看指定包所依赖的capabilites:
      deplist package1 [package2] [...]

  如果想查看过去安装或卸载过那种程序包,或者叫做在过去产生了某个事务,那么事务指的就是改变或者操作了某个具体的程序,比如说,在某一时刻成功安装或卸载了某个程序包。

   查看yum事务历史:
      history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]

  接下来说的是localinstall和localupdate这两个子命令,如果在yum仓库中没有某个程序包时,我们从互联网上下载某个安装包的话,使用rpm -ivh来进行安装,但是所带来的问题是如果该程序包所依赖于其它的程序包时,或者说那些被依赖的安装包在仓库中,这时候localinstall子命令就表示使用yum localinstall来安装该rpm包时,将该程序包中的被依赖的程序包在仓库中提取并安装进行解决。到CentOS 6CentOS 7,我们可以直接使用install子命令来进行安装本地的rpm包,也建议这样操作。

   安装及升级本地程序包:
      localinstall rpmfile1 [rpmfile2] [...]
          (maintained for legacy reason only - use install)
      localupdate rpmfile1 [rpmfile2] [...]
          (maintained for legacy reason only - use update)

2.2 包组管理的相关命令

  包组管理的相关命令有如下:

   包组管理的相关命令:
      groupinstall group1 [group2] [...]
      geoupupdate group1 [group2] [...]
	    grouplist [hidden] [groupwildcard] [...]
	    groupremove group1 [group2] [...]
	    groupinfo group1 [...]

  我们如果想安装某个包组的,可使用子命令groupinstall跟上某个包组就可以,如果包组名有空格的话,我们使用双引号来引起该包组名称。

2.3 在CentOS 7中如何使用本地yum源

  每一个光盘介质就是程序包的集合,无论是在CentOS 5、6、7中,都有相应的repodata文件,所以可以直接将光盘当作本地yum源来使用,使用file加上路径就可以了,介质可以不用复制到本地某个目录当中,首先将光驱打开,将光盘放置在服务器中,然后进行挂载,挂载路径在/media/cdrom中,如果没有该目录则先创建。

# mkdir -r /media/cdrom
# mount -r /dev/sr0 /media/cdrom

  之后我们进入/etc/yum.reops.d/目录下,在该目录下有个CentOS-Media.repo文件,我们使用vim来进行编辑该文件,修改格式如下:

# cd /etc/yum.repos.d/
# vim CentOS-Media.repo 
[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///media/cdrom/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

  以上修改完成之后,保存并退出,之后我们使用yum repolist命令查看一下,显示出软件包的数量出来则即为成功。

# yum repolist
Loaded plugins: fastestmirror, langpacks
c7-media                                                                                                                     | 3.6 kB  00:00:00     
(1/2): c7-media/group_gz                                                                                                     | 156 kB  00:00:00     
(2/2): c7-media/primary_db                                                                                                   | 5.7 MB  00:00:00     
Loading mirror speeds from cached hostfile
repo id                                                            repo name                                                                  status
c7-media                                                           CentOS-7 - Media                                                           9,591
repolist: 9,591

  最后我们总结一下如何使用本地yum源。

   如何使用光盘并挂载yum仓库:
    (1) 挂载光盘至某目录,例如:/media/cdrom
        # mount -r /dev/sr0 /media/cdrom
    (2) 创建配置文件
        [CentOS 7]
        name=
        baseurl=
        gpgcheck=
        enabled=