rpm命令

rpm命令:
rpm [OPTIONS] [PACKAGE_FILE]
安装:-i,--install
升级:-U,--update,-F,--freshen
卸载:-e,--erase
查询:-q,--query
校验:-V,--verify
导入密钥:--import /PATH/TO/RPM-GPG-KEY
手动
数据库维护:--buiddb,--initdb
每种功能还有很多复杂子选项;

rpm包安装:
rpm {-i|--install} [install-options] PACKAGE_FILE ...

常用格式:要有文件路径;
rpm -ivh PACKAGE_FILE ...

[install-options]安装选项:
-h, --hash:hash marks输出进度条,一共50个#,每个#进度表示2%;
--test:测试安装,检查并报告依赖关系及冲突消息等,dry run模式;
--nodeps:忽略依赖关系(安装后使用可能有问题),不建议;
--replacepkgs:重新安装;

--noscripts:不执行rpm包自带的四类脚本;
--nopre:不执行rpm包自带的preinstall脚本;
--nopost:不执行rpm包自带的postinstall脚本;
--nopreun:不执行rpm包自带的preuninstall脚本;
--nopostun:不执行rpm包自带的postuninstall脚本;
例如:
]# mount -r /dev/cdrom /media:虚拟机上的光盘连接后即可挂载;
]# rpm -ivh --test /media/Packages/zsh-5.0.2-7.el7.x86_64.rpm:测试安装;
]# rpm -ivh --replacepkgs /media/Packages/zsh-5.0.2-7.el7.x86_64.rpm
]# rpm -ivh /media/Packages/zsh-5.0.2-7.el7.x86_64.rpm

注意:rpm包可以自带脚本;
四类:--noscripts
preinstall:安装过程开始之前运行的脚本,标记为%pre;--nopre
postinstall:安装过程完成之后运行的脚本,标记为%post;--nopost
preuninstall:卸载过程真正开始执行之前运行的脚本,标记为%preun;--nopreun
postuninstall:卸载过程完成之后运行的脚本,标记为%postun;--nopostun

--nosignature:不检查包签名信息,不检查来源合法性(有时,警告no key,但光盘上有key,可以手动导入);
--nodigest:不检查包完整性信息,(不检查校验md5信息);

rpm包升级:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
-U:表示升级或安装(发现旧版本则升级,没发现则直接安装);
-F:升级(只完成升级旧版本);
--nodeps:
--test:
--noscripts

常用格式:
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...

--oldpackage:降级安装(新版程序包不兼容时,要回滚);
--force:强制升级;
例如:
]# rpm -Uvh /media/Packages/zsh-5.0.2-7.el7_1.2.x86_64.rpm:升级rpm包;

注意:
(1)不要对内核做升级操作;Linux支持多内核版本并存,因此,要直接安装新版本内核;
(2)如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后生成提供;

rpm包卸载:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...
--allmatches:卸载所有匹配指定名称的程序包的各版本;
--nodeps:忽略依赖关系;
--test:测试卸载,dry run模式;

注意:卸载和查询时都无需程序文件路径,只需给出rpm程序包名即可;
安装和升级rpm程序包名需要rpm程序包文件完整路径;

rpm包查询:
rpm {-q|--query} [select-options] [query-options]
-q
[select-options]:挑选查询哪些包;
PACKAGE_NAME:查询指定程序包是否安装及会显示详细版本信息;
-a,--all:查询所有安装过的包;
-f FILE:查询指定文件(要写绝对路径)由哪个程序包安装生成的;
-g,--group GROUP:查询指定包组中包含的程序包;

-p,--package package_file:对未安装的程序包查询(结合query-options选项),但要有rpm安装文件,否则无法查询;

--whatprovides CAPABILITY:查询指定的capability由哪个程序包提供(结合query-options选项);
--whatrequires CAPABILITY:程序指定的capability被哪个程序包依赖(结合query-options选项);
例如:
]# rpm -q zsh:查询指定rpm程序包;
]# rpm -qa:查询所有已安装的rpm程序包,可同grep搭配使用;

