首页 > 代码库 > 软件包管理RPM
软件包管理RPM
RPM
程序包管理器,可实现对程序包的安装、更新、查询和卸载操作,应用广泛
下面通过实际操作来更好的理解RPM的功能
安装程序:
-i //安装数据包参数
-v //显示安装过程
-vv //显示更详细的安装信息
-h //配合-v更加直观的显示程序安装过程,但是在程序卸载时不能使用
[root@CentOs6 ~]#rpm -ivh /media/CentOS_6.9_Final/Packages/tree-1.5.3-3.el6.x86_64.rpm Preparing... ########################################### [100%] 1:tree ########################################### [100%] //显示安装进度条
rpm要安装程序包必须得指定程序包的具体路径,否则无法安装
rpm包管理器有一个非常重要的数据库,/var/lib/rpm
程序包名称及版本
包之间的依赖关系
包安装后的文件路径及校验码信息
这些信息都存储在rpm的数据库中,一旦数据库被破坏,包管理就会受到影响,
不仅rpm不能用,yum也不能用
如果我们仅仅是想测试下某个程序包能不能安装,可以使用以下参数
--test //测试安装,并不真正安装
[root@CentOs6 Packages]#rpm -ivh --test tree-1.5.3-3.el6.x86_64.rpm warning: tree-1.5.3-3.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] [root@CentOs6 Packages]#echo $? //通过$?来验证上述命令是否执行成功,0表示成功,非0表示失败 0 [root@CentOs6 Packages]#
测试安装完成,但是有一个警告,程序包缺少密钥
其实每个程序包安装时RPM都会对其进行身份验证,如果没有导入密钥,RPM认为数据包无法验证就会弹出告警信息。不过这样也不影响安装,如果想要取消这个告警,可以尝试下述方法
[root@CentOs6 ~]#cd /media/CentOS_6.9_Final/ [root@CentOs6 CentOS_6.9_Final]#rpm --import RPM-GPG-KEY-CentOS-6
因为我是挂了光盘,所以进入光盘所在的目录下,找到RPM-GPG-KEY-CentOS-6这个密钥文件,然后导入即可
导入完成之后,再安装程序就不会提示warn警告,我是在centos6下操作,如果是centos7就要进入/run/media/root/CentOS\ 7\ x86_64/这个目录下
当然还有一种自欺欺人的方法,就是不导入密钥,使用参数--nosignature忽略这个警告
因为我使用的是centos6的光盘,GPG-KEY密钥文件也是这个光盘上的,也就是说,这个光盘的rpm程序包经过GPG这个密钥文件再加上hash算法计算,会得到签名信息,也就是一串摘要信息,然后,通过这些摘要信息与rpm数据库对应的校验码进行比较,如果二者一致,说明此数据包信息完整,如果不一致说明此数据包有问题。
所以,如果我从centos7上拷贝一份tree的程序包,那用centos6的密钥文件进行计算,其结果肯定是跟数据库不一致的
已经在centos6上导入了GPG-KEY文件
[root@CentOs6 ~]#rpm -K tree-1.6.0-10.el7.x86_64.rpm //从centos7拷贝的程序包 tree-1.6.0-10.el7.x86_64.rpm: RSA sha1 ((MD5) PGP) md5 NOT OK (MISSING KEYS: (MD5) PGP#f4a80eb5) [root@CentOs6 ~]#rpm -K /misc/cd/Packages/tree-1.5.3-3.el6.x86_64.rpm /misc/cd/Packages/tree-1.5.3-3.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
-K 验证程序包的完整性
查询程序信息:
-q 是rpm查询必备的参数,需要与其他参数配合使用
-a 查看所有已经安装过的程序
-c 查看程序的配置文件
[root@CentOs6 ~]#rpm -qc bash /etc/skel/.bash_logout /etc/skel/.bash_profile /etc/skel/.bashrc
-f 查询指定文件由哪个程序包安装
[root@CentOs6 ~]#rpm -qf /bin/ls coreutils-8.4-46.el6.x86_64
-l 列出程序包安装后所生成的所有文件
-p 针对还未安装的程序包做查询操作
[root@CentOs6 Packages]#rpm -qpl tree-1.5.3-3.el6.x86_64.rpm //前提已经把tree卸载了 /usr/bin/tree /usr/share/doc/tree-1.5.3 /usr/share/doc/tree-1.5.3/LICENSE /usr/share/doc/tree-1.5.3/README /usr/share/man/man1/tree.1.gz
--whatprovides 指定功能由哪些程序包提供
--whatrequires 指定功能被哪些程序包所依赖
[root@CentOs6 Packages]#rpm -q --whatprovides bash bash-4.1.2-48.el6.x86_64 [root@CentOs6 Packages]#rpm -q --whatrequires bash mysql-5.1.73-8.el6_8.x86_64 initscripts-9.03.58-1.el6.centos.x86_64 dracut-004-409.el6_8.2.noarch rsyslog-5.8.10-10.el6_6.x86_64 cronie-1.4.4-16.el6_8.2.x86_64 autofs-5.0.5-132.el6.x86_64 lvm2-2.02.143-12.el6.x86_64
这两个参数记起来有点费劲,翻译一下就很容记忆了,这两个参数用来查找程序包
--whatprovides 什么程序包提供指定功能,打印的就是提供此功能的程序包
--whatrequires 什么程序包需要指定功能,打印的就是依赖此功能的程序包
-i 查询程序信息,非常非常详细
[root@CentOs6 Packages]#rpm -qi gcc Name : gcc Relocations: (not relocatable) Version : 4.4.7 Vendor: CentOS Release : 18.el6 Build Date: Wed 22 Mar 2017 12:27:30 AM CST Install Date: Fri 04 Aug 2017 10:16:33 PM CST Build Host: c1bm.rdu2.centos.org Group : Development/Languages Source RPM: gcc-4.4.7-18.el6.src.rpm Size : 19497604 License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions Signature : RSA/SHA1, Thu 23 Mar 2017 11:01:10 PM CST, Key ID 0946fca2c105b9de Packager : CentOS BuildSystem <http://bugs.centos.org> URL : http://gcc.gnu.org Summary : Various compilers (C, C++, Objective-C, Java, ...) Description : The gcc package contains the GNU Compiler Collection version 4.4. You‘ll need this package in order to compile C code.
卸载程序:
-e 卸载程序
[root@CentOs6 ~]#rpm -e gcc error: Failed dependencies: gcc is needed by (installed) systemtap-devel-2.9-7.el6.x86_64 gcc = 4.4.7-18.el6 is needed by (installed) gcc-c++-4.4.7-18.el6.x86_64 gcc = 4.4.7-18.el6 is needed by (installed) gcc-gfortran-4.4.7-18.el6.x86_64 gcc = 4.4.4 is needed by (installed) libtool-2.2.6-15.5.el6.x86_64
卸载gcc这个程序失败,因为还有很多依赖包,所以要想卸载gcc必须先把这些依赖包卸载,但这样做不现实
依赖关系,是rpm最大的问题,在安装、卸载程序时都有可能会出现这样的问题
所以为了解决依赖性的问题,又有了yum这个工具,yum是rpm的前端工具,可以自动的识别依赖关系并且执行安装或卸载操作
yum虽然很方便,但还是基于rpm工作的:
yum客户端从yum源下载repodata也就是程序包的元数据列表,并匹配要下载的程序包及其依赖包,然后向yum源发出请求,yum源会将请求的程序包发给客户端,然后yum客户端再把程序包及其依赖包一起进行安装,整个过程对用户透明。yum大概的工作原理就是这样。
以上是我自己的一些学习总结,如果哪里有错误,还请不吝赐教!
本文出自 “高攀” 博客,谢绝转载!
软件包管理RPM