Linux系统之程序包管理器-RPM
在早期我们使用源代码的方式来安装软件时,都需要先把源程序代码编译成可执行的二进制安装程序,然后进行安装。这就意味着每次安装软件都需要经过预处理-->编译-->汇编-->链接-->生成安装文件--> 安装,这个复杂而艰辛的过程。为简化安装步骤,便于广大用户的安装部署程序,程序提供商就在特定的系统上面编译好相关程序的安装文件并进行打包,提供给大家下载,我们只需要根据自己的系统去下载相应的安装包进行安装即可,其类似 Windows 的安装方式,由程序开发者直接在已知的系统上面编译好,再将该程序直接给用户来安装,如此而已。但是,程序包该怎么管理呢,这就是我们程序包管理器的事啦!
什么是程序包管理器
用于管理Linux 下软件包的软件,其主要功能为:将编译好的程序打包成一个文件或有限的几个文件,可用于实现安装、卸载、升级、查询等功能。
程序包管理器的两大主流
dpkg: 最早是由 Debian Linux 社群所开发出来的, 只要是衍生亍 Debian 的其他 Linux distributions 大多使用 dpkg 这个机制来管理软件的, 包括B2D, Ubuntu 等等,其前端工具有apt-get。
RPM: 最早是由 Red Hat 这家公司开发出来的,后来实在太好用,因此很多distributions 就使用其来作为软件安装的管理方式。包括 Fedora, CentOS, SUSE 等等,其前端工具有yum。
程序包的组成格式与存放路径:
1、二进制程序
主要存放的路径:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin, /usr/local/APP/{bin,sbin}
注意:有些特殊的应用程序放置于libexec目录中;有些第三方应用默认安装于/opt目录。
2、库文件(开发库、运行库)
主要存放的路径:/lib64, /usr/lib64, /usr/local/lib64, /usr/local/APP/lib
3、配置文件
主要存放的路径:/etc, /usr/local/APP/etc或conf目录
4、帮助文件
主要存放的路径:/usr/share/man, /usr/local/share/man, /usr/local/APP/man
RPM程序包管理器使用详解
RPM包的命名格式:
但对于一个程序来说,其可能具有很多功能,其中有些是常用功能,有些是特殊功能,有些是二次开发相关的功能,如果把所有的功能打包在一块,无疑程序包会增大很多,对一些普通用户无需使用的功能都需一并下载安装,无形间就造成了资源的浪费,特此在对程序包的打包就衍生出了分包机制,一般把程序分包成主包与子包。例如一个bash程序有20个功能:常用功能有10个,特殊A:4个,特殊B:3个,二次开发相关功能:3个,那么包的命名方式如下:
核心包,主包:命名与源程序一致
bash-4.2.3-3.centos7.x86_64.rpm
子包:
bash-a-4.2.3-3.centos7.x86_64.rpm
bash-b-4.2.3-3.centos7.x86_64.rpm
bash-devel-4.2.3-3.centos7.x86_64.rpm
RPM-安装程序包:
命令格式: rpm [option] /path/to/package_file...
常用选项说明:
-i:安装程序;
-v:显示安装执行过程;
-vv:详细显示安装执行过程;
-vvv:更详细的显示安装执行过程;
-h:用#来标记安装进度
常用组合选项:-ivh
--test: 仅作测试,没有真正执行安装
--nodeps:忽略依赖关系,强制安装,能安装上,但有可能无法运行
--replacepkgs:重新安装,如果原有配置文件作了修改,很有可能不执行替换,而是将应该安装生成的配置文件重命名为 .rpmnew
[root@CentOS6 Packages]# rpm -ivh zsh-4.3.10-7.el6.i686.rpm --test
Preparing... ########################################### [100%]
[root@CentOS6 Packages]# rpm -ivh zsh-4.3.10-7.el6.i686.rpm
Preparing... ########################################### [100%]
1:zsh ########################################### [100%]
[注意]:该命令后面接的是RPM包文件,可以用空格做分割同时安装多个程序,如电脑可以上网的话,也可以直接指定网络上的RPM包,进行安装。
RPM-卸载程序包:
命令格式:rpm [option] package_name
常用选项说明:-e: 卸载程序
--nodeps:忽略依赖关系,强行卸载,其他依赖于此包的程序可能无法正常运行
[root@CentOS6 Packages]# rpm -e zsh
warning: /etc/zshrc saved as /etc/zshrc.rpmsave #对/etc/zshrc做过修改,提示文件不会被删会被保存为/etc/zshrc.rpmsave
[root@CentOS6 Packages]# rpm -e httpd #卸载httpd,提示有其他程序依赖于该程序,无法卸载,如需卸载先卸载相依赖的程序
error: Failed dependencies:
httpd >= 2.2.0 is needed by (installed) gnome-user-share-2.28.2-3.el6.i686
[root@CentOS6 Packages]# rpm -e httpd --nodeps #忽略依赖关系,强行卸载
[root@CentOS6 Packages]#
[注意]:如果包的配置文件安装后曾被改动过,卸载时,此文件将不会卸载,而是被重命名并保留,例如
warning: /etc/zshrc saved as /etc/zshrc.rpmsave
RPM-升级程序包
命令格式:rrpm [-Uvh | -Fvh] /path/to/package_file
常用选项说明:-Uvh: 升级或安装,后面的程序安装此电脑已安装则进行升级,如没有安装则现在安装;
-Fvh: 升级,只对电脑上已安装的程序进行升级,如没有安装则不进行安装;
--force:强制升级
[注意]:为了保证系统的正常运行,不要对内核进行升级操作,而应该对内核进行安装,系统允许多个内核共存。
RPM-查询操作
命令格式:rpm [option] package_name|file
常用选项说明:
-q: 查询某包是否安装,可以一次查询多个,彼此间用空格隔离;
[root@CentOS6 cd]# rpm -q zsh
zsh-4.3.10-7.el6.i686
-qa: 查询所有已经安装的包,可以通过管道按条件进行过滤(rpm -qa | grep 'PATTERN')
[root@CentOS6 cd]# rpm -qa
libaio-0.3.107-10.el6.i686
perl-URI-1.40-2.el6.noarch
kbd-1.15-11.el6.i686
gnome-speech-0.4.25-3.1.el6.i686
cas-0.15-1.el6.1.noarch
tzdata-2013g-1.el6.noarch
libsss_autofs-1.9.2-129.el6.i686
.........
[root@CentOS6 cd]# rpm -qa | grep "zs.*"
zsh-4.3.10-7.el6.i686
-qi: 查询包的描述信息(只能查询已经安装的包的描述信息);
[root@CentOS6 cd]# rpm -qi zsh
Name : zsh Relocations: (not relocatable)
Version : 4.3.10 Vendor: CentOS
Release : 7.el6 Build Date: Sun 24 Nov 2013 12:37:44 PM EST
Install Date: Tue 21 Apr 2015 11:29:57 AM EDT Build Host: c6b9.bsys.dev.centos.org
Group : System Environment/Shells Source RPM: zsh-4.3.10-7.el6.src.rpm
Size : 4777026 License: BSD
Signature : RSA/SHA1, Sun 24 Nov 2013 02:30:40 PM EST, Key ID 0946fca2c105b9de
Packager : CentOS BuildSystem <http://bugs.centos.org>
URL : http://zsh.sunsite.dk/
Summary : A powerful interactive shell
Description :
The zsh shell is a command interpreter usable as an interactive login
shell and as a shell script command processor. Zsh resembles the ksh
shell (the Korn shell), but includes many enhancements. Zsh supports
command line editing, built-in spelling correction, programmable
command completion, shell functions (with autoloading), a history
mechanism, and more.
[root@CentOS6 cd]#
-ql: 查询某包安装生成了哪些文件(所有);
-qc: 查询某包安装生成了哪些配置文件;
-qd: 查询某包安装生成了哪些帮助文件;
--q --scripts package_name: 查询程序包的相关脚本;
脚本有四类:
preinstall:安装前脚本,包安装之前就需安装的脚步
postinstall: 安装后脚本
preuninstall: 卸载前脚本
[root@CentOS6 cd]# rpm -qc zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
[root@CentOS6 cd]# rpm -qd zsh
/usr/share/doc/zsh-4.3.10/BUGS
.....
/usr/share/man/man1/zshall.1.gz
....
[root@CentOS6 cd]# rpm -q --scripts zsh
postinstall scriptlet (using /bin/sh):
if [ ! -f /etc/shells ] ; then
.....
[root@CentOS6 cd]#
查询没有安装的包的相关信息,只需要在选项里加入-p即可,如下:
-qpi 包的描述信息
-qpl 包安装会生成的文件
-qpc 包安装会生成的配置文件
-qpd 包安装会生成的帮助文件
查询某文件是由哪个包安装生成的:rpm -qf /path/to/some_file
[root@CentOS6 cd]# rpm -qf /bin/vi
vim-minimal-7.2.411-1.8.el6.i686 #显示/bin/vi文件是由该安装包生成
[root@CentOS6 cd]#
RPM-校验
用于检查包安装生成的文件属性是否发生变化
命令格式:rpm [option] package_name|file
常用选项说明:
-V :后面加的是程序名称,若该程序属有的文件发生改变就会显示;
-Va :显示目前系统上面所有可能被修改过的文件;
-Vp :后面加的是文件名,显示该程序内可能被更改过的文件;
-Vf :后面加的是文件名,显示某个文件是否被修改过。
[root@CentOS6 cd]# rpm -V zsh
S.5....T. c /etc/zshrc
[root@CentOS6 cd]#
对应属性位说明:
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 包的能力发生改变
【注意】在文件属性发生某项属性变化时,对应属性位的标识才会显示,若属性无变化,则显示为.
RPM包的校验与数字签名说明:
RPM包的校验主要有来源合法性验证与包的完整性验证。
数字签名:包的制作者使用单向加密提取原始数据的特征码,而后使用自己的私钥加密这段特性码,附加原始数据后面。
验正过程:
前提:必须有可靠机制获取到包制作者的公钥;
1、使用制作者的公钥解密加密的特征码,能解密则意味着来源合法;
2、使用与制作者同样的意向加密算法提取原始数据的特征码,并与解密出来的特征作比对,相同,则意味着完整性没问题;
rpm包来源合法性及完整性检验:
在当前系统上导入包的制作者的公钥:
rpm --import /path/to/key_file
显示所有已经导入的gpg格式的公钥:
rpm -qa gpg-pubkey*
[root@CentOS6 cd]# rpm -qa gpg-pubkey*
gpg-pubkey-c105b9de-4e0fd3a3
[root@CentOS6 cd]#
显示密钥的详细信息
rpm -qi gpg-pubkey-NAME
[root@CentOS6 cd]# rpm -qi gpg-pubkey-c105b9de-4e0fd3a3
Name : gpg-pubkey Relocations: (not relocatable)
Version : c105b9de Vendor: (none)
......
-----END PGP PUBLIC KEY BLOCK-----
【注意】安装过程中会自动用已经导入的的公钥,对程序包进行检验,一般无需进行手动校验。
手动检查:
rpm {-K|--checksig} [--nosignature] [--nodigest] PACKAGE_FILE
选项说明:
-K :等同于 --checksig ,进行检查并显示结果;
--nodigest:不检查包完整性;
--nosignature:不检查来源合法性。
[root@CentOS6 cd]# cd Packages/
[root@CentOS6 Packages]# rpm -K zsh-4.3.10-7.el6.i686.rpm
zsh-4.3.10-7.el6.i686.rpm: rsa sha1 (md5) pgp md5 OK
[root@CentOS6 Packages]# rpm --checksig zsh-4.3.10-7.el6.i686.rpm
zsh-4.3.10-7.el6.i686.rpm: rsa sha1 (md5) pgp md5 OK
[root@CentOS6 Packages]# rpm -K --nodigest zsh-4.3.10-7.el6.i686.rpm
zsh-4.3.10-7.el6.i686.rpm: rsa (md5) pgp OK
[root@CentOS6 Packages]# rpm -K --nosignature zsh-4.3.10-7.el6.i686.rpm
zsh-4.3.10-7.el6.i686.rpm: sha1 md5 OK
RPM- 数据库重建:
数据库目录:/var/lib/rpm
重建数据库:
rpm --initdb:初始化
如果事先没有库,会新建一个;如果有,则不新建;
rpm --rebuilddb : 重建
直接重建,覆盖原有的数据库