一、软件包管理简介
1、软件包组成
我们都在windows系统中安装过软件,基本就是用鼠标点击下一步,因而有些人认为安装软件是一件非常容易的事,无论是在何种操作系统上。然而,事实并非如此。在Linux系统上安装软件的方法完全不同于在Windows上安装,至少不会是简单的用鼠标点击下一步就行了。要想在Linux系统上安装软件包,首先要了解软件包的组成。
软件包由二进制程序、库文件、配置文件、帮助文件等重要部分组成。
软件包的安装目录如下:
二进制程序:
默认:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin,
/usr/local/sbin
自定义:/usr/local/APP/{bin,sbin}
库文件(开发库和运行库):
默认:/lib64, /usr/lib64, /usr/local/lib64
自定义: /usr/local/APP/lib
配置文件:
默认:/etc
自定义:/usr/local/APP/etc或conf目录
帮助文件:
默认:/usr/share/man, /usr/local/share/man
自定义:/usr/local/APP/man
2、软件包管理
问:安装软件包时,会在很多不同的目录下存放文件,如果要卸载软件包,怎样才能卸载得干净呢?
答:如果在安装软件包时,把安装存放软件包文件的目录记录下来,卸载时,根据这个记录就能把软件包卸载得干净。这就是软件包管理器中数据库的作用了!
在Linux系统中,一般会使用软件包管理工具对软件包进行管理。
程序包管理器功能:将编译好的程序打包成一个文件或有限的几个文件,可用于实现安装、卸载、升级、查询等功能;
程序包管理器中应该包含:
(1)数据库:
程序名及版本
程序的依赖关系:X --> Y,Z (X依赖于Y、Z)
程序的功能性说明
安装生成的各文件路径及校验码
(2)程序的组成清单:
文件清单
安装卸载时运行的脚本
常见的软件包管理器有:
Debian: dpkg,(以.deb后缀结尾)
RedHat: rpm(redhat package manager),(以.rpm后缀结尾)
二、rpm包介绍
RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux、S.u.S.E.以及Turbo Linux等Linux的分发版本都有采用,可以算是公认的行业标准了。
利用rpm软件包管理工具可以把软件包打包成rpm格式(以.rpm为后缀),rpm包可以用rpm工具统一管理。
1、rpm包命名格式
rpm包命名格式:name-version-relase.arch.rpm
name : 表示软件包的名字,包括主包名和分包名
分包机制:
核心包,主包:命名与源程序一致
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
version:包源代码的版本号
version: major.minor.release
主版本号.次版本号.源代码的发行版本号
relase :rpm自身的发行号,与程序源码的发行号无关,仅用于标识对rpm包不同制作的修订;同时,release还包含此包适用的OS
如:bash-4.2.3-3.centos5
arch :该程序包使用的硬件平台
如:x86: i386, i486, i586, i686等;
x86_64: x86_64
powerpc: ppc
noarch: 依赖于虚拟机
2、rpm包获取的途径
(1)发行的光盘或站点服务器
镜像:
http://mirrors.163.com
http://mirrors.sohu.com
(2)项目的官网
源代码
rpm包
(3)很多第三方机构或个人制作并公开发布许多rpm包(不一定安全)
http://rpmfind.net
http://rpm.pbone.net
(4)可靠的途径:EPEL(建议使用可靠的包)
Fedora-EPEL(Fedora官方维护,会验证包的合法性和可靠性)
3、rpm包的合法性验正
rpm包的合法性验正主要包括:
a、来源合法性
b、包的完整性
(包制作者制作完成之后会附加数字签名于包上)
包的制作者使用单向加密提取原始数据的特征码,而后使用自己的私钥加密这段特性码,附加原始数据后面。
验正过程:
前提:必须有可靠机制获取到包制作者的公钥;
(1)使用制作者的公钥解密加密的特征码,能解密则意味着来源合法;
(2)使用与制作者同样的意向加密算法提取原始数据的特征码,并与解密出来的特征作比对,相同,则意味着完整性没问题;
三、rpm的核心功能
1、安装程序包
安装程序包:
rpm [option] /path/to/package_file (要指明包文件才能安装)
-i: install 安装指定的程序包
-v: 显示详细的安装信息
-vv: 显示更详细的安装信息
-vvv: 显示更多的详细安装信息(比-vv更详细)
-h: 使用“#”显示安装进度,一个“#”表示%2的安装进度
组合选项:-ivh
--test: 仅作测试,没有真正执行安装
如果依赖于其它包:
(1)解决依赖关系
(2)忽略依赖关系
能安装上,但有可能无法运行;
--nodeps (忽略依赖关系)
重新安装:
--replacepkgs
如果原有配置文件作了修改,很有可能不执行替换,而是将应该安装生成的配置文件重命名为 .rpmnew
2、卸载程序包:
rpm [option] package_name
-e: erase 卸载指定包名的程序包
如果被其它包所依赖:
(1)将依赖于此包的所有包一并卸载
(2)忽略依赖关系
能卸载,但依赖于此包程序包可能会运行不正常;
--nodeps (忽略依赖关系)
如果包的配置文件安装后曾被改动过,卸载时,此文件将不会卸载,而是被重命名并保留,例如:
warning: /etc/zprofile saved as /etc/zprofile.rpmsave
3、升级程序包:
新版本替换老版本
rpm [option] /path/to/package_file
(1)升级或安装
-Uvh (如果装有老版本的,则升级,否则,则安装)
(2)纯升级
-Fvh (如果装有老版本的,则升级,否则,退出)
--force: 强制升级
注意:不应该对内核执行升级操作,而是安装
系统允许多内核并存
4、查询操作:
(1)查询某包是否安装
rpm -q package_name...
(2)查询所有已经安装的包
rpm -qa
按条件过滤:rpm -qa | grep 'PATTERN'
(3)查询包的描述信息
rpm -qi package_name
(4)查询某包安装生成了哪些文件
rpm -ql package_name
a、查询某包安装生成了哪些配置文件
rpm -qc package_name
b、查询某包安装生成了哪些帮助文件
rpm -qd package_name
c、查询程序包的相关脚本
rpm -q --scripts package_name
脚本有四类:
preinstall:安装前脚本
postinstall: 安装后脚本
preuninstall: 卸载前脚本
postuninstall: 卸载后脚本
(5)查询某文件是由哪个包安装生成的
rpm -qf /path/to/some_file
(6)对尚未安装的包执行查询
rpm [option] /path/to/package_file
-qpi :查询尚未安装的包的描述信息
-qpl :查询尚未安装的包安装后会生成哪些文件
-qpc :查询尚未安装的包安装后会生成哪些配置文件
-qpd :查询尚未安装的包安装后会生成哪些帮助文件
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 (能力发生改变了)
某属性无变化,显示为.
6、rpm包来源合法性及完整性检验:
前提:在当前系统上导入包的制作者的公钥
导入:
rpm --import /path/to/key_file
# rpm -qa gpg-pubkey*
显示所有已经导入的gpg格式的公钥
# rpm -qi gpg-pubkey-NAME
显示密钥的详细信息
检查包:安装过程中会自动执行
手动检查:
rpm -K /path/to/package_file
rpm --checksig /path/to/package_file
不检查包完整性:
rpm -K --nodigest
不检查来源合法性:
rpm -K --nosignature
7、数据库重建:
数据库目录:/var/lib/rpm
重建:
rpm --initdb:初始化
如果事先没有库,会新建一个;如果有,则不新建;
rpm --rebuilddb: 重建
直接重建,覆盖原有的数据库