Linux程序包管理之rpm

时间:2023-02-14 18:25:51
rpm简介

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

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

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

在rpm学习前我们需要知道其它一些知识点来辅助学习:RPM学习第一篇

rpm软件包的命名格式

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

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

name-VERSION.tar.gz

  name:源代码包的名称

  VERSION: major.minor.release 

    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命令使用

安装:-i, --install        

升级:-U, --update, -F, --freshen

卸载:-e, --erase

查询:-q, --query

验证:-V, --verify

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

包的来源合法性验证和完整性验证: -K , --import

分别详解命令的使用

 

No1.安装

 命令格式:

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

 通用选项

 -v : verbose ,详细信息

  -vv : 更详细的信息

[install-options]

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

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

  --nodeps:忽略依赖关系;不建议使用

  --replacepkgs:强制重新安装已经安装的软件包  【这种安装,其配置文件可能不会安装,也有可能把原来的配置文件覆盖了】

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

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

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

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

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

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

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

常用命令:

    rpm  -ivh  PACKAGE_FILE ...

-------------------------------------------------------------

-------------------------------------------------------------

示例:

1、测试安装:

Linux程序包管理之rpmLinux程序包管理之rpm
1 [root@oldboy mnt]# rpm -ivh --test mysql-5.1.73-5.el6_6.x86_64.rpm 
2 warning: mysql-5.1.73-5.el6_6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
3 Preparing...                ########################################### [100%]
4 [root@oldboy mnt]# 
rpm -ivh --test mysql-5.1.73-5.el6_6.x86_64.rpm

2、正常安装:

Linux程序包管理之rpmLinux程序包管理之rpm
1 [root@oldboy mnt]# rpm -ivh python-2.6.6-64.el6.x86_64.rpm 
2 warning: python-2.6.6-64.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
3 Preparing...                ########################################### [100%]
4     package python-2.6.6-64.el6.x86_64 is already installed
5 [root@oldboy mnt]# 
rpm -ivh python-2.6.6-64.el6.x86_64.rpm

【注意:该warning是没有对包进行合法验证】

3、测试安装,且忽略依赖关系:

Linux程序包管理之rpmLinux程序包管理之rpm
 1 [root@oldboy mnt]# rpm -ivh --test php-odbc-5.3.3-40.el6_6.x86_64.rpm 
 2 warning: php-odbc-5.3.3-40.el6_6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
 3 error: Failed dependencies:
 4     libodbc.so.2()(64bit) is needed by php-odbc-5.3.3-40.el6_6.x86_64
 5     php-common(x86-64) = 5.3.3-40.el6_6 is needed by php-odbc-5.3.3-40.el6_6.x86_64
 6     php-pdo(x86-64) is needed by php-odbc-5.3.3-40.el6_6.x86_64
 7 [root@oldboy mnt]# rpm -ivh --test --nodeps php-odbc-5.3.3-40.el6_6.x86_64.rpm 
 8 warning: php-odbc-5.3.3-40.el6_6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
 9 Preparing...                ########################################### [100%]
10 [root@oldboy mnt]# 
rpm -ivh --test --nodeps php-odbc-5.3.3-40.el6_6.x86_64.rpm

4、强制重新安装

Linux程序包管理之rpmLinux程序包管理之rpm
1 [root@oldboy mnt]# rpm -ivh zsh-4.3.11-4.el6.centos.x86_64.rpm 
2 warning: zsh-4.3.11-4.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
3 Preparing...                ########################################### [100%]
4     package zsh-4.3.11-4.el6.centos.x86_64 is already installed
5 [root@oldboy mnt]# rpm -ivh --replacepkgs zsh-4.3.11-4.el6.centos.x86_64.rpm 
6 warning: zsh-4.3.11-4.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
7 Preparing...                ########################################### [100%]
8    1:zsh                    ########################################### [100%]
9 [root@oldboy mnt]# 
rpm -ivh --replacepkgs zsh-4.3.11-4.el6.centos.x86_64.rpm

5、安装时候不检查包的来源合法性

Linux程序包管理之rpmLinux程序包管理之rpm
1 [root@oldboy mnt]# rpm -ivh --test --nodeps php-odbc-5.3.3-40.el6_6.x86_64.rpm 
2 warning: php-odbc-5.3.3-40.el6_6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
3 Preparing...                ########################################### [100%]
4 [root@oldboy mnt]# rpm -ivh --test --nosignature --nodeps php-odbc-5.3.3-40.el6_6.x86_64.rpm 
5 Preparing...                ########################################### [100%]
6 [root@oldboy mnt]#
rpm -ivh --test --nosignature --nodeps php-odbc-5.3.3-40.el6_6.x86_64.rpm

 

