RPM是红帽软件包管理器,主要用来对RPM包进行安装、升级、卸载、查询、校验和数据库维护的管理操作。


安装:


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

        -i:安装一个新包。

        PACKAGE_FILE:包文件。


    常用选项:rpm -ivh PACKAGE_FILE

        -v:显示详细信息,通常会显示常规进度消息。

        -vv:显示更多的调试信息。

        -h:安装包时显示安装进度,一般与-v一起使用。

        --test:不要安装包,只需检查并报告潜在的冲突和依赖。

        --nodeps:在安装或升级包之前不要进行依赖项检查。

        --replacepkgs:即使某些软件包已经安装在此系统上,也要安装这些软件包。

        --replacefiles:即使此包替换了其他已装包的文件,也安装此包。

        --noscripts:不执行同名的脚本。

        --nosignature:读取时不要验证包或头签名。

        --nodigest:读取时不要验证包或头摘要。


    示例:安装zsh,并显示详细信息和安装进度。

        [root@centos ~]# rpm -ivh /media/cdrom/Packages/zsh-5.0.2-25.el7.x86_64.rpm 

        Preparing...                          ################################# [100%]

        Updating / installing...

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


升级:


    语法:

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

            -U:升级或安装包较新版本的包。与-i相同,只是在安装新包后会删除该包的所有其他版本。


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

            -F:升级包,但只能升级安装了旧版本的包。


    常用选项:上述安装的常用选项都适用于升级选项。

        --oldpackage:允许使用旧包替换掉新包。即降级。

        --force:与使用--replacepkgs、--replacefiles和--oldpackage相同。即强制升级。


    示例:升级安装zsh,并显示详细信息和安装进度。

        [root@centos ~]# rpm -Uvh /media/cdrom/Packages/zsh-5.0.2-25.el7.x86_64.rpm 

        Preparing...                          ################################# [100%]

        Updating / installing...

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


    注意:

        (1)不要对内核做升级操作。Linux支持多内核并存,因此,直接安装新版本内核。

        (2)如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供。


卸载:


    语法:rpm {-e|--erase} [erase-options] PACKAGE_NAME ...

        -e:卸载包。


    常用选项:

        --allmatches:删除与包名称匹配的包的所有版本。如果包名称与多个包匹配,通常会发出错误。

        --nodeps:在卸载包之前不要检查依赖项。

        --noscripts:不要执行同名的脚本。

        --test:不要真的卸载任何东西,只需通过卸载测试。与-vv选项一起用于调试。


    示例:卸载zsh,并显示详细信息和卸载进度。

        [root@centos ~]# rpm -evh zsh

        Preparing...                          ################################# [100%]

        Cleaning up / removing...

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


查询:


    语法:rpm {-q|--query} [select-options] [query-options]

        -q:查询包相关信息。


    [select-options]:选择选项。即要查询的对象。

        PACKAGE_NAME:查询名为PACKAGE_NAME的已安装包。

        -a:查询所有已安装的包。

        -f FILE:查询FILE由哪个包生成。

        -p PACKAGE_FILE:查询未安装的PACKAGE_FILE。

        --whatprovides CAPABILITY:查询提供CAPABILITY的所有包。

        --whatrequires CAPABILITY:查询所有需要CAPABILITY才能正常工作的包。


    [query-options]:查询选项。即要查询的内容。

        --changelog:显示包的更改信息。

        -i:显示包信息,包括名称、版本和说明。

        -l:列出包中的文件。

        -c:仅列出配置文件。

        -d:仅列出文档文件。

        --provides:列出此包提供的功能。

        -R:列出此包所依赖的功能。

        --scripts:列出作为安装和卸载过程的一部分使用的特定于包的脚本。


    用法:

        rpm -qi PACKAGE_NAME

        rpm -qf FILE

        rpm -qpl PACKAGE_FILE


    示例:查询zsh的配置文件。

        [root@centos ~]# rpm -qc zsh

        /etc/skel/.zshrc

        /etc/zlogin

        /etc/zlogout

        /etc/zprofile

        /etc/zshenv

        /etc/zshrc


校验:


    语法:rpm {-V|--verify} [select-options] [verify-options]

        -V:校验。


    [select-options]:同查询选项。


    [verify-options]:校验选项。

        --nodeps:不要验证包的依赖性。

        --nodigest:不要验证包或头摘要。

        --nofiles:不要验证包文件的任何属性。

        --noscripts:不要执行%verifyscript脚本。

        --nosignature:不要验证包或头签名。


    输出格式是一个9字符的字符串,一个字符的属性标记,后跟文件名。9个字符中的每一个都表示将文件的属性与数据库中记录的这些属性的值进行比较的结果。单个“.”表示无法执行(例如,文件权限阻止读取)。否则,(助记符)字符表示相应的验证测试失败:

        S:文件大小不同。

        M:模式不同(包括权限和文件类型)。

        5:搞要(原名MD5和)不同。

        D:设备主/次号码不匹配。

        L:readlink(2)路径不匹配。

        U:用户所有权不同。

        G:组所有权不同。

        T:修改时间不同。

        P:功能不同。


        c:配置文件。

        d:文档文件。

        g:ghost文件。

        l:许可证文件。

        r:自述文件。


    示例:修改zsh配置文件/etc/skel/.zshrc,再校验。

        [root@centos ~]# echo "###" >> /etc/skel/.zshrc

        [root@centos ~]# rpm -V zsh

        S.5....T.  c /etc/skel/.zshrc


包来源合法性验证和完整性验证:


    来源合法性验证:包制作者用自己的私钥将包通过计算得到的MD5值加密生成数字签名,包使用者用包制作者的公钥对包的数字签名解密得到包的MD5值。


    完整性验证:将包通过计算得到的MD5值和验证了来源合法性得到的MD5值进行对比。


    导入信任的包制作者的密钥:rpmkeys --import PUBKEY ...

        rpmkeys --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7


    验证:

        (1)安装此组织签名的程序时,会自动执行验证。

        (2)手动验证:rpmkeys {-K|--checksig} PACKAGE_FILE ...


    示列:导入CentOS7光盘中的密钥,对光盘中的zsh包进行验证。

        [root@centos ~]# rpmkeys --import /media/cdrom/RPM-GPG-KEY-CentOS-7

        [root@centos ~]# rpmkeys -K /media/cdrom/Packages/zsh-5.0.2-25.el7.x86_64.rpm 

        /media/cdrom/Packages/zsh-5.0.2-25.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK


数据库重建:


    语法:rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY] [--root DIRECTORY]

        --initdb:创建一个新数据库。当前无任何数据库时创建一个新的,有数据库时不执行任何操作。

        --rebuilddb:从已安装的包头重新生成数据库索引。

        --dbpatch DIRECTORY:使用DIRECTORY中的数据库,而不是默认路径/var/lib/rpm。

        --root DIRECTORY:对于所有操作,请使用DIRECTORY文件系统。请注意,这意味着DIRECTORY中的数据库将用于依赖项检查,并且在根目录更改为DIRECTORY后,将运行任何脚本。


    示例:创建/tmp/rpmdb目录,在此目录中生成rpm数据库。

        [root@centos ~]# mkdir /tmp/rpmdb

        [root@centos ~]# rpm --initdb --dbpath /tmp/rpmdb 

        [root@centos ~]# ls /tmp/rpmdb

        Basenames     __db.001  __db.003  Group       Name          Packages     Requirename  Sigmd5

        Conflictname  __db.002  Dirnames  Installtid  Obsoletename  Providename  Sha1header   Triggername