一、rpm包管理器

    1、介绍rpm

       在linux系统中,服务是要通过程序来提供的,通过调用API接口编写好之后的源码包文件对于普通用户来说,安装起来较为繁琐。于是人们将源码在编译安装的环境下制作了更加高级的rpm包,它的最大特点是避免了对原软件包的编译安装,以更加简便的安装方式提供给用户。可以使用rpm(RedhatPackage Manager)管理器来进行安装.

       rpm包格式

      wKiom1e4cKvT6CJrAABfNWYck44825.jpg




    2、rpm包管理器

      <1>安装

           rpm {-i|--install} [install-options] PACKAGE_FILE ...

           rpm -i FILE..

             -i:表示安装        
             -v:输出详细过程
             -h:以进度条的方式显示安装过程

           常用选项

             --test:测试安装,不进行实际安装
             --nodeps:忽略依赖关系安装
             --replacepkgs:重新安装
             --force:强制安装

      <2>升级            

           rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...

           rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

           rpm -U FILE..

             -U:安装或者升级
             -F:仅升级
             -v:输出详细过程
             -h:以进度条的方式显示安装过程

           常用选项

             --oldpackage:降级成旧版本
             --force:强制升级到新版本

      <3>卸载           

           rpm {-e|--erase} [--allmatches] [--nodeps] [--test] PACKAGE_NAME ...

                     rpm -e FILE..

                     常用选项

             -allmatches:卸载所有匹配指定程序包名称的程序包的各版本
             --nodeps:忽略依赖关系卸载程序包
             --test:测试卸载程序包

      <4>查询

           rpm {-q|--query} [select-options] [query-options] [FILE..]                

              -q file.rpm:查询指定的rpm包是否安装

           [select-options]

             -p:查询未安装的包的信息
             -a,--all:查询已安装的所有程序包
             -f FILE:查询指定的文件由哪个程序包安装生成
                [root@centos7~]#rpm -qf `which --skip-alias ls`    # rpm -qf可以找到
                coreutils-8.22-15.el7.x86_64
                [root@centos7~]#rpm -q ls    # rpm -q找不到
                package ls is not installed
             --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
             --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖

           [query-options]

             -c: 查询程序的配置文件
             -d: 查询程序的文档
             -i: 查询程序的详细信息
             -l: 查看指定的程序包安装后生成的所有文件;
             --scripts:程序包自带的脚本片断
             -R: 查询指定的程序包所依赖的CAPABILITY;
             --provides: 列出指定程序包所提供的CAPABILITY;




*这里注释一下rpm的特殊用法

示例:如果删除了一个rpm包的程序文件,而又不想重新安装时还原原有的配置文件,可以选择只安装rpm包中的程序文件。

步骤1、查看rpm安装包的文件列表

[root@centos6 Packages]# rpm2cpio tree-1.5.3-3.el6.x86_64.rpm | cpio -t
./usr/bin/tree
./usr/share/doc/tree-1.5.3
./usr/share/doc/tree-1.5.3/LICENSE
./usr/share/doc/tree-1.5.3/README
./usr/share/man/man1/tree.1.gz
132 blocks

 步骤2、解压包内文件

[root@centos6 ~]# rpm2cpio tree-1.5.3-3.el6.x86_64.rpm | cpio -id
132 blocks

步骤3、移动程序文件

[root@centos6 ~]# cp usr/bin/tree /usr/bin

        <5>包校验

           rpm {-V|--verify} [select-options] FILE..

                      注:[select-options]与上不同,不予列出

                      下面介绍俩个常用的检查机制

           合法性校验:rpm --import Public_key

[root@localhost ~]#rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@localhost ~]#rpm -ivh zsh-5.0.2-14.el7.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:zsh-5.0.2-14.el7                 ################################# [100%]

                 安装过程不提示警告

                 补充:导入密钥之后,如果再删除之,再安装就会提示警告信息

