天天看点

Linux 软件包管理之RPM

      在 GNU/Linux( 以下简称 Linux) 操作系统中,RPM 和 DPKG 是最为常见的两类软件包管理工具,他们分别应用于基于 RPM 软件包的 Linux 发行版本和 DEB 软件包的 Linux 发行版本中。

      Linux软件包管理器主要用于管理Linux系统中的软件包,其主要用于实现安装、卸载、升级等功能,并提供对系统中所有软件包状态信息的查询。  

       RPM 最开始官方解释为:“Redhat Package Manager”,由 Red Hat 公司制定实施,由于被 GNU 开源操作系统接受并成为很多Linux 系统(RHEL) 的既定软件标准,其很多分支都使用其来作为软件安装的管理方式,包括 Fedora, CentOS, SUSE 等等,之后RPM被官方解释为:“Rpm is Package Manager”,其前端工具为yum。

      与RPM并驾齐驱的是基于Debian 操作系统 (UBUNTU) 的 DEB 软件包管理工具-DPKG,全称为 Debian Package,功能方面与 RPM 相似。最早是由 Debian Linux 社群所开发出来的, 只要是Debian系列衍生的 分支系统,大多使用 dpkg 这个机制来管理软件的, 包括B2D, Ubuntu 等等,其前端工具为apt-get。

       本文主要以RHEL的RPM软件包管理程序为主要内容,关于DPKG的使用方法,还请自行Google!

       Linux的软件包,主要有两种,一种是文件名形如Name-VERSION.tar.gz以源码的形式发布,一种是已经编译好的文件名类似于Name-VERSION-release.arch.rpm的二进制程序包。

      下面主要介绍下rpm软件管理工具的常用参数和使用方法。

rpm命令:rpm  [OPTIONS]  [PACKAGE_FILE]
       安装:-i, --install
       升级:-U, --update, 
       更新到新版本:-F, --freshen  [仅当系统中确实存在老版本时,才会升级软件包,否则什么也不做]
       卸载:-e, --erase  [注意:参数-e 后跟的是软件包名未必就是软件包的全称。]
       查询:-q, --query
       校验:-V, --verify  [校验软件包,是指将已安装的文件信息与保存在 rpm 数据库中的元数据(来自于rpm包)进行比较。校验将会比较每个文件的大小、摘要信息(哈希值)、权限、类型、属主与属组。任何不一致的地方都将被显示出来。]
       
常用其他参数:
        --builddb:数据库维护;
        --initdb:RPM数据库的建立;
        --nodeps:忽略依赖关系,不建议这样安装!
        --replacepkgs:强制重新安装;
        --test:测试安装,检查并报告依赖关系及冲突消息等;
        --nosignature:不检查包签名信息,不检查来源合法性;      

(1)RPM软件包的安装

      以安装mysql57-community-release-el6-7.noarch.rpm为例:

[root@xlogin ~]# rpm -ivh mysql57-community-release-el6-7.noarch.rpm      

      其中参数-i是表示安装,参数-v表示安装时要显示安装信息,-h表示安装时显示安装的进度,通常这三个参数是一起组合起来使用的。

 在安装RPM包时可能会遇到以下问题:

      ①重复安装问题:当要安装的软件包的某些文件已经在安装其他软件包时安装过了时,可以通过 --replacefiles参数来替换属于其他软件包的文件;

      如果安装RPM软件包发生冲突时,可以通过 --replacepkgs参数强制重新安装。

Linux 软件包管理之RPM

     ②软件冲突问题:因软件之间不兼容而产生冲突导致无法安装.可以通过 ----replacefiles参数或 --force参数强制安装,但不保证安装成功。

     ③软件关联问题:有时一个软件包的安装会依赖其他软件包,只有在所依赖的软件包安装完成后该软件包才能继续安装,如果不这样的话我们可以通过 --nodeps参数强制安装,但同样不能保证安装成功。而且建议不到万不得已,最好不要这么做。

Linux 软件包管理之RPM

(2)RPM软件包的升级