No2.升级

 命令格式:

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

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

注意事项:

-U|--upgrade:如果没有旧版程序包,则安装程序包;如果有旧版程序包,则升级程序包
-F:仅升级,如果没有旧版程序包,则不执行任何操作  【好像不支持降级功能

通用选项:

-v : verbose ,详细信息

-vv : 更详细的信息

[install-options]:

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

--test:只进行升级测试

--nodeps:忽略依赖关系;不建议使用

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

--oldpackage:降级,如果新版本存在很多问题,就要用到降级  【注意:-F好像不支持降级功能

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

注意:

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

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

 

常用命令:    

    rpm -Uvh PACKAGE_FILE ...
    rpm -Fvh PACKAGE_FILE ...

--------------------------------------------------------------------------

--------------------------------------------------------------------------

示例:

1、-U和-F的区别

Linux程序包管理之rpmLinux程序包管理之rpm
1 [root@oldboy mnt]# rpm -Fvh --test --nodeps php-odbc-5.3.3-40.el6_6.x86_64.rpm 
2 warning: php-odbc-5.3.3-40.el6_6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
3 [root@oldboy mnt]# rpm -Uvh --test --nodeps php-odbc-5.3.3-40.el6_6.x86_64.rpm 
4 warning: php-odbc-5.3.3-40.el6_6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
5 Preparing...                ########################################### [100%]
6 [root@oldboy mnt]# 
rpm -Fvh --test --nodeps php-odbc-5.3.3-40.el6_6.x86_64.rpm   /  rpm -Uvh --test --nodeps php-odbc-5.3.3-40.el6_6.x86_64.rpm

2、当老版本存在,升级"老版本" ,

Linux程序包管理之rpmLinux程序包管理之rpm
1 [root@oldboy mnt]# rpm -q zsh
2 zsh-4.3.11-4.el6.centos.x86_64
3 [root@oldboy mnt]# rpm -Uvh --nodeps zsh-5.0.2-28.el7.x86_64.rpm 
4 warning: zsh-5.0.2-28.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
5 Preparing...                ########################################### [100%]
6    1:zsh                    ########################################### [100%]
7 [root@oldboy mnt]# 
rpm -Uvh --nodeps zsh-5.0.2-28.el7.x86_64.rpm

3、降级新版本

Linux程序包管理之rpmLinux程序包管理之rpm
1 [root@oldboy mnt]# rpm -q zsh
2 zsh-5.0.2-28.el7.x86_64
3 [root@oldboy mnt]# rpm -Fvh --oldpackage zsh-4.3.11-4.el6.centos.x86_64.rpm   [-F 好像不支持降级功能]
4 warning: zsh-4.3.11-4.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY 
5 [root@oldboy mnt]# rpm -Uvh --oldpackage zsh-4.3.11-4.el6.centos.x86_64.rpm 
6 warning: zsh-4.3.11-4.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
7 Preparing...                ########################################### [100%]
8    1:zsh                    ########################################### [100%]
9 [root@oldboy mnt]# 
rpm -Uvh --oldpackage zsh-4.3.11-4.el6.centos.x86_64.rpm

 

No3.卸载

 命令格式:

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

 

注意:这里的PACKAGE NAME  指的是包名,不是包的全名。

 选项:

--allmatches:卸载所有匹配指定名称的程序包的各版本,即删除系统里有同一程序的多个安装版本

--nodeps:忽略依赖关系

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

--noscripts:

---------------------------------------------------------

---------------------------------------------------------

示例:

1、卸载包

Linux程序包管理之rpmLinux程序包管理之rpm
1 [root@oldboy mnt]# rpm -q zsh
2 zsh-5.0.2-28.el7.x86_64
3 [root@oldboy mnt]# rpm -e zsh-5.0.2-28.el7.x86_64
4 [root@oldboy mnt]# rpm -q zsh
5 package zsh is not installed
6 [root@oldboy mnt]# 
rpm -e zsh-5.0.2-28.el7.x86_64

 

No4.查询

命令格式:

    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@oldboy mnt]# rpm -q --provides bash
