我们知道,程序就是指令加上数据的集合或者称为算法加上数据结构的集合。应用程序以源代码和二进制的形式存在:源代码是包含了整个应用程序的编程语言的所有代码的文本文件;二进制则是将源代码经过一系列的转换操作之后得到的可以直接执行的文件。
    使用源代码安装应用程序的步骤为:预处理(预处理器) --> 编译(编译器) --> 字节码 --> 汇编(汇编器) --> 链接(链接器) --> 可以直接执行的二进制程序文件。当我们使用源代码安装应用程序时,不同操作系统的相同操作安装出来的相同应用程序如果直接拿出来放在另一个操作系统上使用可能会不能使用,但如果两台主机的不同操作系统有POSIX的接口标准,便可以直接使用。
    程序包管理器在制定系统中进行程序的安装、卸载、升级、查询及校验等工作。不同的linux发行版本,有着不同的程序包管理器:Debian : dpt (Debian Package Toolkits) ,dpkg工具,.deb后缀名的包文件;RdeHat : rpm (Redhat Package Manager),rpm工具,.rpm后缀名的包文件;S.u.s.e: rpm等。rpm成为linux的程序包管理器的行业标准;rpm是perl编写的,后来用C重写了rpm。
    在制作rpm程序包的时候,通常其制作者会采用分包技术来构建rpm程序包,或者说是根据程序的不同功能,构建多个程序包。被分包的程序包分为主程序包和附属功能包。主程序包和附属功能包具有相同的版本号,发行版本号,操作系统以及兼容平台的标识,仅仅是多了个附属的功能而已。所以,主程序包往往被所有的附属功能包所依赖,不安装主程序包就不能安装附属功能包。
    对于rpm程序包的命名,源码包和二进制包的命名方式是不同的:源码包:software_name-VERSION.src.rpm;二进制包:software_name-VERSION-[release].[os].arch.rpm。
    rpm程序包中文件的组成清单:
        1.程序的文件
        2.文件清单
        3.软件安装或卸载时所运行的脚本文件:共分为四类
            1)preinstall:在正式的安装操作开始之前所运行的脚本,%pre
            2)postinstall:在安装完成之后所执行的脚本,%post
            3)preuninstall:在正式卸载操作开始之前所运行的脚本,%preun
            4)postuninstall:在卸载完成之后所执行的脚本,%postun
    在计算机中安装rpm程序包一般使用rpm或者yum工具。rpm命令行工具可以进行安装、卸载、升级(降级)、查询、文件校验、验证、数据库维护的操作。rpm中的通用选项为-v:显示安装历程的信息,仅仅显示安装软件名;-vv显示非常详细的操作信息。
    rpm中的安装操作:rpm   {-i|--install}   [install-options]   PACK-AGE_FILE ...
    install-options:
        -h,--hash:用50个#来表示安装进度
        --test:并不是真正的安装软件包,仅仅是测试是否在安装时能够正常完成,dry run模式
        --nodeps:忽略因为依赖关系导致的安装错误,不建议使用;
        --replacefiles:替换文件:在安装软件包时,软件包中的文件会直接将原来安装的文件替换;
        --replacepkgs:替换程序包:无需卸载软件包而重新安装
        --noscripts:不运行任何脚本
        --nosignature:不考虑软件包的来源是否合法
        --nodigest:不考虑软件包是否完整
    rpm中的升级操作:rpm -U [install-options] <package_file>+
        如果选择被安装的程序包事先并未安装,则全新安装,如果已经安装了旧版本,则可以升级安装;
      rpm   [-F|--freshen]   [install-options]  <pack゛ge_file>+
        仅仅只能对已经安装的低版本的程序包进行升级安装;
        常用选项:与安装相同
            --oldpackage:用老版本的程序包替换新版本的程序包
            --force强制升级
            注意:不要对内核进行升级操作,linux可以支持多内核,可以直接安装新版本的内核,在启动界面可以手动更换;升级安装可能会带来文件的变化,因此系统默认不会直接更改之前安装过的程序的配置文件,新程序包中的配置文件会被重命名,通常会是:FINENAME.rpmnew
    rpm中的卸载操作:rpm   {-e|--erase}   [--allmatches]   [--nodeps]
    --allmatchs:将卸载所有匹配制定名称的程序包的各个版本;
    --nodeps:卸载时忽略依赖关系,不建议使用
    --test:仅仅测试卸载,dry run模式
    rpm中的查询操作:rpm   {-q|--query}   [select-options]    [query-options]
       直接给出程序包名
       -a,--all查询所有已安装的程序包名
       -f,--file FILE 查找指定的文件是由哪个程序包提供的;
       -p,--package PACKAGE_FILE 对还没有安装的程序包文件中执行查询操作
       [--whatprovides   CAPABILITY] 查询指定的CAPBILITY是由哪个程序包所提供的
       [--whatrequires CAPABILITY]查询指定的CAPBILITY被哪个程序包所依赖

           query-options
               [--changelog]查询rpm程序包的changelog
               -c,--configfiles查询指定程序包中有哪些是配置文件
               -d,--docfiles 查询指定程序包中有哪些文档文件
               -i,--info查询程序包相关的信息,包括版本号,发行号,大小等;


               -l,--list列表显示程序包安装会生成哪些文件
               --provides列出制定程序包提供的所有的CAPABILITY
               -R,--requires:查询指定程序包的依赖关系
               --scripts:查看程序包所携带的脚本的内容
  rpm的校验操作:rpm -V 文件名;用来确认文件是否被修改或覆盖,如被改变则在标准输出有一系列输出,否则无输出。
  rpm的数据库管理操作:数据库的初始化和重建,数据库位于/var/lib/rpm。--dbpath指定数据库位置,--rebuilddb重建数据库,--initdb初始化数据库。
  在使用rpm程序包管理工具时,总是会遇到依赖问题,导致安装一个所需的软件包会很麻烦,所以对于这种弊端开发出了yum这种程序包管理工具,