rpm -Uvh /PATH/TO/NEW_PACKAGE_FILE:如果装有老版本的,则升级;否则,安装;
rpm -Fvh /PATH/TO/NEW_PACKAGE_FILE:如果装有老版本的,则升级;否则,退出;
rpm -Uvh --oldpackage 强制恢复低版本的包:降级      

    例如,要把当前系统中的postfix-2.6.6-6.el6_5.x86_64升级为postfix-2.10.1-6.0.1.el7.centos.x86_64.rpm,则可执行如下命令:

[root@xlogin ~]# rpm -qa |grep postfix
postfix-2.6.6-6.el6_5.x86_64
[root@xlogin ~]# rpm -Uvh postfix-2.10.1-6.0.1.el7.centos.x86_64.rpm
[root@xlogin ~]# rpm -Fvh postfix-2.10.1-6.0.1.el7.centos.x86_64.rpm      

    进行软件升级后,旧版本文件会以“旧版本文件名.rpmsave”名称保存。

      如果以后需要恢复原来的旧版本文件,可以通过 --oldpackage参数来强制恢复。

(3)RPM软件包的查询

      ①查询当前系统中安装的全部RPM软件包: # rpm -qa |more  (为便于浏览具体内容,建议结合管道操作符)

      ②查询某个RPM软件包是否安装: 

[root@xlogin ~]# rpm -q httpd   #查询Apache软件是否安装,注意-q 后跟的是软件包名未必就是软件包的全称
httpd-2.2.15-45.el6.centos.x86_64
[root@xlogin ~]#  rpm -qa |grep httpd  #在已安装的软件包中查询包含httpd关键字的软件包
httpd-tools-2.2.15-45.el6.centos.x86_64
httpd-2.2.15-45.el6.centos.x86_64      

       ③查询软件包的说明信息: 

       -i, --info:查询程序包软件相关的信息,版本号、大小、所属的包组,等信息;

        以查看mysql57-community-release软件包的描述信息为例:

[root@xlogin ~]# rpm -qi mysql57-community-release
Name        : mysql57-community-release    Relocations: (not relocatable)
Version     : el6                               Vendor: MySQL
Release     : 7                             Build Date: Fri 16 Oct 2015 08:26:18 PM CST
Install Date: Wed 23 Dec 2015 08:20:01 PM CST      Build Host: tyr77
Group       : System Environment/Base       Source RPM: mysql57-community-release-el6-7.src.rpm
Size        : 8038                             License: GPLv2
Signature   : DSA/SHA1, Fri 16 Oct 2015 09:25:29 PM CST, Key ID 8c718d3b5072e1f5
Packager    : MySQL Release Engineering <[email protected]>
URL         : http://dev.mysql.com
Summary     : MySQL repository configuration for yum
Description :
Package for installation of setup/configuration files required for
installation of MySQL packages by yum.      

      ④查询软件包内所有包含的文件名称列表: 

         -l, --list:程序安装生成的所有文件列表;

         以查询htop软件包含有哪些文件,以及这些文件都安装在什么位置为例:

[root@xlogin ~]# rpm -ivh htop-1.0.1-2.el6.x86_64.rpm 
warning: htop-1.0.1-2.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Preparing...                ########################################### [100%]
   1:htop                   ########################################### [100%]
[root@xlogin ~]# rpm -ql htop
/usr/bin/htop
/usr/share/applications/fedora-htop.desktop
/usr/share/doc/htop-1.0.1
/usr/share/doc/htop-1.0.1/AUTHORS
/usr/share/doc/htop-1.0.1/COPYING
/usr/share/doc/htop-1.0.1/ChangeLog
/usr/share/doc/htop-1.0.1/README
/usr/share/man/man1/htop.1.gz
/usr/share/pixmaps/htop.png      

      ⑤查询某个文件属于哪个RPM包: 

        以查询/etc/fstab目录是属于哪个RPM软件包安装的为例:

