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) 官方的文件服务器(或镜像站点)
(2) 项目的官方站点
(3) 第三方组织
(a) EPEL (b) 搜索引擎 |
(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、测试安装:
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]#
2、正常安装:
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]#
【注意:该warning是没有对包进行合法验证】
3、测试安装,且忽略依赖关系:
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]#
4、强制重新安装
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]#
5、安装时候不检查包的来源合法性
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]#
No2.升级 |
命令格式:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
注意事项:
-U|--upgrade:如果没有旧版程序包,则安装程序包;如果有旧版程序包,则升级程序包 |
通用选项:
-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的区别
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]#
2、当老版本存在,升级"老版本" ,
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]#
3、降级新版本
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]#
No3.卸载 |
命令格式:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...
注意:这里的PACKAGE NAME 指的是包名,不是包的全名。
选项:
--allmatches:卸载所有匹配指定名称的程序包的各版本,即删除系统里有同一程序的多个安装版本 --nodeps:忽略依赖关系 --test:测试卸载,dry run模式 --noscripts: |
---------------------------------------------------------
---------------------------------------------------------
示例:
1、卸载包
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]#
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
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]#
3、查询未安装php-common软件包的配置文件
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
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:初始化数据库。如果事先不存在数据库,则新建之;否则,不执行任何操作 |
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
关于包合法性验证还可以查看博客:链接地址