[root@localhost ~]#rpm -qa gpg*
gpg-pubkey-f4a80eb5-53a7ff4b
gpgme-1.3.2-5.el7.x86_64
[root@localhost ~]#rpm -e gpg-pubkey-f4a80eb5-53a7ff4b
[root@localhost ~]#rpm -ivh zsh-5.0.2-14.el7.x86_64.rpm 
warning: zsh-5.0.2-14.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:zsh-5.0.2-14.el7                 ################################# [100%]

           完整性校验rpm -K file.rpm

[root@localhost ~]#echo ' ' > zsh-5.0.2-14.el7.x86_64.rpm 
[root@localhost ~]#rpm -K zsh-5.0.2-14.el7.x86_64.rpm 
error: zsh-5.0.2-14.el7.x86_64.rpm: not an rpm package

                 检查出现错误          

        <6>数据库维护

           系统上的rpm包依靠一个数据库(var/lib/rpm/)来维护,一旦rpm数据库删除,系统上关于包的任何操作都将无法进行,因为程序包的操作都是由数据库来维护的。

           rpm --initdb: 创建数据库

           rpm --rebuilddb:创建数据库索引

[root@localhost /var/lib/rpm]#rm -rf *
[root@localhost /var/lib/rpm]#rpm -q bash
package bash is not installed
[root@localhost /var/lib/rpm]#rpm --initdb
[root@localhost /var/lib/rpm]#ls
Basenames     __db.001  __db.003  Group       Name          Packages     Requirename  Sigmd5
Conflictname  __db.002  Dirnames  Installtid  Obsoletename  Providename  Sha1header   Triggername
[root@localhost /var/lib/rpm]#rpm -q bash
package bash is not installed

 上面例子证明:即使使用rpm --initdb恢复数据库,也是无济于事,因为其中并没有rpm包的数据息。友情提示:危险操作,切勿模仿 

    3、yum机制及其使用




