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) 官方的文件服务器(或镜像站点)
(2) 项目的官方站点
(3) 第三方组织:
(a) EPEL
(b) 搜索引擎
(4) 自己动手编译。
下载后建议检查程序包的合法性和完整性。
rpm命令使用
安装
命令格式:
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
应用:
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]:
-h:hash 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 zshzsh-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 zshzsh-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/shbash = 4.2.46-12.el7bash(x86-64) = 4.2.46-12.el7config(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-infolibc.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-1rpmlib(FileDigests) <= 4.6.0-1rpmlib(PayloadFilesHavePrefix) <= 4.0-1rtld(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/rpmBasenames __db.001 __db.003 Group Name Packages Requirename Sigmd5Conflictname __db.002 Dirnames Installtid Obsoletename Providename Sha1header Triggername[root@localhost ~]# rpm --rebuilddb --dbpath /tmp/rpm[root@localhost ~]# ls /tmp/rpmBasenames Dirnames Installtid Obsoletename Providename Sha1header TriggernameConflictname Group Name Packages Requirename Sigmd5