Linux学习之RPM包管理

在linux中有人多的软件使用,比如我们使用的ifconfig,fdisk,btrfs文件系统等。可能这些软件在你原有的linux系统中并不存在,那么我们如何去使用这些工具呢。我们知道windows在需要软件的时候需要安装,当然对于linux系统一样需要安装。在linux下常用的安装工具我们使用的是rpm程序包(当然我们这边是针对CentOS而言),那么什么是rpm,如何安装rpm包以及使用rpm包做一些操作等,在下面的内容中将提到。

 

一、什么是RPM

 

RPM全称为“RedHatPackage Manager”,看名字就知道这是RedHat公司搞出来的,后来因为RPM发展的很好,逐渐成为了一种通用的标准,就更名为“RPM is PackageManager"。
    RPM最大的特点就是将软件先编译,并打包成为RPM机制的安装包,包中包含了该软件安装时所必须依赖属性软件信息,如果这些被依赖的软件已经安装,则安装包可顺利安装完成,否则软件将会安装失败。
    RPM安装时会将该软件的信息写入到RPM数据库中,那么软件的查询、验证、升级、卸载等操作都可以从数据中直接调用执行。
 

二、认识RPM包

1、RPM包的命名格式
        name-version-release.OS.arch.rpm
        解释:
            name:软件名称。
            version:major.minor
                major:主版本号;
                minor:次版本号;
            release:rpm自身的发行号,与程序源码的发行号无关,仅用于标识对rpm包不同制作的修订;同时,release还包含此包适用的OS。
            arch:适用于的硬件平台;
                x86:i386,i486,i586,i686等;
                x86_64:支持64位CPU;
                noarch:依赖于虚拟机。
            例如:
yum-3.2.29-60.el6.centos.noarch.rpm

 2、分包机制
        对于一个功能比较多的软件来说,而用户可能并不会用户其所有的功能,那么OS Vendor(系统发行商)在制作RPM包时只会用将他们认为用户会经常用到的功能打包成为与源程序名一致的核心包,而将其它的功能再次的打包成为子包;比如:yum程序有20个功能,常用功能有8个,特殊功能A:3个,特殊功B:6个,二次开发相关功能:3个,那么其RPM的形式有可能是这样的:

核心包:

            yum-3.2.29-60.el6.centos.noarch.rpm

        子包:
           yum-a-3.2.29-60.el6.centos.noarch.rpm
           yum-b-3.2.29-60.el6.centos.noarch.rpm
          yum--devel-3.2.29-60.el6.centos.noarch.rpm
        如果需要用到子包中的功能的话,就需要把对应的子包进行安装。

注:很多子包的安装需要依赖一些其他的包,所有在安装的时候要按照提示来进行安装 

3、rpm包的获取路径

     获取程序包的途径:

       (1)系统发行版的光盘或官方版的服务器:

                     CentOS镜像:

                                  http://mirrors.aliyun.com

                                    http://mirrors.sohu.com

                                    http://mirrors.163.com

         (2)项目官方站点

         (3)第三方组织

                  Fedora-EPEL

                            htt://pkgs.org

                            http://rpmfind.net

                            http://pbone.net

           (4)自己制作

建议:检查其合法性

           来源合法性

           程序包的完整性

 

三、RPM的安装,查询,卸载等使用

Centos系统上rpm命令管理程序包:我们这边以CentOS7为例

  1、 rpm包的安装

     使用格式:rpm {-i|--install} [install-options] PACKAGE_FILE ...

                  其他选项:

                    -v:显示详细信息

                   -vv:显示更详细信息 

                  -h:以#显示程序包管理执行进度,每个#号表示2%进度

     rpm -ivh PACKAGE_FILE... :实现程序包安装可以显示信息及安装进度。如下:

[root@localhost Packages]# rpm -ivh zsh-html-5.0.2-7.el7.x86_64.rpm

警告:zsh-html-5.0.2-7.el7.x86_64.rpm:V3 RSA/SHA256 Signature,密钥 ID f4a80eb5: NOKEY

准备中...                          ################################# [100%]

