由于Linux是开源的系统,所有在Linux上运行的程序有很多不同的作者提供源代码,这些程序包有C语言、C++语言、perl语言、python语言、或ruby语言等其他语言。对于不同语言的程序包,他们的安装方式不同,不同的语言开发的程序需要不同的API(应用接口),对于用户来说,非常之不方便,而且使新的用户望而却步。操作系统发行商主要负责通过自己的方式,将程序编程成程序包,给用户直接使用,而且程序包之间还存在依赖关系,如A依赖B才能安装,B又依赖C安装,因此系统发行商开发出了程序包管理器。

程序在编译之前都是源代码,编译之后转换为二进制程序,还有帮助文件、配置文件、库文件四个部分组成。在linux系统中这四个部门会存放于如下目录中:

  二进制程序: /bin , /sbin , /usr/bin , /usr/sbin , /usr/local/bin ,/ user/loacl/sbin , /opt/bin ,/opt/sbin

    库文件: /lib , /lib64 , /usr/lib , /usr/lib64 , /usr/loacl/lin , /usr/local/lib64

   配置文件: /etc , /etc/DIR , /usr/share/{etc,,conf}

       帮助文件: /usr/share/man , /usr/share/doc , /usr/loacl/share/man

      注意:有些特殊的应用程序可能会将执行文件放置于libexec目录。也可以单独安装在某一目录下。

程序包管理器对应用程序打包成特定的格式,对兼容的程序包直接进行安装、卸载、升级、查询。常见的包管理器有:deb的Debian和和Red Hat的.rpm。

程序包的格式为(rpm格式的):appname-VERSION-ARCH-RELEASE .ARCH .rpm ,其中VERSION为版本号有major:主版本号和minor:次版本号; RELEASE:发行号,包自身的修订号,有时候还会包含适用于os信息,比如bash-4.3.2-2.centos6.x86_64.rpm中的2.contos6releaseARCH为适用的平台,如x86:i386、i586、i686、x86_64amd64等,如显示noarch则此程序包与平台无关都可以兼容。由于一个程序包中蕴含多种功能,有些功能不常用,所以程序包有分包机制,可以安装自己需要的,一般主包都会安装,分为核心包(主包)和子包(支包),核心包的命名与源项目的命名一致,子包的命名为源项目名称附加子包中文件提供的功能组成如下:

           php-pecl-apc.x86_64(主包)、php-pecl-apc-devel.i686(子包)、php-pecl-apc-devel.x86_64(子包)

获取程序包的途径主要有四种,系统的发行光盘、程序包的官方站点、第三方组织或通过搜索引擎。、                           Centos系统上程序rpm包管理有四个方式,安装、升级、卸载、查询、检验。下面讲一下常用的命令。

    

