在linux中的应用程序结构形式分为三种: 1)源代码形式 2)二进制形式 3)程序包形式 其中源代码是最权威的,二进制形式经过了一系列的编译、汇编、连接等等其他操作得到可以执行的程序及其他相关的文件,而程序包形式则是二进制形式进一步进行操作,使之可以自动安装程序包中的所有文件,当然在卸载的时候,也可以一并删除; 一般来说,我们对于程序包形式的程序的操作比较常用。比较方便。

有了程序包之后,我们就需要程序包管理器来管理程序包,借此来方便终端用户的安装、卸载、升级、安装信息查询及校验等工作;

我们在这只说Redhat系列的linux的使用的管理器;用.rpm后缀名的软件包;

rpm的命名规则 源代码包: name-VERSION.tar.gz(纯源码包) name-VERSION.src.rpm(rpm封包的源代码包) VERSION: Major.Minor.Release Major: 主版本号,通常只有程序进行了重大的功能改进才会修改; Minor:次版本号,通常在在某个主版本中的对某个特定的功能进行改进或添加新功能才会修改 Release:发行版本号,一般修复bug或进行代码优化都会更改;

                        如:apache-tomcat-7.0.63.tar.gz
     
   二进制包:
            name-VERSION-[release].[os].arch.rpm
                VERSION: Major.Minor.Release
                [Release]:rpm封包的发行版本号
                [os]:此程序包所能够支持的操作系统的版本;如:el7(RHEL7,CENTOS7),suse11,fedora21...
                arch:此程序包所依赖的硬件平台类型;
                    i386,x64(amd64),ppc,sparc,noarch,...

                    如:hping3-0.0.20051105-24.el7.x86_64.rpm

    在制作rpm程序包时,通常其制作者会根据自己的理解将程序编译后的结果分别放置于不同的rpm包中,用以实现对于该程序的不同需求;将此种封包方式,称为分包技术;一旦程序被分包,则程序包就被分为两类:
        主程序包:
            name-VERSION-[release].[os].arch.rpm
        子程序包(分支程序包):
            name-function-VERSION-[release].[os].arch.rpm
                function:
                    devel:开发包;
                    utils:工具包;
                    libs:共享库包;
                    manual:离线帮助文档包;
                    ...

rpm命令行工具: 功能: 1.将编译好的应用程序的各个文件打包成一个或多个程序包 2.支持rpm程序包的安装、卸载、升级、降级、查询、校验及程序包信息数据库管理功能;

    rpm程序包文件的组成:
        1.被封包的程序文件;
        2.文件清单
        3.程序在安装或卸载是所需要运行的脚本,共有四种:
            preinstall:在正式安装操作开始之前所需要运行的脚本,标识为"%pre"
            postinstall:在安装完成之后所需要运行的脚本,标识为"%post"
            preuninstall:在正式的卸载操作开始之前所需要运行的脚本,标识为"%prsun"
            postuninstall:在卸载完成之后所需要运行的脚本,标识为"%postun"

        注意:在一个rpm程序包中,并不一定同时有哦这四类脚本,也可以没有这些脚本;

    rpm数据信息的数据库(公共):
        目录:/var/lib/rpm

    rpm程序包的获取途径:
        1.系统的发行版光盘;
        2.官方的文件服务器或者镜像站点;
            阿里云镜像
            网易镜像
            搜狐镜像 mirror.souhu.com
            ...
        3.某个应用程序项目的官方站点;
        4.第三方自组织制作的rpm程序包站点;
            Fedora EPEL:Extra Package for Enterprise Linux; 红帽官方的社区组织,通常来说,在上述的镜像站点中也会包括EPEL镜像
        5.某些专用你的搜索引擎:
            http://pkgs.org
            http://rpmfind.net
            http://rpm.pbone.net
        6.自己动手制作rpm程序包

rpm命令行工具: rpm - Red Hat 包管理器

OPSIS

QUERYING AND VERIFYING PACKAGES: rpm {-q|--query} [select-options] [query-options] rpm {-V|--verify} [select-options] [verify-options] rpm --import PUBKEY ... rpm {-K|--checksig} [--nosignature] [--nodigest] PACKAGE_FILE ...

INSTALLING, UPGRADING, AND REMOVING PACKAGES: rpm {-i|--install} [install-options] PACKAGE_FILE ... rpm {-U|--upgrade} [install-options] PACKAGE_FILE ... rpm {-F|--freshen} [install-options] PACKAGE_FILE ... rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...