正在升级/安装...

   1:zsh-html-5.0.2-7.el7             ################################# [100%]

                 [install-options]的选项有: 

                          --test  :测试安装

                          --nodeps:忽略依赖关系

                          --replacepkgs:重新安装

[root@localhost Packages]# rpm -ivh --replacepkgs zsh-5.0.2-7.el7.x86_64.rpm

警告:zsh-5.0.2-7.el7.x86_64.rpm:V3 RSA/SHA256 Signature,密钥 ID f4a80eb5: NOKEY

准备中...                          ################################# [100%]

正在升级/安装...

   1:zsh-5.0.2-7.el7                  ################################# [100%]

 

                         --nodigest:不检查程序包完整性

                          --nosignature:不检查来源合法性

[root@localhost Packages]# rpm -ivh --replacepkgs zsh-5.0.2-7.el7.x86_64.rpm --nodigest --nosignature

准备中...                          ################################# [100%]

正在升级/安装...

   1:zsh-5.0.2-7.el7                  ################################# [100%]

                          --noscripts:不执行程序包脚本片段

                                        %pre: 安装前脚本; --nopre

                                   %post: 安装后脚本; --nopost

                                   %preun: 卸载前脚本; --nopreun

                                   %postun: 卸载后脚本;  --nopost    

2、 rpm包的升级:

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

       安装有旧版程序包,则升级;如果不存在旧版程序包,则安装

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

安装有旧版程序包,则升级,如果不存在旧版本程序,则不执行升级作                 

          rpm -Uvh PACKAGE_FILE...

         rpm -Fvh PACKAGE_FILE...

                   --oldpackage:降级

                   --force:强行升级

对于安装的程序在install-options的众多选项中也可以使用

[root@localhost newrpm]# rpm -Uilv yum-langpacks-0.4.2-4.el7.noarch.rpm

警告:yum-langpacks-0.4.2-4.el7.noarch.rpm:V3 RSA/SHA256 Signature,密钥 ID f4a80eb5: NOKEY

软件包准备中...

yum-langpacks-0.4.2-4.el7.noarch

yum-langpacks-0.4.2-3.el7.noarch

[root@localhost newrpm]# rpm -Filv yum-langpacks-0.4.2-4.el7.noarch.rpm

警告:yum-langpacks-0.4.2-4.el7.noarch.rpm:V3 RSA/SHA256 Signature,密钥 ID f4a80eb5: NOKEY

注意:(1)不要对内核进行升级:Linux支持多内核版本并存,因此,对其直接安装新版本内核

           (2)如果原程序包的配置文件安装后曾被修改,长级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留;

3、 rpm包的查询:

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

                             对那些包查询        查询什么

[select-options]的选项:  -a :查询所有安装的  

[root@localhost Packages]# rpm -qa

                     -f:查询指定的文件由哪个文件包安装生成

[root@localhost ~]# rpm -qf /usr/bin/yum

yum-3.4.3-125.el7.centos.noarch

 

                     -p:针对尚未安装的程序包文件做查询操作

[root@localhost Packages]# rpm -qi php-common-5.4.16-23.el7_0.3.x86_64.rpm #查询RPM包信息

未安装软件包 php-common-5.4.16-23.el7_0.3.x86_64.rpm       #这里提示我们这个包没有安装

[root@localhost Packages]# rpm -qip php-common-5.4.16-23.el7_0.3.x86_64.rpm 

#这个命令就是我们对未安装的程序包信息

警告:php-common-5.4.16-23.el7_0.3.x86_64.rpm:V3 RSA/SHA256 Signature,密钥 ID f4a80eb5: NOKEY

Name        : php-common

Version     :5.4.16

Release     :23.el7_0.3

Architecture: x86_64

InstallDate:(not installed)

Group       :Development/Languages

Size        :3971359

License     : PHP and BSD and ASL 1.0

Signature   : RSA/SHA256,20141031星期五222439,Key ID 24c6a8a7f4a80eb5

Source RPM  : php-5.4.16-23.el7_0.3.src.rpm

BuildDate  :20141031星期五210727

BuildHost  : worker1.bsys.centos.org

