程序包:由源代码通过编译成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 ...
使用示例

测试安装

wKiom1bt-CewIEKcAASw0lKGfUM223.bmp安装

wKioL1bt-PeizkXrAAU4BsSUzTY073.bmp                    
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 ...
使用示例:

wKioL1buAL_jrGQnAAG2iI1uBnw681.png

注意:(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 ...
使用示例

wKiom1buCQ2TLiBbAApgpkRnixk844.bmp    
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:查询此程序包文件安装会提供的配置文件
......


使用示例:

wKioL1buCwfwc1e9AAlsFvyS_w4649.bmpwKioL1buC06A8XboAAJi22G9pm8475.pngwKiom1buCvKz60s-AA_HPnNBCZ8584.bmp               
5.校验:-V
使用格式:rpm {-V|--verify} [select-options] [verify-options]
选项:--nodeps:校验依赖性
    --nodigest:不校验包完整性
    --nofiles:不校验文件属性是否发生改变
    ......

    如果不给选项则默认校验所有信息

示例:

wKiom1buDC_RpK9nAApzMiL5zXc975.bmp

wKioL1buDMOS9U3MAAKoVirWDTw751.bmp

wKiom1buDDPgZlcrAAQW_rGx0iA695.bmp


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

wKioL1buDPSzd63FAAGp5jJeODg539.bmp

wKioL1buDPngOR0GAAdBXhUu7So133.bmp


数据库重建:
rpm管理器数据库路径:/var/lib/rpm/,查询操作:通过此处的数据库进行
数据库管理命令:
rpm {--initdb|--rebuilddb} [--dbpath=DIRECTORY] [--root DIRECTORY]
   --initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;当前有时不执行任何操作;
   --rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;
注意:获取此命令的帮助的方法中CentOS6和7中不同
            CentOS 6:man rpm
                CentOS 7:man rpmdb