• rpm简介


rpm( Red Hat Package Manager )是一个开放的软件包管理系统。它工作于Red Hat Linux及其他Linux系统,成为Linux中公认的软件包管理标准。

rpm将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操作

rpm维护一个所有已安装的软件包和文件的数据库,可以让用户进行功能强大的软件包查询和验证工作。


  • rpm的功能


安装:-i, --install

卸载:-U, --update, -F, --freshen

升级:-e, --erase

查询:-q, --query

验证:-V, --verify

数据库维护:--builddb, --initdb

  • rpm软件包命名格式

rpm包的命名格式一般分两大部分组成。

第一部分是源代码版本号,比如:

    name-VERSION.tar.gz

    name:源代码包的名称

    VERSION分为:

        major: 主版本号,一般程序功能有重大改变才会变动

        minor: 次版本号,程序功能某个小的分支有变动,才会变动

        release: 发行号,修正了某个BUG或升级了某段代码,才会变动


第二部分是rpm打包制作的版本。

    如果用源代码比作面粉,rpm包比作馒头,它们的区别在于:面粉有不同的工艺,拿面粉又做出了各种可口的馒头。

这样最终的软件包格式就构成了:

name-VERSION-release.arch.rpm

其中

    name-VERSION仍然沿用源代码包的命名

    release: rpm包打包制作的发行号

    arch:是指明适用于哪种操作系统平台,有i386, x64(amd64), ppc, noarch


  • 获取程序包

除了系统发行版的光盘自带的rpm软件包外,通常还需要到网上下载,下面是几个可信的获取软件包的途径

(1)    官方的文件服务器(或镜像站点)

    http://mirrors.aliyum.com

    http://mirrors.sohu.com

    http://mirrors.163.com

(2)    项目的官方站点

(3)    第三方组织:

    (a)    EPEL

    (b)    搜索引擎

        http://pkgs.org

        http://rpmfind.net

        http://rpm.pbone.net

(4)    自己动手编译。

下载后建议检查程序包的合法性和完整性。

  • rpm命令使用

  • 安装

命令格式:  

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


通用选项:

    -v : verbose,详细信息

    -vv : 更详细的信息


[install-options]

    -hhash marks输出进度条,每个#表示2%的进度

    --test:测试安装,检查并报告依赖关系及冲突消息等

    --nodeps:忽略依赖关系

    --replacepkgs:强制重新安装已经安装的软件包

   --nosignature:不检查包签名信息,不检查来源合法性

   --nodigest:不检查包完整性信息

 

注意:每一个程序安装时可能会运行脚本,做一些准备操作。rpm包可以自带脚本,这些脚本有四类,分别在不同的时刻被触发,分别是:

  preinstall : 安装过程开始之前运行的脚本,%pre --nopre

  postinstall : 安装过程完成之后运行的脚本,%post , --nopost

  preuninstall : 卸载过程真正开始执行之前运行的脚本,%preun, --nopreun

  postuninstall : 卸载过程完成之后运行的脚本,%postun , --nopostun

 

应用:

1、正常安装

[root@localhost Packages]# pwd
/media/Packages
[root@localhost Packages]# rpm -ivh zsh-5.0.2-7.el7.x86_64.rpm 
准备中...                          ################################# [100%]
正在升级/安装...
   1:zsh-5.0.2-7.el7                  ################################# [100%]

2、忽略依赖关系   

[root@localhost Packages]# rpm -ivh --test --nodeps php-common-5.4.16-23.el7_0.3.x86_64.rpm 
准备中...                          ################################# [100%]
[root@localhost Packages]# rpm -ivh --test php-common-5.4.16-23.el7_0.3.x86_64.rpm 
错误:依赖检测失败:
	libzip.so.2()(64bit) 被 php-common-5.4.16-23.el7_0.3.x86_64 需要
[root@localhost Packages]# rpm -ivh --nodeps php-common-5.4.16-23.el7_0.3.x86_64.rpm 
准备中...                          ################################# [100%]
正在升级/安装...
   1:php-common-5.4.16-23.el7_0.3     ################################# [100%]

3、强制重新安装

[root@localhost Packages]# rpm -ivh zsh-5.0.2-7.el7.x86_64.rpm 
准备中...                          ################################# [100%]
	软件包 zsh-5.0.2-7.el7.x86_64 已经安装