config(bash) = 4.1.2-33.el6
bash = 4.1.2-33.el6
bash(x86-64) = 4.1.2-33.el6
[root@oldboy mnt]# rpm -q --provides mysql
mysql = 5.1.73-5.el6_6
mysql(x86-64) = 5.1.73-5.el6_6
[root@oldboy mnt]# rpm -q --provides zsh
config(zsh) = 5.0.2-28.el7
zsh = 5.0.2-28.el7
zsh(x86-64) = 5.0.2-28.el7
[root@oldboy mnt]# rpm -q --whatprovides 'config(bash)'
bash-4.1.2-33.el6.x86_64
[root@oldboy mnt]# rpm -q --whatprovides 'bash(x86-64)'
bash-4.1.2-33.el6.x86_64
[root@oldboy mnt]# rpm -q --whatprovides 'bash'
bash-4.1.2-33.el6.x86_64
[root@oldboy mnt]# 

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

Linux程序包管理之rpmLinux程序包管理之rpm
 1 [root@oldboy mnt]# rpm -qR sed
 2 /bin/sh  
 3 /bin/sh  
 4 /sbin/install-info  
 5 /sbin/install-info  
 6 libc.so.6()(64bit)  
 7 libc.so.6(GLIBC_2.2.5)(64bit)  
 8 libc.so.6(GLIBC_2.3)(64bit)  
 9 libc.so.6(GLIBC_2.3.4)(64bit)  
10 libc.so.6(GLIBC_2.4)(64bit)  
11 libselinux.so.1()(64bit)  
12 rpmlib(CompressedFileNames) <= 3.0.4-1
13 rpmlib(FileDigests) <= 4.6.0-1
14 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
15 rtld(GNU_HASH)  
16 rpmlib(PayloadIsXz) <= 5.2-1
17 [root@oldboy mnt]# 
rpm -qR sed

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

Linux程序包管理之rpmLinux程序包管理之rpm
1 [root@oldboy mnt]# rpm -qpc php-common-5.3.3-40.el6_6.x86_64.rpm 
2 warning: php-common-5.3.3-40.el6_6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
3 /etc/php.d/curl.ini
4 /etc/php.d/fileinfo.ini
5 /etc/php.d/json.ini
6 /etc/php.d/phar.ini
7 /etc/php.d/zip.ini
8 /etc/php.ini
rpm -qpc php-common-5.3.3-40.el6_6.x86_64.rpm

4、查询系统中安装了哪些rpm包: rpm -qa 

5、查找所有安装过的包含某个字符串sql的软件包: rpm -qa | grep sql

6、查询MySQL软件包中的文件安装到那里去了:rpm -qa MySQL

7、查询XX.rpm中包含那些文件。

  • 一个没有安装过的软件包,使用rpm -qlp XX.rpm
  • 一个已经安装过的软件包,还可以使用rpm -ql XX.rpm

8、查询某个程序是哪个软件包安装的:

  rpm -qf `/bin/sed`    #返回软件包的全名
  rpm -qif `/bin/sed`   #返回软件包的有关信息
  rpm -qlf `/bin/sed`   #返回软件包的文件列表

 

No5.校验

命令格式:

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

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

 

示例:

1 [root@oldboy mnt]# rpm -V zsh      //没有返回任何提示,即校验通过
2 
3 [root@oldboy mnt]# vim /usr/share/zsh/5.0.2/functions/send-invisible   //往zsh包的配置文件添加了几个字符
4 
5 [root@oldboy mnt]# rpm -V zsh
6 
7 S.5....T.    /usr/share/zsh/5.0.2/functions/send-invisible  //这次,就显示被修改过了

 

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

5: MD5校验和

S: 文件大小

L: 符号链接

T: 文件修改时间

D: 设备

U: 用户

G: 组群

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

?: 不可读文件

 

No6.数据库重建  --> 仅管理员才能操作,目前还不知道怎么用??

 rpm管理器数据库路径:

 

  /var/lib/rpm/

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

命令格式:

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

其中:

--initdb:初始化数据库。如果事先不存在数据库,则新建之;否则,不执行任何操作
--rebuilddb:重新构建。无论当前存在与否,直接重建数据库

 

No7.包来源合法性验证和完整性验证 --> 这一步需要在包安装之前进行

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

注意:

  1、在可靠站点下的程序包一般我们获取不到公钥,所以就无法进行来源合法性验证,所以最好使用系统光盘自带的rpm程序包。  

  2、如果是系统光盘自带的rpm程序包的话,想要进行来源合法性验正的话,直接导入公钥再验证

首先要获取并导入信任的包制作者的密钥,对于CentOS发行版来说:

  系统在安装完成后,系统会自动复制一份公钥至/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.e17.x86_64.rpm

  关于包合法性验证还可以查看博客:链接地址