安装:

                    rpm {-i | --install } [install-option] PACKAGE_FILE1…

              -h : hash ,以#来显示安装进度

                                 - v--verbose: 显示安装过程中的详细信息:

                                  -ivvh:在选项中加v可以更详细的显示此程序包安装的哪些文件,具体进度

               -ivvvh:可以添加多个v

               安装时常用的组合:-ivh(查看以#显示的安装进度) , -ivvh

               --test :不执行真正的安装过程,而仅报告依赖关系及冲突信息等;

            例如:[root@localhost Packages]# rpm -i zsh-4.3.10-7.el6.x86_64.rpm  安装此程序包后,没有回馈其它信息,说明已经安装成功,可以通过which命令查看,是否已经安装了zsh。

        例如通过-ivh选项可查看安装进度  

           [root@localhost Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm 

            Preparing...                ########################################### [100%]

            1:zsh                    ########################################### [100%]

         例如:使用--test选项来测试安装;

            [root@localhost Packages]# rpm -ivh --test zsh-4.3.10-7.el6.x86_64.rpm 

             Preparing...                ########################################### [100%]

此外,由于程序包是由众多目的的小程序组成,所以程序包之间存在的依赖性关系很强,譬如A需要B安装,B还需要C完成等,程序包之间的依赖关系非常复杂。

例如:安装php-5.3.3-38.el6.x86_64.rpm需要依赖php-cli(x86-64)和php-common(x86-64)。

            [root@localhost Packages]# rpm -ivh --test php-5.3.3-38.el6.x86_64.rpm 

             error: Failed dependencies:

     php-cli(x86-64) = 5.3.3-38.el6 is needed by php-5.3.3-38.el6.x86_64

     php-common(x86-64) = 5.3.3-38.el6 is needed by php-5.3.3-38.el6.x86_64

 可以通过选项---nodeps来忽略依赖关系,副作用能够安装成功,但未必能够运行成功。若一不小心删除了某些文件,可以通过--replacepkgs选项来覆盖安装此程序包,还可以通过--force强制安装。

还能够通过选项来升级程序包

    升级:

     rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...

           -U:升级或安装       

      rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

           -F:升级

       组合: -Uvh ,-Fvh与安装选项一样在选项中加v可以显示详细的升级或安装的信息,与安装类似还有 --test(安装测试)、--nodeps(忽略依赖关系安装)、--force(强制安装)或者 --oldpackage(用于降级到旧版本)。不过需要注意的是,一定不要对内核执行升级,Linux允许多内核共存,所以可以直接安装多个不同版本的内核。如果程序包的配置文件安装后曾被修改,升级时,新版本的配置文件不会覆盖老版本的配置文件;而是把新版本的配置文件重命名(加后缀.rpmnew)后保存。

 

卸载:

        移除已经安装的程序包

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

      简单用法: rpm -e PACKAGE_NAME...

      --allmatches: 如果一个程序包同时安装多个版本,则此选项一次全部卸载;

      --test :测试卸载; 

      --nodeps:忽略依赖关系;

        注意:如果程序包的配置文件安装后曾被修改,卸载时,此文件通常不会被删除,而是被重命名(加后缀.rpmsave)后留存;

 

查询:

          查询某包是否已经安装,以及检查安装的所有包,还可以查看某包的详细信息;

           rpm {-q|--query} [select-options] [query-options]

 

           [select-options]

                 1、查询某包或某些包是否安装

                            rpm -q PACKAGE_NAME

        2、查询已经安装的所有包

                            rpm -qa

       3、查询某个文件是由哪个包安装生成;

                            rpm -qf /PATH/TO/SOMEFILE

       4、查询尚未安装的包文件的相关信息

             -p

             rpm -qpi PACKAGE_FILE

 

            [query-options]

                 1、查询某包的简要说明信息;

                      rpm     -qi     PACKAGE_NAME

                     例如 : rpm    -qi      zsh

                 2、查询某包安装生成的文件列表;

                      rpm  -ql  PACKAGE_NAME

                  3、查询某包安装完成后生成的所有配置文件

                      rpm  -qc PACKAGE_NAME

        4、查询某报安装完成生成的所有帮助文件

                      rpm -qd PACKAGE_NAME

        5、查询某包制作时随版本变化的changelog信息;

                     rpm -q --changelog PACKAGE_NAME 

                  6、查询某包提供的capabilities

          rpm -q --provides PACKAGE_NAME

                   7、查询包所依赖的capabilities

                        rpm -q --requires PACKAGE_NAME

                    8、查询某包安装或卸载时执行脚本;

                         rpm -q --scripts PACKAGE_NAME         

                 脚本有四类:

                                                       preinstall :安装过程开始之前执行的脚本;

                                                       postinstall : 安装过程完成之后执行的脚本;

                                                       preuninstall :卸载开始之前执行的脚本

                                                       postuninstall: 卸载过程完成之后执行的脚本;

例如:查询zsh的简要信息;

[root@localhost Packages]# rpm -qi zsh

Name        : zsh                          Relocations: (not relocatable)

Version     : 4.3.10                            Vendor: CentOS

Release     : 7.el6                         Build Date: Mon 25 Nov 2013 01:40:59 AM CST

Install Date: Sat 11 Apr 2015 05:08:33 PM CST      Build Host: c6b9.bsys.dev.centos.org

Group       : System Environment/Shells     Source RPM: zsh-4.3.10-7.el6.src.rpm

Size        : 5009102                          License: BSD

Signature   : RSA/SHA1, Mon 25 Nov 2013 03:33:46 AM CST, Key ID 0946fca2c105b9de

Packager    : CentOS BuildSystem <http://bugs.centos.org>

URL         : http://zsh.sunsite.dk/

Summary     : A powerful interactive shell

Description :

The zsh shell is a command interpreter usable as an interactive login

shell and as a shell script command processor.  Zsh resembles the ksh

shell (the Korn shell), but includes many enhancements.  Zsh supports

command line editing, built-in spelling correction, programmable

command completion, shell functions (with autoloading), a history

mechanism, and more.


校验:

 

        查询包安装之后生成的文件是否发生了改变;    

        rpm {-V|--verify} [select-options] [verify-options]

         常见用法:rpm -V PACKAGE_NAME 

[root@localhost Packages]# rpm -V zsh

S.5....T.  c /etc/zshrc

S表示文件大小更改,5表示校验码也更改了,T表示修改时间戳,.表示未修改。


文件改变信息的返回值所代表修改的含义:

       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/RPM-GPG-KEY-FILE

                        例如:# rpm --import RPM-GPG-KEY-Centos-6     导入含有公钥的文件            

                                    验证: rpm {-k | --checksig } PACKAGE_FILE

                          --nosignature :不检查来源合法性

                                                            --nodigest : 不检查完整性         

[root@localhost cdrom]# rpm --import RPM-GPG-KEY-CentOS-6

[root@localhost cdrom]# cd Packages/

[root@localhost Packages]# rpm -K zsh-4.3.10-7.el6.x86_64.rpm 

zsh-4.3.10-7.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

如上示例,通过从光盘镜像文件获取的含有公钥的文件,验证zsh-4.3.10-7.el6.x86_64.rpm此程序包的来源的合法性,如上验证md5码OK。


    rpm管理器数据库:/var/lib/rpm

    重建数据库:

    rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY]

       --initdb: 初始化数据库,即数据库完全不存时,可新建之;

       --rebuilddb: 无论当前数据存在与否,都会直接重建此库;

小结,此文讲述了rpm的基本管理:安装、升级、卸载、查询和校验;还有程序包的合法性的验证以及数据库的管理。