Relocations:(not relocatable)

Packager    :CentOSBuildSystem<http://bugs.centos.org>

Vendor      :CentOS

URL         : http://www.php.net/

Summary     :Common files for PHP

Description:

The php-common package contains files used by boththe php

package and the php-cli package.

  

[query-options]的选项:

                  --changelog :查询rpm包的修改日志

root@localhost ~]# rpm -q --changelog bash  #后面的更新信息太多,所以这边就不插入了

                 -c:查询配置文件

[root@localhost ~]# rpm -qc yum

/etc/logrotate.d/yum

/etc/yum.conf

/etc/yum/version-groups.conf

               --conflicts:查询与什么包冲突

                  -d:查询程序的帮助文档 

[root@localhost ~]# rpm -qd yum

/usr/share/doc/yum-3.4.3/AUTHORS

/usr/share/doc/yum-3.4.3/COPYING

/usr/share/doc/yum-3.4.3/ChangeLog

/usr/share/doc/yum-3.4.3/INSTALL

/usr/share/doc/yum-3.4.3/PLUGINS

/usr/share/doc/yum-3.4.3/README

/usr/share/doc/yum-3.4.3/TODO

/usr/share/man/man5/yum.conf.5

/usr/share/man/man8/yum-shell.8

/usr/share/man/man8/yum.8

                  -i:安装包的信息

[root@localhost ~]# rpm -qi yum

Name        : yum

Version     :3.4.3

Release     :125.el7.centos

Architecture: noarch

InstallDate:20150819星期三230419

Group       :SystemEnvironment/Base

Size        :5746020

License     :GPLv2+

Signature   : RSA/SHA256,20150314星期六164136,Key ID 24c6a8a7f4a80eb5

Source RPM  : yum-3.4.3-125.el7.centos.src.rpm

BuildDate  :20150310星期二043921

BuildHost  : worker1.bsys.centos.org

Relocations:(not relocatable)

Packager    :CentOSBuildSystem<http://bugs.centos.org>

Vendor      :CentOS

URL         : http://yum.baseurl.org/

Summary     : RPM package installer/updater/manager

Description:

Yum is a utilitythat can check for and automatically download and

install updated RPM packages.Dependencies areobtained and downloaded

automatically, prompting the user for permission asnecessary.

              -l:查看指定的程序包安装后生成的所有文件

root@localhost ~]# rpm -ql yum     #查看yum安装完成后所生成的文件

/etc

/etc/bash_completion.d

/etc/bash_completion.d/yum

/etc/bash_completion.d/yummain.py

/etc/cron.daily

/etc/cron.daily/0yum-daily.cron

/etc/cron.hourly

/etc/cron.hourly/0yum-hourly.cron

/etc/dbus-1

/etc/dbus-1/system.d

/etc/logrotate.d

/etc/logrotate.d/yum    #后面生成的文件太多  我这边就不一一列举出来,只是其中的一部分

                 --scripts:显示程序包安装卸载时执行的脚本

[root@localhost ~]# rpm -q --scripts bash

postinstall scriptlet (using<lua>):

nl        ='\n'

sh        ='/bin/sh'..nl

bash      ='/bin/bash'..nl

f = io.open('/etc/shells','a+')

if f then

  local shells = nl..f:read('*all')..nl

  if not shells:find(nl..sh) then f:write(sh) end

  if not shells:find(nl..bash) then f:write(bash) end

  f:close()

end

postuninstall scriptlet (using<lua>):

--Run it only if we are uninstalling

if arg[2]=="0"

then

  t={}

  for line in io.lines("/etc/shells")

  do

    if line ~="/bin/bash" and line ~="/bin/sh"

    then

      table.insert(t,line)

    end

  end

  f = io.open("/etc/shells","w+")

  for n,line in pairs(t)

  do

    f:write(line.."\n")

  end

  f:close()

end

                 -R:查询指定的程序包所依赖的能力

[root@localhost ~]# rpm -qR zsh

/bin/sh

/bin/sh

/bin/sh

/bin/sh

/bin/zsh

/sbin/install-info

/sbin/install-info