安装:rpm {-i|--install} [install-options] PACKAGE_FILE ... install-options: -h,--hash:用“#”表示安装进度条; --force:强制安装进行,无论是否有错误发生; --test:并非真正安装软件包,仅仅是测试安装过程是否能够正常进行;dry run --nodeps:忽略因为依赖关系导致的安装错误;不建议使用; --replacefiles:在安装程序包时,程序包中的文件会直接替换已经存在的文件;若不使用该选项,在安装程序包中的文件之前,先将原有的同名文件名改名为filename.rpmsave --replacepkgs:无需卸载已安装程序包而重新安装之; --noscripts:在安装前及安装后均不允许安装相关脚本; --nopre:不运行安装前脚本 --nopost:不运行安装后脚本 --nosignature:跳过校验程序包来源的合法性; --nodigest:跳过校验程序包完整性; --oldpackage:降级安装,指定的安装的程序包的版本低于当前已经安装的程序包的版本; 升级: rpm {-U|--upgrade} [install-options] PACKAGE_FILE ... rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

相比较而言:两个选项有下列特点:
    -U:既可以对已经安装的程序包进行升级或降级安装,又可以在未安装该程序包时进行全新安装;可以包括部分-i安装模式的功能;
    -F:仅能够对已经安装的程序进行升级或降级;

        -h,--hash:用“#”表示安装进度条;
           --force:强制安装进行,无论是否有错误发生;
           --test:并非真正安装软件包,仅仅是测试安装过程是否能够正常进行;dry run
           --nodeps:忽略因为依赖关系导致的安装错误;不建议使用;
           --replacefiles:在安装程序包时,程序包中的文件会直接替换已经存在的文件;若不使用该选项,在安装程序包中的文件之前,先将原有的同名文件名改名为filename.rpmsave
           --replacepkgs:无需卸载已安装程序包而重新安装之;
           --noscripts:在安装前及安装后均不允许安装相关脚本;
               --nopre:不运行安装前脚本
               --nopost:不运行安装后脚本
           --nosignature:跳过校验程序包来源的合法性;
           --nodigest:跳过校验程序包完整性;
           --oldpackage:降级安装,指定的安装的程序包的版本低于当前已经安装的程序包的版本;

  注意:
       1.强烈建议,不要使用此方法对内核进行升级操作;
       2.升级安装程序包可能会带来文件的变化,或引入为指导bug或漏洞,因此,在实施升级操作之前,必须要进行可行性分析;

卸载:
    rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...

    注意:卸载程序包时,rpm命令的参数是程序名称而非程序包名称;
        --allmatches:卸载所有能够匹配指定名称的程序包的各个版本;
        --nodeps:卸载时忽略依赖关系;
        --test:并非真正卸载,而是卸载过程是否能够正常完成;dry run
					查询:
    rpm {-q|--query} [select-options] [query-options] 
        select-options:
            PACKAGE_NAME:指定查询的程序名称,不是程序包名称;
            -a,--all:查询所有已安装的程序包名称;
            -f,--file FILE:查询指定的文件是由那个程序包提供的;
            -p,--package PACKAGE_FILE:查询尚未安装的程序包文件中的文件清单;
            --whatprovides CAPABILITY:查询指定的CAPABILITY是由那个程序包提供的;
            --whatrequires CAPABILITY:查询指定的CAPABILITY被那个程序包所依赖;

        query-options:
            --changelog:查询程序包的历次的版本变更记录;
            -c,--configfiles:查询指定的程序包中包含哪些配置文件;
            -d,--docfiles:查询指定的程序包中有哪些文本文件;
            -i,--info:查询指定程序包的相关属性信息;
            -l,--list:列表显示查询结果;
            --provides:列出指定程序包所提供的所有的CAPABILITY;
            -R,--requires:列出指定程序包的依赖关系;
            --scripts:查询程序包所携带的脚本的内容;

    常用的选项组
        -qa 
        -qf | -qc | -qd | -ql PACKAGE_NAME
        -qpl | -qpc | -qpd | -qpl PACKAGE_FILE
					校验:
    rpm {-V|--verify} [select-options] [verify-options]

        校验状态:
        S file Size differs
  M Mode differs (includes permissions and file type)
  5 digest (formerly MD5 sum) differs
  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

认证: rpm --import /PATH/TO/SOMEFILE 导入指定的认证密钥的路径:

  rpmkeys {-K | --checksig } PACKAGE_NAME..
      检查指定的程序包的数字签名信息;

数据库管理: /var/lib/rpm --initdb 初始化数据库 --rebuilddb 从已安装软件包包头重建数据库反向列表