回顾:

         Linux程序包管理的实现,rpm管理器

         rpm命令实现程序管理:

                   安装: -ivh,--nodeps, --replacepkgs

                   卸载:-e,--nodeps

                   升级:-Uvh,-Fvh, --nodeps,

                    降级:--oldpackage

                   查询:  -q, -qa, -qf, -qi, -qd, -qc, -q --scripts, -q--changlog, -q --provides, -q --requires

                   校验:-V

                   导入GPG秘钥: --import,-K, --nodigest, --nosignature

                   数据库重建:--initdb --rebuilddb

 

Linux程序包管理(2

 

         centOS:yum,   dnf

        

YUM工具:

         yum是一个c/s结构的工具。

yum工作的前提就是,要求在本地客户端可达的网络服务器上面(这个服务器是一个文件服务器),即这个服务器能够提供文件存储跟文件服务的功能,说白了就是在这个服务器的主机上,能够提供一个很大的存储空间,在这个空间空存储上我们能够用到的几乎所有的rpm包。这整个包目录,通过文件共享的方式,输出到外部主机,或其他主机能够进行访问,

         我们可以有任何一个linux主机,这个主机上面本身支持rpm包管理的基本功能,同时再次基础上有支持YUM工具的使用。

         YUM工具的工作方式:

         在安装rpm包时,不再使用rpm命令,而是使用yum命令,

         yum接收到我们的命令以后,他会根据本地指向的存放rpm工具包的服务器的网络地址。这个地址是URL

         在互联网上给我们提供的rpm安装包的服务器有很多,我们本地到底使用哪一个服务器我们必须指明。所以yum就需要有个配置文件,来指明我们要访问的是哪一个网路服务器,并且到服务器上去找我们的访问地址

         比如说教室的FTP服务器地址:ftp://10.1.0.1/pub//pub下有很多文件这个地址就相当于URL对于真正的URL是指向网络中的单独的一个文件来统一进行定位的。

         URLftp://10.1.0.1/pub/URL被称为统一资源定位符)

         YUM工具在接收到安装程序包命令后,就会根据配置文件中的地址,去找网络上的服务器,网路上的服务器为了避免YUM下载特定的rpm包时,由于不同的rpm包特多,不好查找,则服务器为YUM提供了一个rpm包的元数据信息表,所以在YUM工具在要下载RPM包之前,先请求服务器将rpm数据包元数据表发给客户机。这个文件可以理解为rpm的户口,这个数据表被先放在缓存中cache,然后YUM工具根据rpm数据表分析要下载的rpm的依赖关系。

         具体就是,去本地查询安装的包与本地哪些包有依赖关系,并统计那些包已经安装,那些包未安装,然后将未安装的包列出来,根我们要安装的包一起安装。

然后去服务器下载这些包,然后放在缓存中,然后再本地缓存中执行类似rpm安装的操作。安装完成后,YUM将缓存中的rpm包删除,以节约空间,但是要知道,rpm的元数据表是不删除的,因为下一次再安装rpm包时,我们直接分析本地的元数据即可,我们的元数据可以多次重复使用,

         但是这样也会存在问题,就是远程的服务器上面新增加了rpm包,元数据信息表发生了改变这时我们应该怎么办?

         其实为了避免这个问题,我们的YUM客户端在每次请求服务器时,都会去请求元数据的,那我们的缓存还有什么用么?

         其实元数据这个文件也不小,比如说一个仓库里边有上千个安装包的话,那这个文件的大小也有几兆了,再大也有可能有十几兆的样子,好在他是文本文件,所以可以进行压缩存放的。其实在仓库中元数据文件不止一个,有的存放包名的,有的存放依赖关系的,所以在这个仓库上这个元数据的文件不止一个,除此之外还有一个特殊文件,这个文件中记录了每个元数据文件的校验码,同理我们本地上缓存的元数据也有校验码,当客户端去请求服务器时,客户端是先去请求元数据文件的校验码,对比一下,一样就不进行更新,不一样在进行更新。这样就大大节约了时间,而且也不用下载,节省了网络带宽,提高了速度。

         但是也有时候出现例外,当我们用YUM工具分析包,查询包的时候,请求服务器时,出现连接不到的情况,(这里不是安装,是卸载或者查询的时候)我们就得不到本地的元数据文件是不是最新的,那么这时就需要我们定义策略,要我们到底敢不敢用这样的元数据文件,这都是YUM仓库完成的概念。

         YUM是独立的自我管理的组件,C/S架构,并不是YUM本身是CS架构的,而是依赖C/S架构。

 

总结:

         第一步:

         我们要想使用YUM工具来安装管理程序包的话,首先对于本地linux系统上要有YUM客户端有一些YUM命令,一些YUM工具这是前提,

         第二步:

         YUM要给基于配置文件,要根据配置文件去找YUM仓库,作为管理员,需要我们作为管理员自己定义,这个YUM是使用互联网上的,还是使用自己本地的,这都有可能。

         第三步:

         我们既然指向仓库,那么这个仓库要存在,如果网络带宽足够,我们可以使用网络上的镜像网站作为仓库,这样我们就有一些较新的文件,

 

我们也可以自己间服务,我们可以将互联网上的镜像。镜像到本地,

YUM并不是rpm的取代者,他只是RPM的前端管理工具,即YUM要依赖rpm才能存在如果仅仅是有YUM是不可以的。所以我们不要人为,有了YUM就无需使用rpm了,这是两回事。

         我们用YUM解决安装问题,我们任然可以用rpm来查询管理程序。

如果我们要配置本地的YUM仓库的话,我们还需要自行去配置一个服务器主机,这个服务器我们要配置成文件服务器,一般来说YUM所支持的服务器有两种,一种是FTP,一种是HTTP

         createrepo专门分析一个仓库有哪些RPM包,包与包之间有哪些依赖关系,他都能抽取出来形成文件,而且还能帮我们生成特征码文件。

         createrepo生成高级仓库是比较困难的,我们在将来安装程序时我们一下装一个组,而不是一个包,而要创建分组的话,一个组文件是xfl格式的,

 

 

 

YUM工具

yum repository :简称yun repo YUM仓库

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

并不是rpm包所在的路径就是仓库,而是repodata这个目录所在的目录才是仓库指向的路径

系统本身的安装光盘就是一个YUM仓库

         仓库首先是一个文件服务器:

                   这个服务器一般是通过

                   ftp://

                   http://

                   nfs://

                   file:///(如果访问不到互联网,我们就本地仓库,我们将光盘挂载上,然侯后将光                            盘做为本地仓库)

         yum本身也是一个程序包,首先我们应该保证这个程序已经安装上了。

                   [root@localhost~]# rpm -q yum

                   yum-3.2.29-73.el6.centos.noarch

                   [root@localhost~]#

         确定本地作为客户机应安装了yum程序后,我们在查询yum的配置文件。

                   [root@localhost~]# rpm -qc yum

                   /etc/logrotate.d/yum

                   /etc/yum.conf                    //yum的主配置文件

                   /etc/yum/version-groups.conf

                   [root@localhost~]#

        

YUM配置文件

         /etc/yum.conf

                   yum的主配置文件主要是用来指向我们用的那些yum仓库的。

         其实yum的配置文件并不只是/etc/yum.conf这一个,其实yum的配置文件由两部分组成,/etc/yum.conf这个文件其实使用了包含指令,他还包含一个/etc/yum.repos.d/*.repo文件。这是YUM遵循把大配置文件 分成多段小文件的管理风格。

         这样一分以后,yum的主配置文件,只提供仓库指向的公共配置

一个yum客户端可以指向一个仓库,实际上,一个yum可以指向n个仓库的。同类仓库存在多个,这叫镜像,我们用的时候用一个。

         cenots上,一个文件不是.repo结尾的话,就不能作为yum程序所使用

         两个配置文件:

         /etc/yum.conf                 //为所有仓库提供公共配置

         /etc/yum.repos.d/*.repo                  //为仓库的指向提供配置

 

 

查看YUM的主配置文件

[root@localhost ~]# less /etc/yum.conf

内容:

[main]       //这个主配置文件用中括号定义的,每一个中括号中,定义了一个配置段,配置段只对某些地方代码有效,而main配置段,就叫主配置段。

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

keepcache=0             //使用过的文件是否保存在缓存

debuglevel=2            //调试级别

logfile=/var/log/yum.log           //用到的安装日志文件。

exactarch=1              //安装程序包时,是否进行精确平台匹配

obsoletes=1

gpgcheck=1               //安装包时,是否检查包的完整性跟合法性

plugins=1                   //是否支持插件机制

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        //bug错误的追踪地址

distroverpkg=centos-release           //发行版从哪获取的。

 

# This is the default, if you make this bigger yum won't see if themetadata

# 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.

#  Itis esp. important, to have correct metadata, for distributions like

# Fedora which don't keep old packagesaround. If you don't like this checking

# interupting your command line usage, it'smuch 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 filesnamed file.repo//每一个仓库也有这么一个配置段,只是这个配置段中括号里面的是仓库的名称

# in /etc/yum.repos.d      //每一个仓库都在这个文件下。

(END)

 

如果我们不了解这个YUM的主配值文件,我们可以man手册yum的主配置文件,yum.conf

[root@localhost ~]# whatis yum.conf

yum.conf [yum]       (5) - Configuration file for yum(8)

[root@localhost ~]#

[root@localhost ~]# man yum.conf                   //如果我们看主配置文件选项不懂可以这样查看

 

在默认情况下,我们yum的配置文件很少进行修改。主要是仓库的定义。

 

man yum.conf 配置文件中,[repository] OPTIONS这个分段是指定仓库的配置选项

 

关键是仓库的指定:

         仓库的定义:

等号左右不要有空格,否则有语法错误。仓库定义最关键的就是仓库ID,和名称,再这仓库指向,其他的选项都是普通的选项。

         [repositoryID]           //      一定为其指定,确定的仓库ID,如果定义多个YUM源,则这个一定不能以样。

         name= Some name forthis repository             //仓库的名称,可以随便起,但最好是这个仓                                                                                       库的完整描述

         baseurl=url://path/to/repository/                     //仓库的地址路径等号两边不能留空格,否则                                                                                       会有语法错误。

         enabled={1|0}           //是否启用此仓库,默认为1,表示启用此仓库,就算不写enabled                                                      也表示启用,如果不启用则写enabled=0

         gpgcheck={1|0}                  //对于此仓库中的程序包再安装之间是否检查来源合法性

         gpgkey=URL                       //指明一个URL,这个URL是能访问秘钥文件的路径

         enablegroups  ={1|0}       //是否支持在此仓库使用组来批量管理程序包,默认是支持的。

         failovermethod={roundrobin| priority}            //故障转移方法,前面提到我们baseurl可以                                                                                                  指定多个路径,那这多个路径应该先用那个                                                                                             呢?如果一地个坏了,则用哪一个?平时好的                                                                                         时候用哪一个?则roundrobin是轮询,其实                                                                                                就是从里面随机挑一个,priority是根据优先                                                                                                 级去选择的,即第一个第二个.....,如果不指定                                                                                               的话,是随机的,而不是自上而下。

         repo_gpgcheck={1|0}                //检查仓库元数据文件的签名信息      GPG是非对称加密。

         mirrorlist          //真正以镜像方式指向URL,一般与baseurl不同时使用,而且要使用                                                        mirrorlist时,yum必须支持插件功能。

        

         cost=                           //开销,默认值为1000,可以通过更改这个开销数字的大小,来是的                                                 先使用哪个路径

 

注意:baseurl可以指明多个路径,其实指定多个路径后,我们使用时是从其中随机找一个路径

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

                     url://server2/path/to/repository/

                     url://server3/path/to/repository/           

 

配置YUM指向,然后使用YUM仓库

         第一步:切换到存放存放仓库的目录中

 

[root@localhost ~]# cd /etc/yum.repos.d/

[root@localhost yum.repos.d]# ls

CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-fasttrack.repo  CentOS-Media.repo  CentOS-Vault.repo

[root@localhost yum.repos.d]#

 

         分析第一个文件CentOS-Base.repo

[root@localhost yum.repos.d]# less CentOS-Base.repo

         它里面定义了好几个仓库,一个叫[base], [updates],[extras], [centosplus], [contrib]

从里面截取一段来分析:

[base]

name=CentOS-$releasever - Base

mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra             //默认使用的是mirrorlist,后面跟的是url,这里面用到了$releasever等等,带$就是               变量

#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/   同样我们也可以使用                                                                                                                                         它来指定

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

 

#released updates

 

上面没有写enabled,说明默认是启用的。

 

[root@localhost yum.repos.d]# ls

CentOS-Base.repo  CentOS-Debuginfo.repo CentOS-fasttrack.repo CentOS-Media.repo CentOS-Vault.repo这后面几个仓库默认都是未被启用的,enabled=0都是。

 

所以我们可以知道,当我们不启用仓库时,就写

enabled=0

 

第二步:不使用原来的Base仓库,将原来的仓库改名。

现在我们假如不想用Base.repo仓库了,我们可以将里面没有将enabled写成零的,改为零,但是这样还有一个问题,就是我们在将来定义自己的仓库时,还定义仓库名为base,则会报错的,因为不能是两个仓库的名相同。

         所以最简单的方法就是重命名:

[root@localhost yum.repos.d]# mv CentOS-Base.repo  CentOS-Base.repo.bak

 

第三步:我们自己定义仓库

         教室的YUM源地址是:http://10.1.0.1/cobbler

         在里面找到一个叫repodata的目录,这个repodata所在的路径就是我们的仓库路径。

         在阿里云网站上的镜像YUM仓库路径:

         http://mirrors.aliyun.com/centos/6.8/contrib/x86_64/

         http://mirrors.aliyun.com/epel/6/x86_64/

步骤:

         [root@localhostyum.repos.d]# vim centos-local.repo

需要写进去的内容:

         [base]

         name=BaseRepo on aliyum

         baseurl=http://mirrors.aliyun.com/centos/6.8/contrib/x86_64/

         gpgcheck=0

最后保存退出wq

这样YUM仓库就配置好了。

 

第四步:使用仓库:

执行yum的第一个命令:

         [root@localhostyum.repos.d]# yum repolist          //列出可用的yum仓库,第一次用YUM仓库,会先去仓库上下载元数据primary_db文件

                            程序包管理YUM_程序

 

或者,将马哥教室的YUM源加到上面的vim centos-local.repo文件中。

name=local repo 10.1.0.1

baseurl=http://10.1.0.1/cobbler/ks_mirror/6/

gpgcheck=0

 

 

yum的命令:

         语法:

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

         命令:

                   前面的星号表示“yum”关键字

  command is one of:

       * install package1 [package2] [...]

       * 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

       * info [...]

       * provides | whatprovides feature1 [feature2] [...]

        * clean [ packages | metadata | expire-cache | rpmdb |plugins | all ]

       * makecache

       * groupinstall group1 [group2] [...]

       * groupupdate group1 [group2] [...]

       * grouplist [hidden] [groupwildcard] [...]

       * groupremove group1 [group2] [...]

       * groupinfo group1 [...]

       * search string1 [string2] [...]

       * shell [filename]

       * resolvedep dep1 [dep2] [...]

       * 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]              //显示仓库列表,默认显示启用的,即执行的                                                                                       命令为 yum repolistenabled

       * version [ all | installed | available  |  group-* |         //查看rpmdb信息

      nogroups* | grouplist | groupinfo ]

        *  history[info|list|packages-list|packages-info|sum-

      mary|addon-info|redo|undo|rollback|new|sync|stats]

       * load-transaction [txfile]

       * check

       * help [command]             //获取某个命令自己的帮助信息的。

 

显示仓库列表:

         *repolist [all|enabled|disabled]

显示程序包:

         list

                   yumlist  [all | glob_exp1] [glob_exp2] [...]

                   yum{available| updates |installed} [glob_exp1] [...]

                                     glob_exp1:表示自己定义的通配符格式查找

                                     available:表示仓库中有但未安装

                                     updates:表示可用的升级包

                                     installed:表示已经安装的包

安装程序包:

         *install package1 [package2] [...]  //可以同时安装多个程序包

注意:

(如果一个程序有多个安装包,那我们可以指定安装包的版本即可:yum install gcc-4.5.7,实际上安装程序包的时候,默认安装最新版,所以只有我们再安装老版本的程序包时,我们才会指定版本号)

 

升级程序包:

         *update [package1] [package2] [...]

 

降级程序包:

         *downgrade package1 [package2] [...]

 

检查可用升级包:

         *check-update

 

卸载程序包:

         *remove | erase package1 [package2] [...]             //卸载程序包时,会将依赖这个程序包的                                                                                               那个程序包一并卸载

查看程序包信息,相当于rpm -qi命令:

         *info [...]              //后面跟程序包即可

 

查看指定的特性(可以是某文件)是由那个程序包所提供:相当于rpm -qf

         *provides | whatprovides feature1 [feature2] [...]        

        

清理本地缓存:

         *clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

                   packages:程序包

                   metadata:元数据

                   expire-cache:过期缓存

                   plugins:插件

 

构建缓存:

         *makecache             //其实这部没必要做

 

搜索:后面跟上关键字即可,用来以指定的关键字,搜索程序包名及summary信息

         *search string1 [string2] [...]

 

重新安装程序包:

         *reinstall package1 [package2] [...]

 

查看指定包所依赖的capabilities:

         *deplist package1 [package2] [...]          //依赖关系分析,显示包与包的依赖关系

 

查看yum事务历史:

         *history[info|list|packages-list|packages-info|sum-mary|addon-info|redo|undo|rollback|n      ew|sync|stats]

history,表示查看yum在每次安装升级卸载程序包时,就相当于启动了一个yum事物。)

                   yumhistory summary             //只查看摘要信息

 

安装及升级本地程序包:     //其实现在直接使用install+后跟程序包即可。但是在centos5                                                                要使用,或者安装yum之前的某个版本则也要使用

         *localinstall rpmfile1 [rpmfile2] [...]

          (maintained for legacy reasons only - use install)

    *localupdate rpmfile1 [rpmfile2] [...]

          (maintained for legacy reasons only - use update)

 

包组管理的相关命令:

                  * groupinstall group1 [group2] [...]

        * groupupdate group1 [group2] [...]

       * grouplist [hidden] [groupwildcard] [...]

       * groupremove group1 [group2] [...]

       * groupinfo group1 [...]

 

yum源配置指向只能升级,不能降级。 

 

配置本地yum源:

         每一个发行版的光盘,中都有repodata文件。所以我们可以直接将光盘当做本地yum源来使用。直接使用file:///来直接指向就行。

         第一步:

挂载光盘:(以只读方式挂载)

         mount -r /dev/cdrom /media/cdrom

         mount                //直接执行mount命令就可以查看光盘是否挂载成功

                                      成功挂载则显示:/dev/sr0 on /media type iso9660 (ro)

[root@localhost ~]# cd /media

[root@localhost media]# ls

CentOS_BuildTag  RELEASE-NOTES-en-US.html

EFI              repodata                            //发现可以查看到一个repodata文件。有他就可以作为                                                                    YUM

EULA             RPM-GPG-KEY-CentOS-6

GPL              RPM-GPG-KEY-CentOS-Debug-6

p_w_picpaths           RPM-GPG-KEY-CentOS-Security-6

isolinux         RPM-GPG-KEY-CentOS-Testing-6

Packages         TRANS.TBL

[root@localhost media]#        

 

第二步:切换到、/etc/yum.repos.d/目录下,并建立一个本地YUM源文件

         cd /etc/yum.repos.d

         vim local.repo

         local.repo文件中写入的内容:

         [base]

         name=CentOS 6 Release 6.8

         baseurl=file:///media/cdrom

         enabled=1

         gpgcheck=0

第三步:最后查看一下我们创建的YUM

         yum repolist

 

 

提醒:YUM的修改操作,是会启动事物的,而事物一般是有隔离概念的。也就是说,在一个终端中安装,再启动一个终端安装是不被允许的。第二个终端会一直处于阻塞的状态,知道最后我们不得不手动关闭这个进程。