[query-options]:查询包的信息;
--changelog:查询指定rpm包的修改日志changelog;
-i:查询指定rpm包相关的详细信息(版本、作者、功能描述、大小、所属包组...);
-l:查询指定rpm包安装后生成的所有文件列表;(二进制程序、配置文件、库文件、帮助文档)
-c:查看指定rpm程序的配置文件;
-d,--docfiles:查看指定rpm程序包提供的文档;
--provides:查看指定rpm程序包提供所有的capability功能;
-R,--requires:查询指定rpm包的依赖关系;
--scripts:查看rpm程序包自带的四类脚本程序片段(preinstall、postinstall、preuninstall、postuninstall);
例如:
]# rpm -q --changelog zsh:查询指定rpm包修改日志;
]# rpm -qi zsh:查询指定rpm包相关详细信息;
]# rpm -ql zsh:查询指定rpm包生成的所有文件列表;
]# rpm -qc zsh:查询指定rpm包所包含的配置文件;
]# rpm -qd zsh:查询指定rpm包提供的文档;
]# rpm -q --provides bash:查询指定rpm包提供的所有能力;
]# rpm -q --whatprovides bash:查询指定rpm包由哪个程序包提供;
]# rpm -q --whatprovides 'config(bash)'
]# rpm -q --whatrequires bash:查询指定rpm包被哪个程序包所依赖;
]# rpm -q -R zsh:查询指定rpm包的依赖关系;
]# rpm -q --scripts zsh:查询指定rpm包自带的四类脚本程序代码;

查询未安装的rpm包的相关信息,但必须有rpmb的安装文件才能查询;
]# rpm -qpl /media/Packages/zsh-5.0.2-7.el7.x86_64.rpm:查询未安装的rpm包安装后生成的所有文件列表;
]# rpm -qpi /media/Packages/zsh-5.0.2-7.el7.x86_64.rpm:查询未安装的rpm包相关详细信息;
]# rpm -qpc /media/Packages/zsh-5.0.2-7.el7.x86_64.rpm:查询未安装的rpm包配置文件;
]# rpm -qpd /media/Packages/zsh-5.0.2-7.el7.x86_64.rpm:查询未安装的rpm包提供的文档;
]# rpm -qp --scripts /media/Packages/zsh-5.0.2-7.el7.x86_64.rpm:查询未安装的rpm包自带的四类脚本程序片段;

rpm包校验:
rpm {-V|--verify} [select-options] [verify-options]
--nodeps:不校验依赖关系;
--nodigest:不检查包完整性;
--nofiles:不校验文件属性是否发生改变;
--nosignature:不检查包或头部签名;
例如:
]# rpm -V --nofiles zsh

校验结果各位置的代表意思(9位):

例如:S.5....T.

S file Size differs:大小改变;
M Mode differs (includes permissions and file type):权限改变;
5 digest (formerly MD5 sum) differs:内容改变(完整性发生改变);
D Device major/minor number mismatch:主次设备号不匹配;
L readLink(2) path mismatch:路径不匹配;
U User ownership differs:属主发生改变;
G Group ownership differs:属组发生改变;
T mTime differs:最近一次的修改时间戳发生改变;
P caPabilities differ:能力发生改变;

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

rpm包来源合法性验证和完整性验证,导入密钥:
以ISO镜像光盘为例,将镜像文件导入虚拟机光驱,并开启连接;
挂载后,查看文件:密钥文件
RPM-GPG-KEY-CentOS-7
对于CentOS发行版来说:
获取并导入信任的包制作者的密钥(公钥):
导入密钥文件:
例如:
]# rpm --import /media/RPM-GPG-KEY-CentOS-7
对于光盘会自带密钥,再安装rpm包程序时,不会显示no key了。

验证:
(1)安装此组织的签名的程序时,会自动执行验证(导入密钥文件后,再安装rpm包时会自动验证);
(2)手动验证:rpm -K PACKAGE_FILE
例如:
]# rpm -K /media/Packages/zsh-5.0.2-7.el7.x86_64.rpm

数字签名(单向加密):采用非对称加密,一对秘钥(公钥,私钥),用私钥加密对应数据的特征码(加密程序包的校验码),用公钥解密;从而实现来源合法性验证和完整性验证的目的;

加密:
第一步:程序包制作者首先用单向加密,计算出程序包的特征码(校验码)出来,是定长输出,
第二步:然后再用自己的私钥来加密这个特征码,这叫数字签名,并且把加密后的特征码附加在程序包后面;

解密:
第一步:首先用程序包制作者的公钥解密特征码后,如果能解密则认为完成来源合法性验证;
第二步:然后,用同样的单向加密算法对程序包进行单向加密计算出一个特征码,用计算得出的特征码与解密的特征码比较,相同则完整性校验成功,不同则完整性校验失败;

注意:要确保获得安全的公钥!

rpm包数据库维护:

rpm包数据库位置:/var/lib/rpm
查询操作(包括安装、升级、卸载、查询):都是通过此处的数据库进行的;

获取重建帮助:
CentOS6:man rpm
CentOS7:man rpmdb
重建:
rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]

--initdb:初始化数据库,当前无任何数据库可实现初始化创建一个新的,当前有时不执行任何操作;如果事先不存在数据库,则新建,否则,不执行任何操作;

--rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;无论当前是否存在,直接重新创建数据库;

原文地址:https://www.cnblogs.com/tony3154/p/10125268.html