Linux软件包的管理--RPM包管理器
在Linux中如何安装、升级、卸载软件,是我们日常运维中重要的组成部分。接下来一CentOS6系统为例,讲解如何使用 RPM 包管理器,yum包管理器以及源码的方式来管理我们的软件包。
一、相关的背景知识
许多程序的源程序,例如使用C语言编写的源代码,要经过预处理,编译,汇编,链接才能生成真正的可执行程序(二进制),才可以使用。为了简化这样的过程,就出现了所谓的包管理器。它出现的目的是:将编译好的程序打包成一个文件或有限的几个文件,可用于实现安装、卸载、升级、查询等功能。
一个包管理器应该具有如下组成部分:
1、数据库:这里面包括了 软件名、版本、依赖关系、功能描述、安装生成的各文件的路径、和校验软件来源和数据完整性的校验码。
2、程序的组成清单:这里最主要的是软件在安装、卸载前后所运行的脚本。
安装程序的时候为什么会出现依赖性?
由于Linux的程序或者说是工具都是由其他小程序或小工具组成,这是Linux的特性之一。正是由于这个特性决定了我们在安装一个软件包的时候,可能会依赖其他程序的库文件和头文件。
# 在Linux中使用 ldd 命令来查看一个二进制程序(可执行文件)遵循EIF格式 [root@server ~]# ldd `which pwd` linux-vdso.so.1 => (0x00007fff62df0000) # 指程序的起始入口 libc.so.6 => /lib64/libc.so.6 (0x0000003508400000) /lib64/ld-linux-x86-64.so.2 (0x0000003507c00000)
程序包一般都包括:二进制程序,库文件,配置文件,帮助文件这些信息。
二、RPM包管理器
在CentOS中的包管理器是RPM(RPM is Package Manager),具有上面包管理的组成和功能。
1、RPM包命名格式
所有的RPM包文件都是以.rpm结尾的。具体的命名格式:
name-version-relase.arch.rpm
字段 | 含义 |
name | 程序名 |
version | 程序源码编号。分别代表主版本号,副版本号,发行号 |
release | rpm自身的发行号,与程序源码的发行号无关,仅用于标识对 rpm包不同制作的修订;同时,release还包含此包适用的OS |
arch | 适用于的硬件平台,主要有:i386, i486, i586, i686,x86_64,powerpc,noarch(依赖于虚拟机) |
例如:bash-4.2.3-3.centos6.x86_64.rpm
2、rpm包的合法性验正
包制作者制作完成之后会附加数字签名于包上;验证主要包括 来源合法性、包的完整性。
具体原理:
包的制作者使用单向加密提取原始数据的特征码,而后使用自己的私钥加密这段特性码,附加原始数据后面。通过数字证书的方式验证来源合法性,通过提取验证码是否正确来判断完整性问题。
验正过程:
前提:必须有可靠机制获取到包制作者的公钥;
1、使用制作者的公钥解密加密的特征码,能解密则意味着来源合法;
2、使用与制作者同样的意向加密算法提取原始数据的特征码,并与解密出来的特征作比对,相同,则意味着完整性没问题;
3、RPM分包管理
试想一下,例如:一个程序总共有50个小功能,难道在打包的时候都打包到一个文件中去吗? 如果是这样,我们仅用到其中的5,6个功能,却安装了50个包,造成了空间浪费。所以,RPM包提供了分包的功能,从一定程度上解决了这个问题。
一般是有一个主包,提供基本功能;其他功能分别打包成不同的包文件来使用。
三、RPM包管理器的使用
RPM包管理器都是使用rpm命令(前端工具)来实现的,下面从不同角度介绍此命令的常用选项。
1、安装程序包
以安装 lftp 来示例。
当然在安装过程中没有出现依赖关系,如果出现依赖关系,则需要安装依赖软件包。
--test:此时软件是否可以安装
重新安装:--replacepkgs 如果原有配置文件作了修改,很有可能不执行替换,而是将应该安装生成的配置文件重命名为 .rpmnew
如果依赖于其它包:1、解决依赖关系;2、忽略依赖关系能安装上,但有可能无法运行;使用--nodeps 参数。rpm -ivh --nodeps 软件包文件名
2、卸载程序包
常用用法:rpm -e package_name
如果被其它包所依赖:1、将依赖于此包的所有包一并卸载;2、忽略依赖关系能卸载,但依赖于此包程序包可能会运行不正常,使用 --nodeps 参数。
如果包的配置文件安装后曾被改动过,卸载时,此文件将不会卸载,而是被重命名并保留
3、升级软件包
用法:rpm -Uvh | -Fvh /path/to/package_file
1、升级或安装
-Uvh:如果软件包不存在则安装,如果存在则升级。
2、纯升级
-Fvh:如果软件包不存在则什么都不干,如果存在则升级。
如果有时候升级有问题,则可以使用 --force: 强制升级。
注意:不应该对内核执行升级操作,而是安装。因为系统允许多内核并存,所以万一升级失败,还可保证系统不出现问题。
4、查询功能
rpm的查询功能可能是我们在软件包管理方面使用最多的。
1)对已安装的软件
-q:查询软件包是否安装
-qa:查询系统已安装的包
-qi:查询包的描述信息
-ql:列出软件包所安装的所有文件
-qc:列出软件包所安装的配置文件
-qd:列出软件包所安装的帮助文档
-q --scripts:查询软件安装时所执行的脚本
-qf:查询某文件是由哪个包安装生成的
2)对未安装的软件
查询功能和已安装的一样,只是加入-p选项。
-pq -pqi -pql -pqd -pqc 等参数,同上述功能。
5、校验
用于检查包安装生成的文件属性是否发生变化
rpm -V package_name
[root@server Packages]# rpm -V lftp S.5....T. c /etc/lftp.conf # 常见属性如下:如果某属性无变化,则显示为. # 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
6、rpm包来源合法性及完整性检验:
前提:在当前系统上导入包的制作者的公钥
导入:rpm --import /path/to/key_file
# rpm -qa gpg-pubkey*
显示所有已经导入的gpg格式的公钥
# rpm -qi gpg-pubkey-NAME
显示公钥的详细信息
检查包:安装过程中会自动执行
手动检查:
# 完整性和合法性检查 [root@server Packages]# rpm -K lftp-4.0.9-1.el6.x86_64.rpm lftp-4.0.9-1.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK # 不检查来源合法性: [root@server Packages]# rpm -K --nosignature lftp-4.0.9-1.el6.x86_64.rpm lftp-4.0.9-1.el6.x86_64.rpm: sha1 md5 OK # 不检查包完整性 [root@server Packages]# rpm -K --nodigest lftp-4.0.9-1.el6.x86_64.rpm lftp-4.0.9-1.el6.x86_64.rpm: rsa (md5) pgp OK
7、数据库重建
数据库目录:/var/lib/rpm
rpm --initdb:初始化,如果事先没有库,会新建一个;如果有,则不新建;
rpm --rebuilddb: 直接重建,覆盖原有的数据库
总结:个人感觉RPM在安装软件包是使用不多,一般使用查询功能居多。
本文出自 “逆水寒” 博客,请务必保留此出处http://guoting.blog.51cto.com/8886857/1440066
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。