config(zsh)=5.0.2-7.el7

coreutils

grep

grep

                 --provides:列出指定程序包所提供的CAPABILITY    

下面我们总结下RPM包查询中常用的组合选项:

            rpm -q package_name     :查询某包是否已安装

            rpm -qa:查询所有已经安装的包

            rpm -qi package_name:查询包的描述信息

            rpm -ql package_name:查询某包安装生成了哪些文件

            rpm -qc package_name:查询某包安装生成了哪些配置文件

            rpm -qd package_name:查询某包安装生成了哪些文档(帮助文件)

            rpm -q �Cscripts package_name:查询程序包的相关脚本

            rpm -qf /path/to/some_file:查询某文件是由哪个包安装生成的

4、rpm包卸载:

用法:rpm{-e|--erase} [--allmatches] [--nodeps] [--noscripts]

           [--notriggers] [--test]PACKAGE_NAME ...

                              -e:卸载  

               --noscripts:忽略依赖关系   

               --test: 测卸载,但不真正执行安装过程;

                                   --nodeps:忽略依赖关系;

                                   --replacepkgs: 重新卸载;

                                   --nosignature: 不检查来源合法性;

                                   --nodigest:不检查包完整性;        

[root@localhost ~]# rpm -e zsh    卸载zsh

[root@localhost ~]# rpm -q zsh    #再次查看zsh,提示未安装

未安装软件包 zsh

卸载是的大多选项都同安装一样,所以这边就不做演示了。

5 rpm包校验:

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

校验:检查包安装生成的文件属性是否发生变化

[root@localhost Packages]# rpm -V zsh #查看zsh生成的文件是否发生变化

S.5....T.    /usr/share/zsh/5.0.2/functions/zmv   #这提示发生了改变

的内容没有被修改的情况下rpm -V zsh命令不会有任何输出结果,但上例中出现了一行奇怪的符号,说明zsh的属性已经发生了变化,下面来我看一下前面的文字所代表的含义:

               S file Sizediffers:文件的容量大小是否被改变;

              M Mode differs(includes permissions and file type)文件的类型或文件的属性是否被改变;

              5 digest(formerly MD5 sum) differsMD5指纹的内容已发生了变化

              D Devicemajor/minor number mismatch设备的主/次代码已经改变;

              L readLink(2)path mismatchLink路径已被改变

              U Userownership differs文件的所有者已被改变;

              G Groupownership differs文件的属组已被改变;

              T mTime differs文件的创建时间被改变。

              P caPabilities differ  :                

包来源合法性及完整性验证

前提:在当前系统上导入包的制作者的公钥

          导入所需要公钥:

rpm --import  /PATH/FROM/GPG-PUBKEY-FILE

[root@localhost media]# rpm --import RPM-GPG-KEY-CentOS-#导入公钥

[root@localhost media]# cd Packages/

[root@localhost Packages]# rpm -ivh --replacepkgs zsh-5.0.2-7.el7.x86_64.rpm  #不在提示警告信息

准备中...                          ################################# [100%]

正在升级/安装...

   1:zsh-5.0.2-7.el7                  ################################# [100%]

CentOS 7发行版光盘提供的密钥文件:RPM-GPG-KEY-CentOS-7

 

6、rpm数据库管理

rpm数据库存放的位置:/var/lib/rpm

如果数据库损毁,我们呢需要对数据库重建:

       rpm {--initadb|--rebuilddb}

                          initdb: 初始化

                            如果事先不存在数据库,则新建之;否则,不执行任何操作;

                         rebuilddb:重建

                            无论当前存在与否,直接重新创建数据库;

 

四、小结

 

        虽然在安装软件时还有其他更好的工具,比如yum(日后再介绍),但是yum也是基于RPM而衍生出来的,而且在查询软件包很有用,日后也会经常使用这个命令,所以必须要对RPM命令非常熟悉,建议多加练习。以上的的所有内容,都是本人学习的总结,可能有些地方介绍的不足,也许还有很多的命令没有介绍到,希望不足的地方请指出。谢谢!

 


你可能感兴趣的:(linux,数据库,windows,最大的)