[root@localhost Packages]# rpm -ivh --replacepkgs zsh-5.0.2-7.el7.x86_64.rpm 
准备中...                          ################################# [100%]
正在升级/安装...
   1:zsh-5.0.2-7.el7                  ################################# [100%]


  • 升级

 

命令格式:

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

其中:

   -U:如果有安装老版本则升级,如果老版本安装不存在,则安装最新版本

   -F:如果有安装老版本就升级,如果老版本安装不存在,则不予理会

 

通用选项:

    -v : verbose,详细信息

    -vv : 更详细的信息

 

[install-options]

    -hhash marks输出进度条,每个#表示2%的进度

    --test:只进行升级测试

    --oldpackage:降级,如果新版本存在很多问题,就要用到降级

    --force:强制升级,如果新版本不再为其它程序提供依赖服务,这时会报错,可用强制升级

 

注意:

    (1)内核升级可能会有若然隐患问题,所以不要对内核进行升级,如果要测试新版本内核,可用直接安装新版本内核,让与老版本并存。

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

 

应用:

1-U-F的区别:

[root@localhost Packages]# rpm -q zsh
未安装软件包 zsh 
[root@localhost Packages]# rpm -Fvh zsh-5.0.2-7.el7.x86_64.rpm 
[root@localhost Packages]# rpm -Uvh zsh-5.0.2-7.el7.x86_64.rpm 
准备中...                          ################################# [100%]
正在升级/安装...
   1:zsh-5.0.2-7.el7                  ################################# [100%]

2、升级“老版本”

[root@localhost ~]# ls -l
总用量 4628
-rw-------. 1 root root    1998 12月 17 17:09 anaconda-ks.cfg
-r--r--r--. 1 root root 2240608 12月 23 15:54 zsh-4.3.10-4.1.el6.x86_64.rpm
-rw-r--r--. 1 root root 2489188 12月 23 17:06 zsh-5.0.2-7.el7.x86_64.rpm
[root@localhost ~]# rpm -q zsh
zsh-5.0.2-7.el7.x86_64
[root@localhost ~]# rpm -Uvh zsh-4.3.10-4.1.el6.x86_64.rpm 
\警告:zsh-4.3.10-4.1.el6.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY
准备中...                          ################################# [100%]
	软件包 zsh-5.0.2-7.el7.x86_64 (比 zsh-4.3.10-4.1.el6.x86_64 还要新) 已经安装
[root@localhost ~]# rpm -Uvh --oldpackage zsh-4.3.10-4.1.el6.x86_64.rpm 
警告:zsh-4.3.10-4.1.el6.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:zsh-4.3.10-4.1.el6               ################################# [ 50%]
正在清理/删除...
   2:zsh-5.0.2-7.el7                  ################################# [100%]
[root@localhost ~]# rpm -q zsh
zsh-4.3.10-4.1.el6.x86_64


  • 卸载

命令格式:

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

其中:

    --allmatches:卸载所有匹配指定名称的程序包的各版本

    --nodeps:忽略依赖关系

    --test:测试卸载,dry run模式

 

  • 查询

 

命令格式:

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

其中:

[select-options]

    PACKAGE_NAME:查询指定的程序包是否已经安装,及其版本

    -a,--all:列出所有已经安装过的包

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

    -p,--package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作

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

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

                                    

[query-options]

    --changelog:查询rpm包的changlog,注意非源码包的历史修订

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

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

    -c,--configfiles:查询指定的程序包提供的配置文件

    -d,--docfiles:查询指定的程序包提供的文档

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

    -R,--requires:查询指定的程序包所依赖的CAPABILITY

    --scripts:查看程序包自带的脚本片断

 

常用用法:

    -qi PACKAGE             //查询程序包information

    -qf FILE               //查询文件由哪个程序包生成

    -qc PACKAGE            //查询程序包的配置文件

    -ql PACKAGE            //查询程序包生成的文件列表

    -qd PACKAGE            //查询程序包安装后生成的文档

    -qpi PACKAGE_FILE        //查询未安装程序包的information

    -qpl PACKAGE_FILE        //查询未安装程序包将要生成的文件列表

    -qpc PACKAGE_FILE, ...     //查询未安装程序包将要提供的配置文件

    

应用:

1、查询bash软件包提供的所有CAPABILITY