二、yum包管理器

    1、介绍yum

      前面提到rpm的安装,但是因为库调用的原因,各个软件包之间会存在依赖条件,为了解决这个问题,出现了yum(Yellow dog Updter, Modified),作为rpm的前端程序,可自动处理依赖性关系(即当一个包依赖到另一个包时,自动安装对应的包)



  

    2、yum工作原理          

      yum的工作模式分为俩部分:yum服务器端,client的yum工具。

       yum服务器端存放着全部rpm包,以及特定的数据库文件来索引rpm包和记录rpm包之间的依赖关系。

       client端每次调用yum命令的时候,通过解析/etc/yum.repos.d配置文件中的URL找到yum服务器。并且yum会定期去更新yum服务器上的rpm包的元数据和依赖关系信息到本地(/var/cache/yum/),每次使用yum操作rpm包时,根据数据库里信息确定安装包的名字,版本号,所需要的依赖包等,然后再去yum服务器实现操作。

       工作原理示例图

  wKioL1e4fdjjl8ceAAB0D-vqvb8816.jpg



    3、配置yum源

     yum源配置格式      

            [repositoryID]

            name=Some name for this repository

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

            enabled={1|0}

            gpgcheck={1|0}

            gpgkey=URL 

       URL书写格式     

            ftp://

            http://

            file:///  

       可用的变量

                             $releasever: 当前OS的发行版的主版本号

                                  $basearch:基础平台;i386

                                   $YUM0-$YUM9:自定义变量

              示例:

          [epel]

                            #baseurl=ftp://10.1.1.100/epel/7Server/x86_64/

                            baseurl=ftp://10.1.1.100/epel/$releaserver/$basearch/

                            gpgcheck=0

                            enabled=1

        

         

       <1>本地光盘

         ###新建cdrom目录
         [root@localhost ~]#mkdir /media/cdrom
         ####挂载光盘文件到目录下
         [root@localhost ~]#mount /dev/cdrom /media/cdrom/
         mount: /dev/sr0 is write-protected, mounting read-only
         ####包文件就在Packages中,repodata父目录即为yum源目录
         [root@localhost ~]#cd /media/cdrom/
         [root@localhost /media/cdrom]#ls
         CentOS_BuildTag  EULA  p_w_picpaths   LiveOS   repodata  RPM-GPG-KEY-CentOS-Testing-7
         EFI   GPL   isolinux  Packages  RPM-GPG-KEY-CentOS-7  TRANS.TBL
         ####新建yum配置文件
         [root@localhost /media/cdrom]#cd /etc/yum.repos.d/
         [root@localhost /etc/yum.repos.d]#ls
         CentOS-Base.repo.bak  CentOS-Debuginfo.repo  CentOS-Media.repo CentOS-Vault.repo
         CentOS-Base.repo  CentOS-CR.repo    CentOS-fasttrack.repo  CentOS-Sources.repo
         [root@localhost /etc/yum.repos.d]#vim base.repo  ###注意:要先移除原来的repo文件
         [base]
         name=Local yum repository
         baseurl=file:///media/cdrom
         gpgcheck=1              ####此处如果gpgcheck=0的话,可以不写gpgkey 
         enabled=1 
         gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

       <2>远端Server

          如果虚拟机支持联网的话,可以直接使用网络上的yum源

         ####直接在/etc/yum.repo下建立配置文件即可
         [root@localhost /etc/yum.repos.d]#vim base2.repo
         ####此处给出示例 
         [base2]
         name=Server yum repository
         baseurl=http://10.1.0.1/cobbler/ks_mirror/7/
         gpgcheck=1
         enabled=1
         gpgkey=http://10.1.0.1/cobbler/ks_mirror/7/RPM-GPG-KEY-CentOS-7

      <3>自制yum源

         **复制rpm包到目录

         **在目录下生成repodata文件

         **为目录配置repo文件

         **配置成功

      <3>还有一种超级简单的方式,直接使用yum-config-manager工具

          用法:yum-config-manager [options] [section]

          [options]

             --add-repo 

[root@centos7~]#yum-config-manager --add-repo=new_yum    # 创建new_yum的repositoryID
Loaded plugins: fastestmirror, fs-snapshot, langpacks
adding repo from: new_yum
[new_yum]
name=added from: new_yum    # 这三行是自动生成的
baseurl=new_yum
enabled=1
[root@centos7~]#cd /etc/yum.repos.d/
[root@centos7/etc/yum.repos.d]#ls
base.repo  dir  make.repo  new_yum.repo    # 新添加的repo文件

  



  4、yum命令

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

       [options]

       -y:自动回答为yes

       -q:静默模式

       [command]

       <1>显示仓库列表

          yum repolist [all]

       <2>显示程序包

          yum list {available|installed|updates} 

  •    <3>安装升级

  •       yum install package...

  •       yum apdate package...

  •       yum downgrade package..

  •    <4>查看包的详细信息

  •       yum info package...

  •    <5>删除程序包

  •       yum remove package...

  •    <6>构建缓存

  •       yum makecache

  •    <7>清理缓存

  •        yum clean [ metadata | all ]

  •    <8>搜索

  •       yum search Key_word

  •    <9>查看yum事务历史

  •       yum history

  •       yum history undo # :可以撤销某个事物历史的所有安装包,类同卸载  (不适用包组)

  •    <10>包组的查看

  •        yum gruplist 

  •    <11>包组的安装

  •        yum groupinstall group... 

  •    <12>包组的升级

  •        yum groupupdate group..

  •    <13>包组的卸载

  •        yum groupremove group...



推荐几个rpm包的获取方法:

1、自带光盘镜像

2、项目官方站点

3、第三方组织

    EPEL

    http://pkgs.org

    http://rpmfind.net

    http://rpm.pbone.net

    https://sourceforge.net/

    http://pkgs.fedoraproject.org

4、自己制作