程序包:由源代码通过编译成CPU可执行的二进制格式,再把这些文件(二进制程序、库文件、配置文件、帮助文件)组织成为一个或有限几个“包”文件。
程序包的组成:1、程序包的组成清单(每个程序包都单独实现);
文件清单
安装或卸载时运行的脚本
2、数据库(所有rpm包的数据库都是公共的)
程序包的名称和版本;
依赖关系;
功能说明;
安装生成的各文件的文件路径及校验码信息;
......
CentOS中rpm包的数据库在/var/lib/rpm/
程序包的作用:将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操作。
对程序包的安装,升级,卸载和查询等管理操作是通过程序包管理器实现
各发行版中的程序包管理器:
debian:dpt, dpkg, 程序包文件标示为以".deb"结尾
redhat:rpm, 程序包文件标示为以".rpm"结尾
S.u.S.E:rpm, ".rpm",
Gentoo:ports
程序包的命名规则:
源代码包:name-VERSION.tar.gz
VERSION:major.minor.release
示例:redis-3.0.2.tar.gz
rpm包:name-VERSION-release.arch.rpm
VERSION:major.minor.release:程序包的版本号
release.arch:rpm包的发行号和架构
示例:redis-3.0.2-1.centos7.x64.rpm
拆包:源代码安装时可以指定功能,但程序包都是别人或组织以大众需求进行编译而成的,为了避免安装一堆用不到的功能,所以常常是不同功能的文件打包在不同的包内。以主包为基准包含主要的功能,后面就是各种不同的支包(开发包,库包,工具包等等)。
主包:name-VERSION-release.arch.rpm
支包:name-function-VERSION-release.arch.rpm (function:devel, utils, libs, ...)
获取程序包的途径:(1) 系统发行版的光盘或官方的文件服务器(或镜像站点):
http://mirrors.aliyun.com,
http://mirrors.sohu.com,
http://mirrors.163.com
(2) 项目的官方站点
(3) 第三方组织:
(a) EPEL
(b) 搜索引擎
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
(4) 自己做rpm包
CentOS系统上可使用rpm命令管理程序包:
rpm命令:
使用格式:rpm [OPTIONS] [PACKAGE_FILE]
选项OPTIONS: 安装:-i, --install
升级:-U, --update, -F, --freshen
卸载:-e, --erase
查询:-q, --query
校验:-V, --verify
数据库维护:--builddb, --initdb
1.安装:-i
使用格式:rpm {-i|--install} [install-options]PACKAGE_FILE ...
安装选项[install-options]:-h:hash marks输出进度条;每个#表示2%的进度;
-v:verbose,详细信息
-vv:更详细的输出
--test:测试安装,检查并报告依赖关系及冲突消息等;
--nodeps:忽略依赖关系(不建议,安装之后可能无法正常使用))
--replacepkgs:重新安装(不会修改之前的配置文件)
--nosignature:不检查包签名信息,不检查来源合法性;
--nodigest:不检查包完整性信息;
常见使用搭配:rpm -ivh --test PACKAGE_FILE ...
:rpm -ivh PACKAGE_FILE ...
使用示例
测试安装
2.升级:-U,-F
使用格式:rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...(升级或安装)
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...(升级)
选项:--oldpackage:降级;
--force:强制升级;
常见使用搭配: rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
使用示例:
注意:(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核;
(2) 如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供。
3.卸载:-e
使用格式:rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...
选项: --allmatches:卸载所有匹配指定名称的程序包的各版本;
--nodeps:忽略依赖关系
--test:测试卸载,dry run模式
--noscripts 不运行脚本
常见使用搭配:rpm -e --nodeps --test PACKAGE_NAME ...
rpm -e --nodeps PACKAGE_NAME ...
rpm -e --allmateches --nodeps PACKAGE_NAME ...
使用示例
4.查询:-q
使用格式: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包的changlog;
-l, --list:程序安装生成的所有文件列表;
-i, --info:程序包相关的信息,版本号、大小、所属的包组,等;
-c, --configfiles:查询指定的程序包提供的配置文件;
-d, --docfiles:查询指定的程序包提供的文档;
--provides:列出指定的程序包提供的所有的CAPABILITY;
-R, --requires:查询指定的程序包的依赖关系;
--scripts:查看程序包自带的脚本片断;
常见使用搭配:
rpm -qi PACKAGE_NAME:查询已安装的程序包的相关信息
rpm -qf FILE:查询此文件由哪个程序包安装生成
rpm -qc PACKAGE_NAME:查询此程序包提供的配置文件;
rpm -ql PACKAGE_NAME:查询此程序包安装生成的所有文件列表
rpm -qd PACKAGE_NAME:查询此程序包提供的文档;
rpm -qpi PACKAGE_FILE:查询此程序包文件的相关信息
rpm -qpl PACKAGE_FILE:查询此程序包文件安装会生成的所有文件列表
rpm -qpc PACKAGE_FILE:查询此程序包文件安装会提供的配置文件
......
使用示例:
5.校验:-V
使用格式:rpm {-V|--verify} [select-options] [verify-options]
选项:--nodeps:校验依赖性
--nodigest:不校验包完整性
--nofiles:不校验文件属性是否发生改变
......
如果不给选项则默认校验所有信息
示例:
S.5....T. :校验输出字符串含义(一个九个字段, “.”表示此项校验通过):
1, S: file Size differs
2, M: Mode differs (includes permissions and file type)
3, 5: digest (formerly MD5 sum) differs
4, D: Device major/minor number mismatch
5, L: readLink(2) path mismatch
6, U: User ownership differs
7, G: Group ownership differs
8, T: mTime differs
9, P: caPabilities differ
包来源合法性验正和完整性验正:
来源合法性验正:包的制作者计算出程序包文件的特征码,然后用自己的私钥进行加密。提供公�和程序包给用户,用户通过公钥对程序包解密。能够正常解密则认为此包来源合法。
完整性验正:然后通过计算程序包文件的特征码进行比对,如果一致,则认为其完整性通过。
获取并导入信任的包制作者的公钥:
CentOS发行版可以这样导入公钥:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
导入信任的包制作者的密钥之后的验证过程
(1) 安装此组织签名的程序时,会自动执行验正;
(2) 也可选择手动验正:rpm -K PACKAGE_FILE
数据库重建:
rpm管理器数据库路径:/var/lib/rpm/,查询操作:通过此处的数据库进行
数据库管理命令:
rpm {--initdb|--rebuilddb} [--dbpath=DIRECTORY] [--root DIRECTORY]
--initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;当前有时不执行任何操作;
--rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;
注意:获取此命令的帮助的方法中CentOS6和7中不同
CentOS 6:man rpm
CentOS 7:man rpmdb