[root@xlogin ~]# rpm -qf /etc/fstab 
setup-2.8.14-20.el6_4.1.noarch      

      ⑥其他的查询情况

         --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供;

         --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;

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

         -R, --requires:查询指定的程序包的依赖关系;

[root@xlogin ~]# rpm -q --provides bash       #列出bash程序包的依赖关系
config(bash) = 4.1.2-33.el6
bash = 4.1.2-33.el6
bash(x86-64) = 4.1.2-33.el6
[root@xlogin ~]# rpm -q --whatprovides bash   #查询bash是由哪个包所提供的
bash-4.1.2-33.el6.x86_64
[root@xlogin ~]# rpm -q --whatprovides 'config(bash)' 
bash-4.1.2-33.el6.x86_64
[root@xlogin ~]# rpm -q --whatrequires bash   #查询bash被哪个包所依赖
initscripts-9.03.49-1.el6.centos.x86_64
dracut-004-388.el6.noarch
rsyslog-5.8.10-10.el6_6.x86_64
cronie-1.4.4-15.el6.x86_64
autofs-5.0.5-113.el6.x86_64
lvm2-2.02.118-2.el6.x86_64      

(4)RPM软件包来源合法性和完整性的验证 

     所谓rpm软件包来源合法性和软件包完整性的验证,是指软件安装包的制作者使用单向加密算法提取出原始数据的特征码,并使用自己的私钥加密这段特征码,附加在原始数据之后,在用户在获得相应的软件安装包后或者是在执行RPM软件包安装时,对于软件包的可靠性及完整性进行的相关验证。

    验证前提:用户必须有可靠的机制获取到包制作者的公钥!

    ①使用包制作者的公钥解密那段加密的特征码,能解密则说明来源合法;

    ②使用与制作者同样的单向加密算法提取数据的特征码,并与解密得到的特征码比对,相同则说明包完整性没问题。

      验证时使用-V参数检查软件包中的组件是否与原始软件包的组织签名相同。

      首先必须获取并导入信任的包制作者的密钥,对于CentOS 6发行版来说,可以通过执行如下命令来进行操作:

