全部的软件都是由文件格式的程序代码(即源代码),通过编译成为一个可执行二进制文件;对于一个软件来讲,其包含二进制程序、库文件、配置文件以及帮助文件。在应用中,每次要安装程序时经过找源代码而后去编译成二进制文件,这个过程要花费大量的时间,因此就有了程序包管理器。程序包管理器的功能是:将编译好的应用程序的各组文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操做。php
咱们能够将这种软件包管理器称为手动安装程序的软件包管理器,为何成为手动安装程序的软件包管理器呢?
由于这种软件包管理器,在软件安装的过程当中不能解决包之间的依赖管理,好比,A程序的运行要基于B程序的某些库文件才能运行,因此在安装A程序以前必须安装A程序;固然也有可能出现这种状况:B程序的运行也要基于A程序的某些库文件才能运行,这样就造成了先有鸡仍是先有蛋的问题。前端
利用这种程序包管理器咱们只能手动解决包之间的依赖关系。所谓自动解决依赖关系,无非就是在某个程序安装以前对该程序包文件进行分析看其都依赖哪些程序,而后将这些程序一并安装,从而解决软件包的依赖文件,咱们将自动解决依赖关系的工具称为解决依赖关系的前端工具。node
Linux发行版本主要分为两类:类RedHat和类Debain,不一样的发行版本上所使用的程序包管理器各不相同,下图是各发行版本所使用的程序包管理器:redis
一、程序包的组成清单(每一个程序包都单独实现)数据库
其中包含文件清单和安全或卸载时运行的脚本centos
二、数据库(公共)安全
程序包管理器数据库存放的位置在/var/lib/rpm/目录下,其中包含程序包的名称和版本,依赖关系,功能说明以及安装生成的各文件的文件路径及校验码信息等等。服务器
一、系统发行版的光盘或官方的文件服务器(或镜像站点)ide
http://mirrors.aliyun.com http://mirrors.sohu.com http://mirrors.163.com
二、项目的官方站点函数
三、第三方组织:
(1) EPEL (2) 专门搜索rpm的搜索引擎 http://pkgs.org http://rpmfind.net http://rpm.pbone.net
四、本身作rpm包
在看rpm包命名格式以前先来看下源代码的命名格式:
源代码:name-VERSION.tar.gz 其中VERSION包含: major.minor.release
rpm包命名格式
name-VERSION-release.arch.rpm VERSION: major.minor.release --> 其为源代码的发行号 release.arch: rpm包的发行号 architecture: i386, x64(amd64), ppc, noarch redis-3.0.2-1.centos7.x64.rpm
拆包:主包和子包;Linux中的软件包通常有一个主程序的安装包,再就是子程序包,所谓的子程序包就是该软件上的某一功能的安装包,或者说是该程序的一个插件。
主包: name-VERSION-release.arch.rpm 子包: name-function-VERSION-release.arch.rpm
rpm程序包管理器主要实现的功能有:安装、升级、查询、校检以及数据库维护
rpm [OPTIONS] [PACKAGE_FILE]
-i, --install: 安装
-U, -update, -F, --freshen: 升级
-e, --erase: 卸载
-q, --query: 查询
-V, --verify: 校验
--builddb, --initdb: 数据库的建立
rpm {-i|--install} [install-options] PACKAGE_FILE ...
# rpm -ivh PACKAGE_FILE GENERAL OPTIONS -v: verbose,详细信息 -vv: 更详细的输出
[install-options]
-h: hash marks 输出进度条;每一个#表示2%的进度; --test: 测试安装,检查并报告依赖关系及冲突消息等; --nodeps: 忽略依赖关系; 注意:当忽略依赖关系安装程序时,程序安装完成后,有可能不能正常运行,因此该安装选项不建议使用; --replacepkgs: 从新安装; 好比说,将某程序的配置文件中信息修改后,想还原该配置文件,可是忘记了以前的配置,此时能够将该配置文件删除后,利用该安装选项对该程序从新安装来恢复其某个配置文件; --nosignature: 不检查包签名信息,不检查包来源的合法性; --nodigest: 不检查包完整性信息; --noscripts: 安装时不执行脚本文件
注意:rpm能够自带脚本
rpm包中的脚本分四类: preinstall: 安装过程开始以前运行的脚本,%pre,--nopre postinstall: 安装过程完成以后运行的脚本,%post,--nopost preuninstall: 卸载过程真正开始执行以前运行的脚本,%preun,--nopreun postuninstall: 卸载过程完成以后运行的脚本,%postun,--nopostun
安装命令演示
(1) 安装一个rpm软件包
(2) 忽略依赖关系安装
安装php的rpm包时出现依赖关系错误,此时能够忽略依赖关系对软件包进行安装
(3) 测试安装
(4) 从新安装
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
-U: 升级或安装 -F: 升级 rpm -Uvh PACKAGE_FILE... rpm -Fvh PACKAGE_FILE...
[install-options]
--oldpackage: 降级 --foece: 强制升级
注意:
(1) 不要对内核作升级操做;Linux支持多内核版本并存,所以,直接安装新版内核; (2)若是某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;
rpm {-e|--erase} [--allmatches] [--justdb] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
--allmarches: 卸载全部匹配指定名称的程序包的各版本; --nodeps: 忽略依赖关系; --test: 测试卸载,dry run模式
rpm {-q|--query} [select-options] [query-options]
[select-options]
PACKAGE_NAME: 查询指定程序包是否已经安装,及其版本; -a, --all: 查询全部已经安装过的包; -f FILE: 查询指定的文件由哪一个程序安装包生成; -p, --package PACKAGE_FILE: 用于实现对未安装的程序包执行查询操做; --whatprovides CAPABILITY: 查询指定的CAPABILITY由哪一个包提供; --whatrequires CAPABILITY: 查询指定的CAPABILITY被哪一个包所依赖;
[query-options]
--changelog: 查询rpm包的changelog; -l, --list: 程序包安装生成的全部文件列表; -i, --info: 程序包相关的信息,版本号、大小、所属组等; -c, --configfiles: 查询指定的程序提供的配置文件; -d, --docfiles: 查询指定的程序包提供的文档; --provides: 列出指定程序包提供的全部CAPABILITY; -R, --require: 查询指定程序包的依赖关系; --scripts: 查询程序包自带的脚本片断;
查询命令演示
(1) 查询指定的安装后的程序
(2) 查询指定的文件由哪一个程序安装包生成
(3) 查询程序包安装后生成的文件列表或者某程序的文件列表
(4) 列出指定程序包提供的全部CAPABILITY
(5) 查询指定的CAPABILITY由哪一个包提供
(6) 查询指定的CAPABILITY被哪一个包所依赖
(7) 查询指定程序包的依赖关系
(8) 查询程序包自带的脚本片断
软件包的校验通常是验证其来源的合法性以及软件包完整性的验证;来源合法性验证利用数字签名奇数,完整性验证利用单项函数加密技术。
软件包校验命令
rpm {-V|--verify} [select-options] [verify-options]
校验过程:
(1) 首先获取并导入信任的包制做者的密钥
对于CentOS发行版来讲,利用下面的命令进行密钥的导入: # rpm -import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
(2) 验证
a. 安装此组织签名的程序时,会自动执行验证; b. 手动验证:rmp -K PACKAGE_FILE
rpm管理器数据库的路径/var/lib/rpm/
获取rpm数据库工具的帮助
CentOS 6: man rpm CentOS 7: man rpmdb
数据库重建的命令
rpm {--initdb|--rebuilddb}
--initdb: 初始化数据库,当前无任何数据库可实现初始化建立一个新的;当前有时不执行任何操做; --rebuilddb: 从新构建,经过读取当前系统上全部已经安装过的程序 包进行从新建立;