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程序源码编号。分别代表主版本号,副版本号,发行号
releaserpm自身的发行号,与程序源码的发行号无关,仅用于标识对 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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。