[root@xlogin ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 #在当前系统上导入包的制作者的公钥:
[root@xlogin ~]# rpm -qa gpg-pubkey*   #查询系统上已经安装的秘钥
gpg-pubkey-c105b9de-4e0fd3a3
[root@xlogin ~]# rpm -qi gpg-pubkey-c105b9de-4e0fd3a3      #查询此秘钥的详细信息
Name        : gpg-pubkey                   Relocations: (not relocatable)
Version     : c105b9de                          Vendor: (none)
Release     : 4e0fd3a3                      Build Date: Thu 24 Dec 2015 07:15:03 PM CST
Install Date: Thu 24 Dec 2015 07:15:03 PM CST      Build Host: localhost
Group       : Public Keys                   Source RPM: (none)
Size        : 0                                License: pubkey
Signature   : (none)
Summary     : gpg(CentOS-6 Key (CentOS 6 Official Signing Key) <[email protected]>)
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.8.0 (NSS-3)

mQINBE4P06MBEACqn48FZgYkG2QrtUAVDV58H6LpDYEcTcv4CIFSkgs6dJ9TavCW
...............................
-----END PGP PUBLIC KEY BLOCK-----      

     RPM软件包来源合法性和完整性的验证分为两种情况:

  (1)软件包在安装过程中会自动用已经导入的的公钥,对程序包进行检验,一般无需进行手动校验。但是如果没有给系统中导入相应的秘钥文件,则会报NO KEY等信息提示。

[root@xlogin ~]# rpm -ivh htop-1.0.1-2.el6.x86_64.rpm 
warning: htop-1.0.1-2.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Preparing...                ########################################### [100%]
   1:htop                   ########################################### [100%]      

  (2)管理员人为的手动操作进行验正:rpm -K PACKAGE_FILE

  手动检查:
          rpm {-K|--checksig} [--nosignature] [--nodigest] PACKAGE_FILE 
              选项说明:
                    -K :等同于 --checksig ,进行检查并显示结果;
                    --nodigest:不检查包完整性;
                    --nosignature:不检查来源合法性。      
Linux 软件包管理之RPM
Linux 软件包管理之RPM

      ①要验证下载的postfix-2.10.1-6.0.1.el7.centos.x86_64.rpm软件包,可用以下命令:

[root@xlogin ~]# rpm -K postfix-2.10.1-6.0.1.el7.centos.x86_64.rpm 
postfix-2.10.1-6.0.1.el7.centos.x86_64.rpm: rsa sha1 (md5) pgp md5 OK      

      ②要验证已经安装的postfix-2.10.1-6.el7.x86_64软件包,可用以下命令:

[root@xlogin ~]# rpm -V postfix-2.10.1-6.el7.x86_64      

      ③ 当你感觉到你的系统好像不对劲,怀疑有人已经突破了你的系统防御。确定此事是否发生的途径之一就是检查你的系统上软件包安装生成的文件有没有变化,通常只有root才能检查整个系统文件的完整性,要验证所有已经安装的软件包,可用以下命令:

[root@xlogin ~]# rpm -Va
S.5....T.  c /etc/modprobe.d/blacklist.conf
S.5....T.  c /etc/issue
missing   c /etc/yum.repos.d/CentOS-Base.repo
missing   c /etc/yum.repos.d/CentOS-Debuginfo.repo
missing   c /etc/yum.repos.d/CentOS-Media.repo
missing   c /etc/yum.repos.d/CentOS-Vault.repo
missing   c /etc/yum.repos.d/CentOS-fasttrack.repo
Unsatisfied dependencies for vim-clustershell-1.6-1.el6.noarch:
	clustershell = 1.6-1.el6 is needed by vim-clustershell-1.6-1.el6.noarch
S.5....T.  c /etc/rsyslog.conf      

     常见的校验错误码含义:

    对应属性位说明:
              S file Size differs  文件大小发生改变 
              M Mode differs (includes permissions and file type)  文件的权限或类型被修改
              5 digest (formerly MD5 sum) differs  文件内容发生改变
              D Device major/minor number mismatch 主设备号、次设备号发生改变
              L readLink(2) path mismatch  路径改变
              U User ownership differs  属主发生改变
              G Group ownership differs  属组发生改变
              T mTime differs    文件的修改时间发生改变
              P caPabilities differ 文件的权限发生改变
              missing   相关文件丢失
    在文件属性发生某项属性变化时,对应属性位的标识才会显示,若属性无变化,则显示为.      

(5)RPM软件包的删除 

         rpm -e参数卸载时,默认如果正常卸载是不会输出任何信息的,在linux中,no news is good news!所以如果确实想看到卸载过程信息,可以加vv参数。

    例如,要删除htop软件包,可通过以下命令:

Linux 软件包管理之RPM

    有时删除软件包时会遇到关联性的问题而无法删除,这时可以通过 --nodeps参数来强制删除,但不一定就可以删除成功。

Linux 软件包管理之RPM

(6)RPM- 数据库重建:

         如果rpm数据库损坏或误删除,可以参考RPM Guide。

   rpm的数据库目录默认是在/var/lib/rpm目录下,建议做好该目录备份工作。
        重建数据库:
            rpm --initdb:初始化
                如果事先没有库,会新建一个;如果有,则不新建;
            rpm --rebuilddb : 重建
                直接重建,覆盖原有的数据库      
Linux 软件包管理之RPM

(7)其他

 rpm获取帮助:
		CentOS 6:man rpm
		CentOS 7:man rpmdb      
rpm  [OPTIONS]  [PACKAGE_FILE]      

      [PACKAGE_FILE]可以是软件包,也可以指定为ftp或http的URL等,rpm 内置 FTP/HTTP 客户端,可以安装、升级、查询用 URL 指定的软件包文件,比如:

ftp://USER:PASSWORD@HOST:PORT/path/to/package.rpm      

     如果省略了:PASSWORD 部分,将为每个用户名/主机对提示一次密码。