一、Linux程序包管理发展史那点事
Linux上的应用程序被开发出来后,一般以源码形式或者编译后的二进制格式提供给用户使用。对于以源码形式提供的应用程序,用户需要借组编译器,自行编译成二进制格式才能使用。而即便是编译后的二进制包,用户也需要根据安装文档将应用程序的二进制程序、库文件、配置文件和帮助文件复制到指定路径下。这个过程十分繁琐。面对这个恼人的问题,Linux业界人士怎么能忍得下去,千呼万唤始出来,终于诞生了程序包管理器。
有了程序包管理器之后,应用程序提供者可将应用程序的二进制程序、库文件。配置文件、帮助文件等以特定形式组织成一个或有限几个“包”文件(不同程序包管理器的组织形式不同)。用户可下载打包好的程序包文件,然后通过程序包管理器的命令实现应用程序的安装,而不再需要手动的复制程序文件到指定的路径下,这些工作都交由程序包管理器来完成了。
最开始研发出的程序包管理器是Debian的dpt,全名是Debian Package Tool,后更名为dpkg,其程序包的后缀是.deb。后来RedHat也研发出了程序包管理器RedHat Package Manager,简称rpm,其程序包后缀为.rpm。在RedHat的推动下,rpm成为了Linux程序包管理器中的事实上的标准。RedHat对强大后的rpm进行了重新的解释,rpm的全称变为“rpm is Package Manager”。SUSE使用的程序包管理器也是rpm,但它的程序包与RedHat的是不兼容的。此外,Gentoo也有自己的程序包管理器ports。
这里,主要介绍程序管理器rpm的使用。
rpm程序包的命名有一定的规范,如下图所示:
Linux有一条哲学思想是:每一个程序只做一件事,并且把它做好。所以,一个大的应用程序往往会根据其提供的多个功能,被拆分为主包和一个或多个子包,用户可以根据需要的功能安装指定的部分程序包,而不必全部安装。这一点上有点像使用浏览器时,主包相当于浏览器安装包,要想使用浏览器就必须安装这个包,它提供了浏览器浏览网页的基本功能。子包相当于浏览器上的一些插件,如果我们想在浏览器上使用截图功能,或者播放视频,我们必须安装相应的截图插件和flash插件。这些插件必须借助浏览器这个软件才能发挥作用,是寄生在浏览器上的。用户可根据需要安装插件。主包和子包的关系就像浏览器和插件的关系一样。主包的命名方式与前面讲到的程序包命名方式相同,而子包者需在“NAME”后加上一个字段来表示该子包提供的功能。所以,主包命名格式为:NAME-VERSION-release.[os.]arch.rpm;子包命名格式为:NAME-FUNCTION-VERSION-release.[os.]arch.rpm。
zsh的主包名: zsh-5.0.2-7.el7.x86_64.rpm
zsh的某个子包名:zsh-html-5.0.2-7.el7.x86_64.rpm
前面讲到,子包必须寄生在主包上才能发挥作用,这种程序间的依赖关系是很常见的。假设,我们要使用A程序的功能,但A程序依赖于B程序,那么我们需要再安装B程序,而B程序可能也依赖于其他的程序,以此类推,为了安装并使用A程序,我们需要解决一大片的依赖关系,安装很多的其他程序包。可惜,程序包管理器rpm并没有提供很好的解决方案。在*软件界,有难点痛点,就有人挺身而出。以rpm为基础,人们为它开发了一套前端管理功能yum来解决这个难题。(介于这篇博客以解释rpm为主,yum将在下篇博客中进行解释)
二、rpm的详解
(一)rpm程序管理器的功能
将编译好的应用程序的各组成文件打包成一个或多个程序包文件按,从而更方便的实现程序包的安装、升级、卸载和查询等管理操作。
rpm程序包管理器的一些重要的组成文件为:
1. 程序包的组成清单(这部分每个程序包都单独实现):
- 文件清单
- 安装或卸载时运行的脚本
2. 数据库(这部分为公共数据库),包含的信息如下:
- 程序包的名称和版本
- 依赖关系
- 功能说明
- 安装生成的各文件的文件路径及校验码信息
- ……
rpm的数据库的存放路径为/var/lib/rpm
目录下。
[root@localhost Packages]# ls /var/lib/rpm
Basenames Group Obsoletename Requirename Triggername
Conflictname Installtid Packages Sha1header
Dirnames Name Providename Sigmd5
(二)获取rpm程序包的途径
1. 系统发行版的光盘或官方的文件按服务器(或镜像站点):
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
2. 从第三方组织获取:
(1) EPEL: Extra Packages for Enterprise Linux,企业级Linux扩展包
http://fedoraproject.org/wiki/EPEL/zh-cn
(2)在rpm包搜索网站上进行搜索:
http://pkgs.org
http://rpmfind.net
http://rpm.phone.net
3. 自行打包rpm包
(三)CentOS系统上rpm命令管理程序包
使用rpm命令管理程序包,主要包括安装、升级、卸载、查询、校验和数据库维护这几个功能。
安装
1. SYNOPSIS:
rpm {-i|–install} [install-options] PACKAGE_FILE …
常用的安装命令:rpm -ivh PACKAGE_FILE...
2. GENERAL-OPTIONS(通用选项):
-v:verbose,详细信息;
-vv:输出更加详细的信息;
3. INSTALL-OPTIONS(安装选项):
-h:hash marks,用50个“#”表示进度条,以显示安装进度;
–test:测试安装,检查并报告依赖关系及冲突消息等;
–nodeps:忽略依赖关系,不建议使用;
–replacepkgs:重新安装;
–nosignature:不检查包签名信息,不检查来源合法性;
–nodigest:不检查包完整性信息;
–noscripts:不运行所有安装脚本;
rpm包中包含一些脚本文件,安装rpm包时需要运行这些脚本。这些脚本文件按可以分为preinstall、postinstall、preuninstall、postuninstall四类。
脚本类型 | 脚本运行时段 | 不执行对于脚本时的选项 |
---|---|---|
preinstall | 安装过程开始之前运行的脚本 | –nopre |
postinstall | 安装过程完成之后运行的脚本 | –nopost |
preuninstall | 卸载过程开始执行之前运行的脚本 | –nopreun |
postuninstall | 卸载过程完成之后运行的脚本 | –nopostun |
4. 安装rpm包示例:
(1)安装zsh:
[root@localhost Packages]# rpm -ivh zsh-5.0.2-7.el7.x86_64.rpm
警告:zsh-5.0.2-7.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:zsh-5.0.2-7.el7 ################################# [100%]
(2)测试安装zsh:
[root@localhost Packages]# rpm -ivh --test zsh-5.0.2-7.el7.x86_64.rpm
警告:zsh-5.0.2-7.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中... ################################# [100%]
升级
1. SYNOPSIS:
rpm {-U|–upgrade} [install-options] PACKAGE_FILE …
rpm {-F|–freshen} [install-options] PACKAGE_FILE …
-U:升级或安装;
-F:升级
常用的安装命令:rpm -Uvh PACKAGE_FILE ...
和 rpm -Fvh PACKAGE_FILE ...
2. INSTALL-OPTIONS(安装选项):
–oldpackage:降级;
–force:强制升级;
注意:
(1)不要对内核做升级操作;Linux支持多内核版本并存,因此,应该直接安装新版本内核。
(2)如果某原版本程序包的配置文件安装后被修改过,那么升级时,rpm程序管理器会认为这个修改是有用的,新版本提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供。
卸载
1. SYNOPSIS:
rpm {-e|–erase} [–allmatches] [–nodeps] [–noscripts] [–notriggers] [–test] PACKAGE_NAME …
2. OPTIONS:
–allmatches:卸载所有匹配指定名称的程序包的各版本;
–nodeps:忽略依赖关系;
–test:测试卸载,dry run模式;
查询
1. SYNOPSIS:
rpm {-q|–query} [select-options] [query-options]
2. SELECT-OPTIONS:
PACKAGE_NAME:查询指定的程序包是否已经安装及其版本;
-a, –all:查询所有已经安装过的包;
-f FILE:查询指定的文件是由哪个程序包生成的;
-p, –package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作;
–whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供;
–whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;
3. QUERY-OPTIONS:
–changelog:查询rpm包的changelog;
-l, –list:程序安装生成的所有文件列表;
-i, –info:程序包相关的信息,版本号、大小、所属的包组等;
-c, –configfiles:查询指定的程序包提供的配置文件;
-d, –docfiles:查询指定的程序包提供的文档;
–provides:列出指定的程序包提供的所有的CAPABILIT;
-R, –requires:查询指定的程序包的依赖关系;
–scripts:查看程序包自带的脚本片段;
4. 用法
查询目的 | 对已安装程序包进行查询 | 对未安装程序包进行查询 |
---|---|---|
查询程序安装生成的所有文件列表 | -ql PACKAGE | -qpl PACKAGE_FILE |
查询指定的文件是由哪个程序包生成的 | -qf FILE | |
查询指定的程序包提供的配置文件 | -qc PACKAGE | -qpc PACKAGE_FILE |
查询程序包相关的信息 | -qi PACKAGE | -qpi PACKAGE_FILE |
查询指定的程序包提供的文档 | -qd PACKAGE | -qpd PACKAGE_FILE |
校验
1. SYNOPSIS:
rpm {-V|–verify} [select-options] [verify-options]
2. rpm程序包的来源合法性验证和完整性验证的实现过程:
获取并导入信任的包制作者的密钥:
对于CentOS发行版来说,可使用: rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
3. 验证方式:
(1)安装此组织签名的程序时,会自动执行验证;
(2)手动验证:rpm -K PACKAGE_FILE
数据库维护
SYNOPSIS:
rpm {–initdb|–rebuilddb} [-v] [–dbpath DIRECTORY] [–root DIRECTORY]
–initdb:初始化数据库,当前无任何数据库时可初始化创建一个新的,当前有时不执行任何操作;
–rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;
rpm管理器数据库存放目录路径:/var/lib/rpm。
获取数据库维护帮助文档:CentOS 6上使用man rpm
,CentOS 7上使用man rpmdb
。