一、前言
在没有软件包管理器前,用户都是通过源代码的方式来安装软件。但是我们很容易发现,在每次安装软件时都必须对操作系统的境、编译的参数进行对应的编译,并且操作过程很是复杂,这对于不熟悉操作系统的朋友来说真心困难,那么有没有一款软件能让用户能很简单的安装所需的软件呢?
随着自由软件蓬勃发展,Linux系统的飞快发展,很多软件开发者、企业和社区将这些软件开始通过收集、整理、编译制作成distributions发布到常用的Linux操作系统上,但是后来发现,这样做在日后软件更新、系统更新上面都需要做很多操作。为了解决这个问题,一些社区和企业开始思考关于Linux的软件管理方式。
通过社区与企业的共同努力,Linux开发商将固定的硬件平台和操作系统需要安装或升级的软件编译好,并且将这些软件通过特定的打包方式将软件打包成一个特殊格式的文件,这些软件的文件含有能检测操作系统环境和软件依赖性的脚本,并提供记载该软件提供的所有文件信息等,最后将这个软件发布出去供用户使用。那么用户得到这个软件包,通过特定的命令,就能执行检测系统环境,根据环境所需的要求,对软件进行安装。这就是软件管理器的诞生。
二、目前常见Linux软件安装方式有2种
2.1、dpkg
这个软件安装方法是通过Debian Linux社区开发出来的,通过dpkg机制,Debian所提供的软件就能通过很简单的方法安装软件,并且能记录安装后的软件信息。只有是Debian的Linux distributions大多数都是使用这个方法管理软件。例如B2D、Ubuntu
2.2、RPM
这个软件安装方法是由Red Hat公司开发出来的,由于非常的简单实用,很多的distributions都使用这个机制来安装和管理软件。例如:CentOS、SUSE等
三、程序包管理器
功能:将编译好的程序打包成一个文件或有限的几个文件,可以用于实现安装、卸载、升级、查询等功能
包含:
1、数据库
程序名及版本
依赖关系: X –> Y,Z
功能性说明(rpm -qi bash)
安装生成的各文件路径及校验码
2、程序的组成清单
文件清单
安装卸载时运行的脚本
四、RPM介绍
RPM(RedHat Package Manager),RPM通过以一个数据库记录的方式来将你所需的软件安装到你的Linux系统上的。在你所安装的软件前先通过编译完成,打包成RPM格式的文件,数据库记录的方式搜索对应需要具备的依赖关系的软件,那么当你在安装该软件的时候,RPM会查看你系统环境和依赖性关系来判定你是否能安装此软件。若能满足,则允许安装。否则将不给予安装。并且在安装的时候将该软件的信息写入RPM的数据库中,以便日后查询、检验和升级。
五、RPM包的命名格式
格式:
name–version–release.arch.rpm
例如:
bash-4.2.3-3.centos5.x86_64.rpm #表示bash-4.2.3,第三次发行,支持CentOS5系统,支持硬件平台x86_64位系统
获取rpm包的途径:
1、发行的光盘或站点服务器
镜像:
-
http://mirrors.163.com
-
http://mirrors.sohu.com
-
http://mirros.aliyun.com
2、项目的官网
-
源代码
-
rpm包
3、很多第三方机构或个人制作并公开发布许多的rpm包
-
http://rpmfind.net
-
http://rpm.pbone.net/
六、打包工具的分包机制
假设一个程序有20个功能:常用功能有8个,特殊功能A:3个,特殊功能B:6个,二次开发相关功能:3个。那如果用户只需要常用功能,可是必须要全部安装,那么就会很占用空间,而且其他功能根本不会使用,这时就会分包机制了。
分包机制:
核心包(主包) + 子包(分包)组成
核心包:命令与源程序一致
例如:bash-4.2.3-3.centos7.x86_64.rpm
子包:(安装子包前必须安装核心包)
例如: bash-a-4.2.3-3.centos7.x86_64.rpm
bash-devel-4.2.3-3.centos7.x86_64.rpm #devel就表示开发功能
七、RPM包的使用
7.1、安装(组合选项:-ivh)
rpm [option] Package_file -i:install安装操作 -v:安装时显示详细信息 -vv:安装时显示更详细信息 -h:hash码,在安装过程中使用#号来显示安装进度 –-test:仅作测试,不做安装操作 -–nodeps:忽略依赖关系,强制安装如果某包依赖于其他包,要么解决所有的依赖关系,要么忽略依赖关系,强制安装。但是如果强制安装完成后,软件未必能正常使用。 –-replacepkgs:重新安装程序包 备注:如果原有配置文件作了修改,很有可能不执行替换文件,而是将新生成的配置文件重命名后缀为 .rpmnew
例子:
#测试安装RPM包 [root@localhost mnt]# mount /dev/cdrom /mnt #挂载光盘镜像到/mnt目录下 mount: block device /dev/sr0 is write-protected, mounting read-only [root@localhost mnt]# cd /mnt/Packages/ #进入光盘目录 [root@localhost Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm #安装zsh-4.3.10-7.el6.x86_64.rpm包 warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY #这里的是提示密钥,无法校验包的合法性 Preparing... ########################################### [100%] #使用#代表安装进度,一个#代表2% 1:zsh ########################################### [100%] #仅作测试,不做安装 [root@localhost Packages]# rpm -q zsh package zsh is not installed [root@localhost Packages]# rpm --test -ivh zsh-4.3.10-7.el6.x86_64.rpm#仅作测试安装,实际上未安装 warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] [root@localhost Packages]# rpm -q zsh package zsh is not installed
7.2、卸载
rpm [option] Package_name -e:erase 删除
卸载的时候也会存在依赖关系的,如果被其他包所依赖:
-
1、将依赖于此包的所有包一并卸载
-
2、忽略依赖关系能卸载,但依赖于此包程序包可能会运行不正常
–nodeps 忽略依赖关系
练习:
[root@localhost Packages]# rpm -q zsh #查看软件是否安装,显示出包的信息证明已经安装 zsh-4.3.10-7.el6.x86_64 [root@localhost Packages]# rpm -e zsh #卸载zsh软件 [root@localhost Packages]# rpm -q zsh package zsh is not installed #提示该软件未安装
注意:如果包的配置文件安装后曾被改动过,卸载时,此文件将不会卸载,而是重命名并保存,会出现下面的字段
warning: /etc/zshrc saved as /etc/zshrc.rpmsave
例如:
[root@localhost Packages]# rpm -e zsh warning: /etc/zshrc saved as /etc/zshrc.rpmsave [root@localhost Packages]# ls /etc/ | grep "zsh*" zshrc.rpmsave
7.3、升级(一般而言是新版本取代老版本)
rpm [option] Package_file
(1)、升级或安装 (如果有老版本就升级,如果没有就安装)
组合 -Uvh
(2)、直接升级 (如果有老版本就安装新版本)
组合 -Fvh
升级的时候也可能会出现版本冲突等问题,所以如果想强制升级可以使用 –force
注意:不应该对内核执行升级操作,而是安装(因为Linux系统允许多内核并存)
7.4、查询
(1)、查询某包是否安装
rpm -q package_name…..
(2)、查询所有已经安装的包
rpm -qa #a表示all
按条件过滤: rpm -qa | grep 'PATTERN'
(3)、查询包的表述信息
rpm -qi package_name (这里查询仅查询已安装的包)
(4)、查询某包生成了哪些文件
rpm -ql package_name
①查询某包生成了哪些配置文件
rpm -qc package_name
②查询某包生成了哪些帮助文件
rpm -qd package_name
③查询程序包的相关脚本
rpm -q –scripts package_name
脚本有四类
preinstall:安装前脚本
postinstall:安装后脚本
preuninstall:卸载前脚本
postuninstall:卸载后脚本
(5)、查询某文件是由哪个包安装生成的
rpm -qf /path/to/some_file
(6)查询某包所提供的capabilities
rpm -q provides PACKAGE_NAME
(7)查询某包所依赖的capabilities
rpm -q --requires PACKAGE_NAME
(8)、对尚未安装的包执行查询
rpm [option] /path/to/package_file -q :查看软件包是否安装 -qpi:包的信息 -qpl:安装以后会生成什么文件 -qpc:安装以后会生成什么配置文件 -qpd:安装以后会生成什么帮助文件
(9)查询指定的CAPABILITY由哪个包所提供
rpm -q --whatprovides CAPABILITY
(10)查询指定的CAPABILITY被哪个包所依赖
rpm -q --whatrequires CAPABILITY
(11)查询某包制作时随版本变化的changelog信息
rpm -q --changelog PACKAGE_NAME
(12)预览包内文件
rpm2cpio 包文件|cpio –itv #需要制定包的路径
(13)释放包内文件
rpm2cpio 包文件|cpio –id “ *.conf” #需要制定包的路径
练习:
[root@localhost Packages]# rpm -q zsh #查看zsh软件是否安装 zsh-4.3.10-7.el6.x86_64 [root@localhost Packages]# rpm -qa | grep zsh #查看zsh软件是否安装 zsh-4.3.10-7.el6.x86_64 [root@localhost Packages]# rpm -qd zsh #查询zsh包生成了哪些帮助文件 [root@localhost Packages]# rpm -qpl httpd-2.2.15-29.el6.centos.x86_64.rpm #在未安装httpd时,查询安装httpd会生成什么文件 [root@localhost Packages]# rpm -qf /etc/bashrc #查询bashrc这个文件是通过什么程序包安装生成的 setup-2.8.14-20.el6_4.1.noarch
7.5、校验(用于检查包装后文件属性是否发生变化)
rpm -V Package_name 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@localhost Packages]# tail -5 /etc/zshrc } _src_etc_profile_d unset -f _src_etc_profile_d #test file #在 /etc/zshrc文件中最后一行添加了最后一段 [root@localhost Packages]# rpm -V zsh #查询该zsh软件的配置文件是否更改 S.5....T. c /etc/zshrc #看出文件大小,MD5校验,修改时间都发生了变化
7.6、RPM数据库重建
rpm 的数据库目录: /var/lib/rpm
rpm –-initdb
:初始化如果事先没有库,会新建一个;如果有,则不覆盖
rpm –-rebuilddb
:重建直接重建,覆盖原有的数据库
7.7、校验RPM包来源合法性及完整性
前言:包制作者制作完成之后会附加数字签名于包上;包的制作者使用单向加密提取原始数据的特征码,而后使用自己的私钥加密这段特征码,附加原始数据后面。
验证包来源合法性和完整性的过程:
前提:必须有可靠机制获取到包制作者的公钥
-
1、使用制作者的公钥解密加密的特征码,能解密则意味着来源合法
-
2、使用与制作者同样的一样加密算法提取原始数据的特征码,并与解密出来的特征码比对,相同,则意味着完整性没问题,所以我们必须在当前系统上导入包的制作者的公钥
导入公钥:
rpm –-import /path/to/key_file
小贴士:centos6的密钥是在光盘里的“RPM-GPG-KEY-CentOS-6 ”文件
显示所有已导入的gpg格式的公钥:
rpm -qa gpg-pubkey*
显示公钥的详细信息:
rpm -qi gpg-pubkey-name
检查包安装过程中会自动执行,若要手动检测请如下操作:
手动检查:
rpm -K /path/to/package_file rpm –-checksig /path/to/package_file
不检查包完整性:
rpm -K –-nodigest
不检查来源合法性:
rpm -K –-nosignature
实验:
误删除rpm修复方法:
1.进入救援模式
2.创建挂载目录:
mkdir /mnt/cdrom
3.挂载光盘镜像:
mount -r /dev/sr0 /mnt/cdrom
4.进入软件包目录:
cd /mnt/cdrom/Packages/
5.安装rpm:
rpm -ivh rpm-4.11.3-17.el6.x86_64- --root=/mnt/sysimage/
练习:
[root@localhost Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm #安装时会提示你没有公钥,无法校验包的完整性与合法性 warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY [root@localhost Packages]# rpm --import /mnt/RPM-GPG-KEY-CentOS-6 #导入密钥 [root@localhost Packages]# rpm -qa gpg-pubkey* #查看所以已导入的gpg格式的密钥 gpg-pubkey-c105b9de-4e0fd3a3 [root@localhost Packages]# rpm -qi gpg-pubkey-c105b9de-4e0fd3a3 #查看密钥详细信息 [root@localhost Packages]# rpm -ivh --replacepkgs zsh-4.3.10-7.el6.x86_64.rpm #可以导入密钥后安装软件会自动执行检查,通过后直接安装 Preparing... ########################################### [100%] 1:zsh ########################################### [100%] [root@localhost Packages]# rpm -K zsh-4.3.10-7.el6.x86_64.rpm #手动检查包的完整性与合法性 zsh-4.3.10-7.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
八、知识要点总结
-
8.1、了解软件包管理器的来源与使用
-
8.2、熟悉RPM包的命名格式 name-version-release.arch.rpm
-
8.3、熟悉打包和分包机制
-
8.4、熟悉RPM命令的使用 ,包括 安装、卸载、查询、升级、校验、公钥导入、合法性的检验、RPM数据库重建
8.1、了解软件包管理器的来源与使用
8.2、熟悉RPM包的命名格式 name-version-release.arch.rpm
8.3、熟悉打包和分包机制
8.4、熟悉RPM命令的使用 ,包括 安装、卸载、查询、升级、校验、公钥导入、合法性的检验、RPM数据库重建
虽然在安装软件时还有其他更好的命名,比如yum(日后再介绍),但是yum也是基于RPM而衍生出来的,而且在查询软件包很有用,日后也会经常使用这个命令,所以必须要对RPM命令非常熟悉,尤其是查询命令,对日后维护Linux系统帮助很大。建议多加练习
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-02/140277.htm