rpm命令详解
程序包的升级:
升级rpm包:
格式:rpm{-U|--upgrade} [install-options] PACKAGE_FILE ...
选项:
-U:表示升级或安装
-F:仅是升级
升级来讲额外的常用选项:
--oldpackage:降级;
(为什么要降级?
当一个程序包升级之后发现各种不兼容,发现各种不好用,因此这时我们就进行回滚操作。将程序在还原至原来的版本。)
--force:强制升级;
(为什么要强制升级?
有些时候我们升级到较新的版本时,因为依赖关系的问题,很有可能存在这样的现状,老版本的程序包被其他的程序包所依赖,但是新的程序包不能满足此前的依赖关系,因为他依赖的功能较老程序有,新版本中程序中没有了,给换了,所以现在升级会出现冲突,甚至会报错,因为升级之后可能会影响到依赖的完整性,这时候我们如果要想忽略这个历依赖关系强制升级,那么我们就需要强制升级。)
升级rpm软件包的真正的用法:
rpm -Uvh PACKAGE_FILE...... //后面的省略号表示可以同时安装多个包
或
rpm -Fvh [PACKAGE_FILE......
注意:上面的两个选项-U和-F之间的区别就是,-U是当程序包没有则执行安装操作,有则执行升级操作;而选项-F是原来的程序包有就执行升级,没有则不进行任何操作。
注意:
(1)不要对内核进行升级操作;
(比方说,就想内核4.0的版本,在升级之前必须要重启系统,所以我们一旦对内核进行升级操作,意味着我们就需要重启系统,才能启用新内核,或者是我们即便是现在不重启,那么下一次重启也会启用新内核,万一新内核与我们的版本不兼容怎么办?是不是启动不了了?这么这个时候我们应该怎样办呢?我们就需要进入救援模式了。所以不建议对内核进行升级操作。那么不升级,我有希望测试新版本怎么办?
那么有一个办法,linux支持多内核版本并存,因此我们打算升级内核的时候,我们可以直接进行安装新内核。)
(2)如果某原程序包的配置文件安装后曾被修改过,那么新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名后提供保存,重命名的格式:FILENAME.rpmnew这个表示:原来的文件名字后面跟上".rpmnew"
升级程序包的演示操作:(在centos7上)
(1)我们去阿里云的镜像网站上下载一个程序包,我们就升级上次安装的zsh他的版本是zsh-4.3.11-4.el6.centos.2.x86_64.rpm,查看现在安装的程序版本,我们可以在命令行中使用命令"rpm -ql 程序前一个字符"然后tab键补全,我们就能查看我们安装的某程序的版本。
我们进入"mirrors.aliyun.com"这个网站,然后进入下面的目录:
http://mirrors.aliyun.com/centos/7.2.1511/updates/x86_64/Packages/找到zsh的最新版本进行下载。
(2)我们通过Xshell这个远程连接工具将这个程序包复制到linux系统上。
我们将这个程序包复制到root用户的家目录。
第二当我们的系统是linux系统,我们在将"zsh"程序下载后,然后如果是需要将这个程序从一个主机发送到另一个主机上进行安装,那么我们需要使用Xshell工具,在命令行中执行一下命令:
[root@centos6 ~]# scp /root/zsh-5.0.2-14.el7_2.2.x86_64.rpm 192.168.178.131:/root/
The authenticity of host '192.168.178.131(192.168.178.131)' can't be established.
RSA key fingerprint is64:8c:31:ff:e7:e2:58:31:1e:b7:b6:f2:75:fc:e0:8a.
Are you sure you want to continueconnecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added'192.168.178.131' (RSA) to the list of known hosts.
root@192.168.178.131's password: 需要输入对方的主机的密码
zsh-5.0.2-14.el7_2.2.x86_64.rpm 100% 2434KB 2.4MB/s 00:00
[root@centos6 ~]#
如果是我们将这个程序包拷贝到对方主机上的某个普通用户的家目录下:则对方主机IP前面需要加上这个普通用户的名称,并用@连接,复制普通用户的家目录,我们要注意是/home/USERNAME
[root@centos6 ~]# scp zsh-5.0.2-14.el7_2.2.x86_64.rpm dong@192.168.178.131:/home/dong
dong@192.168.178.131's password:
zsh-5.0.2-14.el7_2.2.x86_64.rpm 100% 2434KB 2.4MB/s 00:00
[root@centos6 ~]#
(3)升级zsh
[root@centos7 ~]# rpm -Uvh zsh-5.0.2-14.el7_2.2.x86_64.rpm
警告:zsh-5.0.2-14.el7_2.2.x86_64.rpm: 头V3 RSA/SHA256Signature, 密钥 ID f4a80eb5: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:zsh-5.0.2-14.el7_2.2 ################################# [ 50%]
正在清理/删除...
2:zsh-5.0.2-14.el7 ################################# [100%]
[root@centos7 ~]# rpm -q zsh
zsh-5.0.2-14.el7_2.2.x86_64
[root@centos7 ~]#
卸载rpm包:
格式:rpm{-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test]PACKAGE_NAME ...
大多数情况下选项"-e"都能完成卸载操作。
注意:我们在安装,升级和查询的时候后面是PACKAGE_FILE,这是时安装程序包的路径;但是卸载的时候是PACKAGE_NAME这是代表程序包的名称。
选项:
--allmatches:表示卸载所有匹配指定名称的程序包的各版本;
--nodeps:忽略依赖关系
--test:测试卸载,dry run干跑模式;
查询:是一个非常重要的功能
格式:
rpm {-q|--query} [select-options][query-options]
rpm -q 后面跟上[select-options]或[query-options]的子选项
有两类选项:
注意下面的各个选项都要与"-q"选项结合使用
(1)[select-options]的常用选项:
PACKAGE_NAME:查询时,直接指明程序包名。这表示查询指定的程 序包是否已经安装及其版本。
-a,--all:查询所有已经安装过的包,这是就不需要给包了。
(当我们想查询一个包是否已经安装,但是我们只记得其中 的几个字符,那么这个"-a"选项就特别有用,我们就可以 结合"grep"命令来进行查找。)
-f,--file后面跟上一个文件路径:这表示查询指定文件是由哪个程序 包生成的。
-g,--group:表示查询指定的包组中,包含了那些程序包。
-p,--package:表示对未安装的程序包进行查询操作,一般查询什么, 他需要跟 [query-options][select-options]中的选项结合 起来使用。
--whatprovidesCAPABILITY:查询指定的功能,是由哪个程序包安装。
--whatrequiresCAPABILITY:查询指定的功能,被谁所依赖。
(2)[query-options]常用选项:
--changelog:查询rpm包的changelog;
-l,--list:程序安装生成的所有文件列表;
-i.info:程序包相关的信息,版本号,大小,所属的包组,等;
-c, --configfiles:查询指定的程序包配置文件;
-d, --docfiles:查询指定的程序包提供的文档;
--provides:列出指定的程序包提供的所有的CAPABILITY(功能)
-R, --requires:表示查询指定程序包的依赖关系;
--scripts:查询指定的程序包自带的脚本片段;
用法:
-qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE.
-qpi PACKAGE_FILE, -qpl PACAGE_FILE, -qpc PACKAGE_FILE,.......
演示:"--provides"和"whatprovides"选项的用法:
[root@centos7 ~]# rpm -q --provides bash
/bin/bash
/bin/sh
bash = 4.2.46-19.el7
bash(x86-64) = 4.2.46-19.el7
config(bash) = 4.2.46-19.el7
[root@centos7 ~]# rpm -q --whatprovides bash
bash-4.2.46-19.el7.x86_64
[root@centos7 ~]# rpm -q --whatprovides 'config(bash)' //因为括号在shell中有特殊 的意义,所以使用单引号引起来 表示强引用。
bash-4.2.46-19.el7.x86_64
[root@centos7 ~]#
校验:
格式:
rpm{-V|--verify} [select-options] [verify-options]
执行校验操作时,他们表现的意义是什么?
--verify test:
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 //表示最近的时间戳发生改变
P caPabilities differ //表示开发功能改了。
[root@centos7 ~]# rpm -ivh zsh-5.0.2-14.el7_2.2.x86_64.rpm
警告:zsh-5.0.2-14.el7_2.2.x86_64.rpm: 头V3 RSA/SHA256Signature, 密钥 ID f4a80eb5: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:zsh-5.0.2-14.el7_2.2 ################################# [100%]
[root@centos7 ~]# rpm -V zsh //校验时我们用大写"-V"选项,校验没有任何信息输 出,说明我们这个程序包安装成功
[root@centos7 ~]#
[root@centos7 ~]# rpm -ql zsh //查看zsh安装了多少个文件
[root@centos7 ~]# file /usr/share/zsh/5.0.2/functions/zfparams //随便找一个文件看看是什 么格式
/usr/share/zsh/5.0.2/functions/zfparams: ASCII text
[root@centos7 ~]# vim /usr/share/zsh/5.0.2/functions/zfparams //编辑这个文件,然后在里 面仅仅是加一个#
[root@centos7 ~]# rpm -V zsh //再次进行校验,发现就报错了
S.5....T. /usr/share/zsh/5.0.2/functions/zfparams // S.5....T. 这里面的每一个点表示这一个属性,点表示这个属性没有被修改过,如果这个属性被更改了就表示这个属性的特性,或者那个字符,S就表示大小的意思,S出现了就表示大小发生变化了,没出现就表示大小没有发生变化,比方说我们加了一个字符,就表示大小发生变化了,如果是我们仅仅是改了一个字符呢,就可能是大小没有改变,但是任何信息改了,那么他的MD5码就发生改变了,这个5就表示数据指纹信息,
(通过上面的演示例子我们发现,校验的作用:当我们安装一个程序包时,我们发现某个文件被修改了,但是我们自己确认,我们从来没有改过,其实我们到现在为止我们应该知道,在linux中有一个重要的法则,没有消息就是最好的消息。他没有告诉我们有任何错,这表示我们再安装一些程序是成功了,但如果不是加"-v小写"出现的信息,我就要看一下,通常必须引起注意,)
包来源合法性验证和完整性验证:
来源合法性验证:
完整性验证:
获取并导入信任 的包制作者的秘钥:
(其实这个公钥文件我们也可以去目录"/etc/pki/rpm-gpg"下找,因为这个在我们安装安装系统后,会自动将秘钥复制到这个目录下,)
对于cenots发行版来讲:导入文件:
rpm --import /etc/pki/rpm-gpg/ RPM-GPG-KEY-CentOS-7
验证:
(1)安装次组织签名的程序时,会自动执行验证:
(2)手动验证:rpm -K PACKAGE_FILE
所有的数字签名都是用自己的私钥去加密自己程序包对应的数字特征码。
数字签名可以实现两个功能:
(1)来源合法性进行验证
(2)包的完整性进行验证
我们也发现,单向加密和私钥加密并不是对文件进行保密。
(我们现在拿到一个程序包,那么怎样去验证这个程序包是合法的?
首先这个程序包的制作者首先要信任他,这是第一点,那么这个信任的机构做了程序包以后,要在这个程序包上加盖自己的印签,在程序上这就叫数字签名,)
数字签名:
(那么数字签名是怎样实现的呢?
我们之前讲过一个加密方式叫非对称加密,就是他的秘钥是成对出现,一个叫公钥一个叫私钥,公钥加密的只能使用与之配对的私钥解密,反之亦然,那么一个组织或个人在制作一个程序包以后,用自己的私钥去签名,放在这个包后面,公钥就是公开的,所以我们拿着这个公钥能够解密出来,就可以说这就是,那我们加密的是什么数据呢?我们不能加密整个文件,这样人们就看不见这个文件了,这里纯粹就是签名,我们加密的是程序包的校验码,什么是校验码?校验码就是我们先利用单向加密将这个程序包的特征码算出来,我们知道特征码是固定的长度,不管我们的包有多大,特征码都那么长,
所以包的制作者先用单向加密将包的特征码计算出来,定长输出,然后再用自己的私钥去加密这个特征码,这就叫数字签名,并把这个特征码附加在包后面,
那谁能解密?拿到公钥去解密,所以这里的私钥不是处于加密目的的,而是验证目的的,用公钥加密是做来源身份验证的,那公钥解密出来的数据有用吗?
当然有用,我们可以用同样的算法去计算这个文件的特征码,然后跟这个解密出来的特征码进行比对,一样就表示包没有被别人改过。
这里其实我们要明白,当我们只做的程序包,用单向加密算出特征码后,然后再用我们的私钥要将这个特征码进行加密,那么第三者是可以使用我们的公钥将我们的加密的特征码进行解密的,第三者可以更改我们的程序包,并且他也可以更改我们的特征码,但是为什么一般不会改呢,因为一旦改了特征码,他在加密只能使用他自己的私钥进行加密,那么我们的客户用我们的公钥去解密时,就发现这个包不是我们发的,所以就不使用我们的包了,所以很简单一般特征码是不被改变的。)
合法获得公钥其实是最重要的一步:
其实这一步很难,世界上没有万无一失的安全性,互联网上其实是通过CA来实现的,CA叫签证机构,或者叫第三方证书颁发机构,我们现在秩序知道我们需要假设通过一个合法的途径来拿到公钥。至于怎样拿到在后面细讲。
完整性验证:
如果只是对rpm包进行验证的话,我们只需将rpm包的公钥导入进去即可,对于光盘上rpm包的公钥就在光盘上,我们切换到光盘的挂载目录下,ls命令会看到一个文件" RPM-GPG-KEY-CentOS-7"
那么只需将这个文件导入rpm 包后,以后在安装程序包时就不会出现应该说"NOKEY"了
演示操作:
[root@centos7 ~]# rpm -ivh zsh-5.0.2-14.el7_2.2.x86_64.rpm
警告:zsh-5.0.2-14.el7_2.2.x86_64.rpm: 头V3 RSA/SHA256Signature, 密钥 ID f4a80eb5: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:zsh-5.0.2-14.el7_2.2 #################################[100%]
[root@centos7 ~]# rpm -e zsh
[root@centos7 ~]# rpm --import /media/RPM-GPG-KEY-CentOS-7 //导入用"--import"选项
[root@centos7 ~]# rpm -ivh zsh-5.0.2-14.el7_2.2.x86_64.rpm //再次安装就不会出现NOKEY
准备中... #################################[100%]
正在升级/安装...
1:zsh-5.0.2-14.el7_2.2 ################################# [100%]
[root@centos7 ~]#
上面是自动进行校验操作,下面我们也可以进行手动校验操作:
[root@centos7 ~]# rpm -K zsh-5.0.2-14.el7_2.2.x86_64.rpm //用选项大写"-K"
zsh-5.0.2-14.el7_2.2.x86_64.rpm: rsa sha1(md5) pgp md5 确定 //pgp:来源合法性;MD5包 完整性认证之前要将公钥 导入
[root@centos7 ~]#
数据库重建:
这个数据库是不能随便破坏或者手动进行测试的。
我们知道使用命令"rpm -qa"会显示我们安装了那些程序包,或者使用"rpm -ql 程序名"会显示这个程序安装时产生的文件,那么我们就想,他是怎样知道我们的程序安装了那些文件,这个rpm正是通过本地的记录的一个数据库来定义的。
对于rpm这个命令来讲他的数据库就是"/var/lib/rpm"
rpm管理器数据库路径:/rpm/lib/rpm
查询操作:通过此处的数据库进行。
获取帮助:
CentOS6:man rpm
CentOS7:man rpmdb
以CentOS7为例:
rpm {--initdb|--rebuilddb} [-v] [--dbpathDIRECTORY] [--root DIRECTORY]
--initdb:初始化数据库,当前无任何数据库可初始化创建一个新的;当前 有时不执行任何操作;
--rebuilddb:重新构建,通过读取当前系统上所有已经安装的程序包进行重 新创建;
--dbpath DIRECTORY:表示地址创建数据库的路径
演示在指定的路径下创建rpm数据库
[root@centos7 ~]# mkdir /tmp/rpm
[root@centos7 ~]# rpm --initdb --dbpath=/tmp/rpm
[root@centos7 ~]# ls /tmp/rpm/
Basenames __db.002 Group Obsoletename Requirename Triggername
Conflictname __db.003 Installtid Packages Sha1header
__db.001 Dirnames Name Providename Sigmd5
[root@centos7 ~]#
[root@centos7 ~]# rpm --rebuilddb --dbpath=/tmp/rpm
[root@centos7 ~]# ls /tmp/rpm/ //重建后我们发现__db.002,__db.003,__db.001这些 文件没有了,其实这些文件是进行事物操作的。
Basenames Group Obsoletename Requirename Triggername
Conflictname Installtid Packages Sha1header
Dirnames Name Providename Sigmd5
[root@centos7 ~]#
博客作业:rpm包管理功能全解;