[root@localhost ~]# rpm -q --provides bash
/bin/bash
/bin/sh
bash = 4.2.46-12.el7
bash(x86-64) = 4.2.46-12.el7
config(bash) = 4.2.46-12.el7
[root@localhost ~]# rpm -q --whatprovides 'config(bash)'
bash-4.2.46-12.el7.x86_64

2、查询sed软件包所依赖的CAPABILITY

[root@localhost ~]# rpm -qR sed
/bin/sh
/bin/sh
/sbin/install-info
/sbin/install-info
libc.so.6()(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.3.4)(64bit)
libc.so.6(GLIBC_2.4)(64bit)
libc.so.6(GLIBC_2.7)(64bit)
libselinux.so.1()(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)
rpmlib(PayloadIsXz) <= 5.2-1

3、查询未安装php-common软件包的配置文件

[root@localhost ~]# cd /media/Packages/
[root@localhost Packages]# rpm -qpc php-common-5.4.16-23.el7_0.3.x86_64.rpm 
/etc/php.d/curl.ini
/etc/php.d/fileinfo.ini
/etc/php.d/json.ini
/etc/php.d/phar.ini
/etc/php.d/zip.ini
/etc/php.ini


  • 校验

 

命令格式:

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

一般用于对软件包安装后,校验软件包所有的文件有没有发生修改。

例如:

        # rpm -V zsh                   //没有返回任何提示,即校验通过
        # vim/usr/share/zsh/4.3.10/scripts/newuser       //在注释行添加一个“#”
        # rpm -V zsh
        # [root@localhostPackages]# rpm -V zsh
          S.5....T.   /usr/share/zsh/4.3.10/scripts/newuser  //文件大小发生变化,MD5校验和发生变化,文件修改时间发生变化

如果一切都被校验正确,屏幕上就不会显示输出。如果出现有修改,相关信息就会被显示至屏幕。输出的格式中,单用“ . ” 表示测试通过,如果是下列字符则代表某类测试失败:

    5:MD5校验和

    S:文件大小

    L:符号链接

    T:文件修改时间

    D:设备

    U:用户

    G:组群

    M:模式( 包含权限和文件类型 )

    ?:不可读文件

 

  • rpm包来源合法性验证和完整性验证

 

软件包在打包制作时,会附加上用单向加密了的软件包自身的特征码,只有与之对应的公钥才能解密验证包的合法性并得到特征码,再利用特征码验证软件包的完整性。如果本地没有对应的公钥在安装时就会出现警告信息。这时需要获取公钥,公钥的获取很关键,直接关系着软件包的来源合法性。

 

首先要获取并导入信任的包制作者的密钥,对于CentOS 7发行版来说,系统在安装完成后,系统会自动复制一份公钥至/etc/pki/rpm-gpg/ 下,用命令导入公钥,如下:

[root@localhost ~]# rpm-import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

还有一种就是把密钥路径指向发行版光盘:

[root@localhost ~]# rpm-import /media/RPM-GPG-KEY-CentOS-7

接下来安装软件包时系统就可以自动验证了。

 

还可以在安装软件包前,手动验证:

[root@localhost ~]# rpm -K zsh-5.0.2-7.el7.x86_64.rpm 
zsh-5.0.2-7.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 确定


  • 数据库重建

 

rpm管理器数据库路径:

/var/lib/rpm/


所有的查询操作都是通过此处的数据库进行的。

 

命令格式:

rpm {--initdb|--rebuilddb}[--dbpath DIRECTORY] [--root DIRECTORY]

其中:

    --initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;当前有时不执行任何操作

    --rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建

        

应用:

[root@localhost ~]# mkdir /tmp/rpm        //仅供测试
[root@localhost ~]# rpm --initdb --dbpath /tmp/rpm
[root@localhost ~]# ls /tmp/rpm
Basenames     __db.001  __db.003  Group       Name          Packages     Requirename  Sigmd5
Conflictname  __db.002  Dirnames  Installtid  Obsoletename  Providename  Sha1header   Triggername
[root@localhost ~]# rpm --rebuilddb --dbpath /tmp/rpm
[root@localhost ~]# ls /tmp/rpm
Basenames     Dirnames  Installtid  Obsoletename  Providename  Sha1header  Triggername
Conflictname  Group     Name        Packages      Requirename  Sigmd5