写在前面-本节命令总览:rpm –i[vh] [ -–test –-nodeps --replacepkgs –nosignature –nodigest ]
rpm –[UF] [vh] [--oldpackages --force] rpm –e[vh] [--allmatches –nodeps --test]
rpm –q[-p –a -f] [--rpovides --whatprovides --whatrequires ] [--changelog –l –i –c –d –R--scripts]
rpm –V rpm–initdb --rebuilddb
centos之rpm详解
RPM包管理的优点:
可以安装、删除、升级和管理软件。
可以把自己做的程序包打包成rpm包发布。
能利用签名GPG和MD5检测软件包的来源安全性和内容完整性。
依赖性的检查,解决由于不了解依赖性而导致软件安装完不能运行的棘手问题。
RPM的使用权限:
RPM软件的安装、删除、更新只有root权限才能使用;对于查询功能任何用户都可以操作;如果普通用户拥有安装目录的权限,也可以进行安装;
rpm包命名格式:
软件包的全名:name-version-release.arch.rpm
name:软件名字
version:软件的发行版本号,包括主版本号major,次版本号minor,发行号release
release.arch或者release.os.arch 是指rpm包的发行号。
release指rpm包的版本,os指使用操作系统,arch指使用CPU类型;注意os可以省略不写。
以下面两个例子讲解:
zabbix-2.4.6-2.el7.x86_64.rpm
redis-3.0.2-2.centos7.x86_x64.rpm
name:zabbix或redis
version:2.4.6或3.0.2
release:2
os:el7或centos7
arch:x86_x64
包格式:.rpm
拆包:把rpm包拆分成功能比较单一的支包,下面是支包的命名格式,只是在name后面加了个function
支包命名格式:name-function-VERSION-release.arch.rpm
例:zabbix-get-2.4.6-2.el7.x86_64.rpm
获取程序包的途径:
(1) 系统发行版的光盘或官方的文件服务器(或镜像站点),如下为国内几家比较可靠的站点:
http://mirrors.aliyun.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包,丰衣足食
建议:安装前请务必注意以下几点,否则早晚你会载一次坑
1、检查其合法性;
2、来源合法性;
3、程序包的完整性;
rpm包的依赖关系:
为了让程序性能更好,工程师把程序包做得短小精悍,功能专业且但一。但是由于结构比较简单,需要依赖其他程序包提供的环境才能运行起来,这就形成了依赖关系。
(1)安装:-i
rpm用法模板:rpm {-i|--install}[install-options] PACKAGE_FILE ...
GENERALOPTIONS:常用选项,
-v:verbose,安装时提供详细安装过程的信息
-vv:安装时提供更详细的输出信息
rpm -ivh PACKAGE_FILE ...
[root@yph7 ~]# rpm -ivh./zsh-5.0.2-7.el7_1.2.x86_64.rpm 警告:./zsh-5.0.2-7.el7_1.2.x86_64.rpm: 头V3RSA/SHA256 Signature, 密钥ID f4a80eb5: NOKEY 准备中... ################################# [100%] 正在升级/安装... 1:zsh-5.0.2-7.el7_1.2 ################################# [100%]
install-options:安装选项
-h:hash marks安装时输出进度条;每个#表示2%的进度;如上面例子所示。
--test:测试安装,检查并报告依赖关系及冲突消息等,其实并没有真正安装,可以理解为模拟安装;
[root@yph7 ~]#rpm -ivh --test zabbix-2.4.6-1.el7.x86_64.rpm 警告:zabbix-2.4.6-1.el7.x86_64.rpm: 头V4DSA/SHA1 Signature, 密钥ID 79ea5ed4: NOKEY 准备中... ################################# [100%] [root@yph7 ~]# rpm -qi zabbix ----------虽然已经提示安装成功,但只是测试,并没有安装 未安装软件包 zabbix [root@yph7 ~]# rpm -ivh --testbooth-0.2.0-31.1.x86_64.rpm 警告:booth-0.2.0-31.1.x86_64.rpm: 头V3RSA/SHA1 Signature, 密钥ID 17280ddf: NOKEY 错误:依赖检测失败: cluster-glue-libs>= 1.0.6 被 booth-0.2.0-31.1.x86_64 需要------有很多依赖关系 libplumb.so.2()(64bit)被 booth-0.2.0-31.1.x86_64 需要 libplumbgpl.so.2()(64bit)被 booth-0.2.0-31.1.x86_64 需要 pacemaker>= 1.1.8 被 booth-0.2.0-31.1.x86_64 需要
--nodeps:安装时忽略依赖关系;不过这样类似强制安装,即便安装成功也未必能使用,所以不建议这么做;
[root@yph7 ~]# rpm -ivh --nodepsbooth-0.2.0-31.1.x86_64.rpm
--replacepkgs:重新安装 -----------可以用来重新安装被删除的该程序包的配置文件
[root@yph7 ~]# rm -f /bin/zsh [root@yph7 ~]# ll /bin/zsh ls: 无法访问/bin/zsh: 没有那个文件或目录 ---------------/bin/zsh已被删除 [root@yph7 ~]# rpm -ivh --replacepkgszsh-5.0.2-7.el7_1.2.x86_64.rpm 警告:zsh-5.0.2-7.el7_1.2.x86_64.rpm: 头V3RSA/SHA256 Signature, 密钥ID f4a80eb5: NOKEY 准备中... ################################# [100%] 正在升级/安装... 1:zsh-5.0.2-7.el7_1.2 ################################# [100%] [root@yph7 ~]# ll /bin/zsh --------------------/bin/zsh又重新安装了回来 -rwxr-xr-x. 1 root root 711768 11月 3 21:49 /bin/zsh
--nosignature:不检查包签名信息,不检查来源合法性;
上个例子安装zsh时提示“警告:zsh-5.0.2-7.el7_1.2.x86_64.rpm:头V3 RSA/SHA256 Signature, 密钥ID f4a80eb5: NOKEY”,指没有验证rpm包的合法性,下面取消验证直接安装
[root@yph7 ~]# rpm -iv --nosignaturezsh-5.0.2-7.el7_1.2.x86_64.rpm 软件包准备中... -------------这次安装没有再提示警告信息。 zsh-5.0.2-7.el7_1.2.x86_64
--nodigest:不检查包完整性信息,直接安装,但很可能安装失败,或不能使用。除非自己已经确认包的完整性。
[root@yph7~]# rpm -ivh --nodigest zsh-5.0.2-7.el7_1.2.x86_64.rpm
(2)升级:-U -F
rpm{-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm{-F|--freshen} [install-options] PACKAGE_FILE ...
-U:升级或安装;可以用来升级rpm包,也可以用来安装rpm包。
rpm -UvhPACKAGE_FILE ...
[root@yph7 ~]# rpm –e zsh ---------- 先卸载zsh,下面在安装 [root@yph7 ~]# rpm -Uvzsh-5.0.2-7.el7_1.1.x86_64.rpm 用“rpm -Uv”来安装rpm包 警告:zsh-5.0.2-7.el7_1.1.x86_64.rpm: 头V3RSA/SHA256 Signature, 密钥ID f4a80eb5: NOKEY 软件包准备中... zsh-5.0.2-7.el7_1.1.x86_64 [root@yph7 ~]# rpm -Uvzsh-5.0.2-7.el7_1.2.x86_64.rpm ---------用“rpm -Uv”来升级zsh 警告:zsh-5.0.2-7.el7_1.2.x86_64.rpm: 头V3RSA/SHA256 Signature, 密钥ID f4a80eb5: NOKEY 软件包准备中... zsh-5.0.2-7.el7_1.2.x86_64 ---------把“…1.1.x86_64”升级到“1.2.x86_64”版本 zsh-5.0.2-7.el7_1.1.x86_64
-F:升级,只能用来升级,不能用来安装,如果程序没有安装,是不能拿“rpm -F”来升级的,升级方法与“rpm -U”相同
rpm -Fvh PACKAGE_FILE ...
[root@yph7 ~]# rpm -Fv zsh-5.0.2-7.el7_1.2.x86_64.rpm 警告:zsh-5.0.2-7.el7_1.2.x86_64.rpm: 头V3RSA/SHA256 Signature, 密钥ID f4a80eb5: NOKEY 软件包准备中... zsh-5.0.2-7.el7_1.2.x86_64 ---------从1.1版本升级到1.2版本 zsh-5.0.2-7.el7_1.1.x86_64
--oldpackage:降级;如果升级后发现新版本令自己十分不满意,可以用来回归旧版本。
[root@yph7 ~]# rpm -Uvh --oldpackage zsh-5.0.2-7.el7_1.1.x86_64.rpm-----把1.2版本降级到1.1 警告:zsh-5.0.2-7.el7_1.1.x86_64.rpm: 头V3RSA/SHA256 Signature, 密钥ID f4a80eb5: NOKEY 准备中... ################################# [100%] 正在升级/安装... 1:zsh-5.0.2-7.el7_1.1 ################################# [ 50%] 正在清理/删除... 2:zsh-5.0.2-7.el7_1.2 ################################# [100%]
--force:强制升级,如果升级后依赖关系不能满足,就不能正常升级,可以强制升级。
[root@yph7 ~]# rpm -Uvh --forcezsh-5.0.2-7.el7_1.2.x86_64.rpm 强制从1.1版本升级到1.2版本
注意:(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核;
(2) 如果某原程序包的配置文件安装后曾被修改过,升级时,会认为你修改过的信息是很重要的,所以新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;
(3)卸载 –e
rpm {-e|--erase}[--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...
[root@yph7 ~]# rpm -evh zsh 准备中... ################################# [100%] 正在清理/删除... 1:zsh-5.0.2-7.el7_1.2 ################################# [100%]
--allmatches:卸载所有匹配指定名称的程序包的所有版本,因为有的程序包可能多个版本并存,这样可以同时卸载;
[root@yph7~]# rpm -evh --allmatches zsh
--nodeps:卸载时忽略依赖关系,不管三七二十三,也不顾后果是否严重,就是卸载。
[root@yph7 ~]# rpm -evh --nodeps zsh
--test:测试卸载,dry run模式,只是模拟测试,并没有正真卸载
[root@yph7 ~]# rpm -e --test zsh [root@yph7 ~]# rpm -ql zsh-------------并没有真正卸载 /bin/zsh /etc/skel/.zshrc /etc/zlogin
(4)查询:-q
rpm {-q|--query}[select-options] [query-options]
select-options选择选项
rpm -q PACKAGE_NAME:查询指定的程序包是否已经安装,及其版本;
[root@yph7 ~]# rpm -q zsh
zsh-5.0.2-7.el7_1.2.x86_64
-a,--all:查询所有已经安装过的包;
[root@yph7 ~]# rpm –qa ----------能列出电脑上所有安装过的包,太多了我就不列出了
[root@yph7 ~]# rpm -qa | grep "^z" ----列出已经安装的并且以z开头的程序包 zip-3.0-10.el7.x86_64 zenity-3.8.0-4.el7.x86_64 zlib-1.2.7-13.el7.x86_64
-f FILE:查询指定的文件由哪个程序包安装生成;
[root@yph7 ~]# rpm -q -f /usr/share/zsh/5.0.2/scripts
zsh-5.0.2-7.el7_1.2.x86_64
-p,--package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作;具体查询什么后面会详细演示。
[root@yph7 ~]# rpm -q -p zabbix-2.4.6-1.el7.x86_64.rpm 警告:zabbix-2.4.6-1.el7.x86_64.rpm: 头V4DSA/SHA1 Signature, 密钥ID 79ea5ed4: NOKEY zabbix-2.4.6-1.el7.x86_64
query-options查询选项
--changelog:查询rpm包的changlog;
[root@yph7 ~]# rpm -q --changelog zsh * 一 10月 262015 Kamil Dudka <kdudka@redhat.com> - 5.0.2-7.el7_1.2 - fix SIGSEGV of the syntax check in ksh emulationmode (#1222867) ………………………………………………………..还有很多,不一一列举
-l,--list:程序安装生成的所有文件列表;
[root@yph7 ~]# rpm -ql bash | wc -l
109 -----------------------------可以看到bash程序包一共生成109个文件
-i,--info:程序包相关的信息,版本号、大小、所属的包组,等;
[root@yph7 ~]# rpm -q -i zsh Name :zsh Version :5.0.2 Release :7.el7_1.2 Architecture: x86_64 ………………………………..
-c,--configfiles:查询指定的程序包提供的配置文件;
[root@yph7 ~]# rpm -q -c zsh /etc/skel/.zshrc /etc/zlogin /etc/zlogout -----------------------还有很多,不一一列举
-d,--docfiles:查询指定的程序包提供的文档;
[root@yph7 ~]# rpm -q -d zsh /usr/share/doc/zsh-5.0.2/BUGS /usr/share/doc/zsh-5.0.2/CONTRIBUTORS-----------------------还有很多,不一一列举
--provides:列出指定的程序包提供的所有的CAPABILITY;
[root@yph7 ~]# rpm -q --provides zsh config(zsh) = 5.0.2-7.el7_1.2 zsh = 5.0.2-7.el7_1.2 zsh(x86-64) = 5.0.2-7.el7_1.2
--whatprovidesCAPABILITY:查询指定的CAPABILITY由哪个程序包提供;
[root@yph7 ~]#rpm -q --whatprovides 'config(zsh)' zsh-5.0.2-7.el7_1.2.x86_64 [root@yph7 ~]#rpm -q --whatprovides config\(zsh\) zsh-5.0.2-7.el7_1.2.x86_64
--whatrequiresCAPABILITY:查询指定的CAPABILITY被哪个包所依赖;
[root@yph7 ~]# rpm -q --whatrequires bash | wc -l
9 -------------一共有9个依赖bash功能
-R,--requires:查询指定的程序包的依赖关系;
[root@yph7~]# rpm -q -R zsh
--scripts:查看程序包自带的脚本片断;
[root@yph7~]# rpm -q --scripts zsh
查询未安装包的信息:
-qpi PACKAGE_FILE,查询未安装的程序包的版本,大小,包组等信息
[root@yph7 ~]# rpm -qpi zabbix-2.4.6-1.el7.x86_64.rpm Name :zabbix Version :2.4.6 Release :1.el7 Architecture: x86_64 Install Date: (not installed)
-qpl PACKAGE_FILE, 查询未安装包能够生成的文件列表
[root@yph7 ~]# rpm -qpl zabbix-2.4.6-1.el7.x86_64.rpm 警告:zabbix-2.4.6-1.el7.x86_64.rpm: 头V4DSA/SHA1 Signature, 密钥ID 79ea5ed4: NOKEY /etc/zabbix /usr/lib/tmpfiles.d/zabbix.conf
-qpcPACKAGE_FILE, ... 查询未安装包能够生成的配置文件
[root@yph7 ~]#rpm -qpc booth-0.2.0-31.1.x86_64.rpm
警告:booth-0.2.0-31.1.x86_64.rpm:头V3 RSA/SHA1 Signature, 密钥ID 17280ddf: NOKEY
/etc/booth/booth.conf.example
(5)校验:-V
rpm {-V|--verify}[select-options] [verify-options]
[root@yph7 ~]#rpm -V zsh [root@yph7~]# -------------------没有消息,说明没有不安全的信息 [root@yph7 ~]#file /usr/share/zsh/5.0.2/functions/zfget---- 查看一下zsh的一个文件,发现是text类型 /usr/share/zsh/5.0.2/functions/zfget:ASCII text [root@yph7 ~]#vim /usr/share/zsh/5.0.2/functions/zfget ------就拿vim 修改一下里面内容 [root@yph7 ~]#rpm -V zsh S.5....T. /usr/share/zsh/5.0.2/functions/zfget --------再次检测就检测出问题了
出现S:说明大小改变 5:md5特征码变化 T: Tmtime改变
具体检测结果表示的信息:
S: file Size differs文件大小发生变化
M: Mode differs (includes permissions and file type)权限或文件类型发生变化
5 :digest (formerly MD5 sum) differs。 md5码发生变化
D: Device major/minor number mismatch 设备主次设备号不匹配
L: readLink(2) path mismatch
U: User ownership differs 属主变化
G: Group ownership differs 属组变化
T: mTime differs 最近一次修改时间mtime变化
P: caPabilities differ 能力发生变化
--nofiles 。Don't verify any attributes of package files.不检查文件的参数
[root@yph7 ~]# rpm -V --nofiles zsh
[root@yph7 ~]# -------刚才我修改的那个文件就没有显示出来
--nodigest Don't verify package or header digests whenreading.不检测完整性
--nodeps Don't verify dependencies of packages.不检测依赖关系
--nosignature 不检测签名信息,即来源合法性
包来源合法性验正和完整性验正:
来源合法性验正:
开发者用单向加密提取程序包的特征码,然后用对称加密方式来加密程序包特征码。开发者私钥加密特征码,用户可以拿与之配对的公钥配对,配对成功说明这个特征码是原版的,这个文件也就是原版的。
完整性验正:
验证来源合法性成功后,再来验证内容完整性。用户拿与开发者相同的单向加密算法提取程序包的特征码,然后比较自己计算出的特征码与用公钥解密出的特征码是否相同,如果相同说明程序包内容是完整的。如果程序包内容被篡改,特征码必定会改变,这样一来,就能说明这个包是被人修改过的。
获取并导入信任的包制作者的公钥:
公钥的位置:以centos7为例,一般装完系统后,在下面目录下有密钥。
[root@yph7 ~]# ls/etc/pki/rpm-gpg/
RPM-GPG-KEY-CentOS-7
对于CentOS发行版来说,导入公钥的方法如下:
[root@yph7 ~]#rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
导入公钥后再安装时程序时就不会再警告了
[root@yph7 ~]#rpm -ivh zsh-5.0.2-7.el7_1.1.x86_64.rpm 准备中... #################################[100%] 正在升级/安装... 1:zsh-5.0.2-7.el7_1.1 #################################[100%]
导入公钥后手动验正rpm包的合法性和完整性:
[root@yph7 ~]#rpm -K zsh-5.0.2-7.el7_1.2.x86_64.rpm
zsh-5.0.2-7.el7_1.2.x86_64.rpm:rsa sha1 (md5) pgp md5 确定
pgp来源合法性没问题;md5确定则完整性也没问题
(6)数据库重建:
rpm管理器数据库路径:/var/lib/rpm/几乎所有的查询操作,都是通过此处的数据库进行。
例如卸载某程序时,这个数据库就记录着要卸载的文件在哪个路径下。
若要获取相关帮助,用下列方法:
CentOS 6:man rpm
CentOS 7:man rpmdb
rpm{--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
--initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;当前有时不执行任何操作;
[root@yph7 rpm]# cd /var/lib/rpm [root@yph7 rpm]# rpm –initdb [root@yph7 rpm]# ls Basenames __db.001 __db.003 Group Name Packages Requirename Sigmd5 Conflictname __db.002 Dirnames Installtid Obsoletename Providename Sha1header Triggername
--rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;
[root@yph7 rpm]# rpm --rebuilddb [root@yph7 rpm]# ls ----------------发现少了一些文件 Basenames Dirnames Installtid Obsoletename Providename Sha1header Triggername Conflictname Group Name Packages Requirename Sigmd5
[root@yph7 rpm]# rpm --initdb [root@yph7 rpm]# ls -----------------少的文件又回来了 Basenames __db.001 __db.003 Group Name Packages Requirename Sigmd5 Conflictname __db.002 Dirnames Installtid Obsoletename Providename Sha1header Triggername
rpm可以自带脚本;
preinstall:安装过程开始之前运行的脚本,%pre , 不执行此脚本用--nopre
postinstall:安装过程完成之后运行的脚本,%post , 不执行此脚本用--nopost
preuninstall:卸载过程真正开始执行之前运行的脚本,%preun, 不执行此脚本用--nopreun
postuninstall:卸载过程完成之后运行的脚本,%postun , 不执行此脚本用--nopostun
四类脚本都不执行:用--noscripts