首页 > 代码库 > 包管理器--RPM

包管理器--RPM

由来和简介

    在linux的初期,那时候还没有包管理器的概念,每个linux用户都是自己手动编译源码包,进行安装,但是编译是个比较复杂的工作,不是每一个使用linux的人,都有这样的能力去编译和安装程序包。

    对于程序包而言,它本身也有组成部分(二进制程序、库文件、配置文件、帮助文件等),它们都分别位于不同的目录,如果是用户自己手动安装,必然卸载的时候,要自己去追踪这些文件。当然,如果想对一个软件进行升级,那更是痛苦不堪的事情。于是,聪明的人类想开发一种软件,它来代替我们去追踪这些包的信息,可以手动安装这些程序,去卸载这些程序,可以升级程序等等,这就是所谓的包管理器。

    包管理器一般来说分为两大分支:一是由Debian开发的dpkg(debian package,也有叫dpt:Debian package tool),它打包出来的程序是.deb的后缀;二是由Red Hat开发的rpm(redhat package manager),后来它成为了工业的标准,所以就其名字的含义就变成RPM is Package Manager,它打包出来的程序是.rpm的后缀的。

    由于在生产环境中,rpm这一分支用的比较多,所以下面都以介绍rpm为主。


功能

    作为包管理器,rpm应该具备怎样的功能呢?首先它必须要有数据库来保存程序包的各种信息:程序名及版本、依赖关系:X --> Y,Z 、功能性说明、安装生成的各文件路径及校验码等等。所以它应该要具备如下的功能:

        1、打包:能够将程序打包成可安装的程序包
        2、安装:能够将程序各个组成部分自动安装到相应的目录下面
        3、卸载:可以将一个程序包的位于不同目录下的文件删除
        4、升级:可以对程序包分析,追踪,进行程序的升级安装
        5、校验:对程序的来源和完整性进行检测
        6、数据库管理:追踪到各个程序包的信息要有个管理策略

 

    从上面的功能来看,包管理器RPM已经为我自动化完成了很多功能,但是它里面还有一个重大的问题没有解决,那就是程序包之间的依赖关系。比如安装x的时候,它依赖于Y,那么不必须先安装Y,再安装X,对于这种依赖关系的问题,RPM可以说无能为力,但是依赖关系又是我们安装程序包的时候,经常要面临的问题。于是在RPM的基础上,开发出了YUM工具,它只是RPM的一个前端工具,专门用来处理包依赖关系。

 

    在这里,提出来一个问题。很多人都会误会的一个问题,安装了YUM,是不是就不需要RPM?

    答:完全不正确,YUM仅仅只是RPM的前端工具,它是用来解决依赖关系的,而对于包的管理还是RPM,YUM工具并不是用来代替RPM的,而是用来弥补RPM不足之处的。

 

规则

    一、RPM包的命名规则

    想要了解RPM包的命名规则,首先要了解源码包的命名规则。

    源码包:name-version.tar.{gz,bz2,xz},其中version包含major(主版本号).minor(副版本号).release(发行号),name是指程序的名字,以tar工具进行打包,可能用gzip或者bzip2或者xzip进行压缩。

 

    rpm包的命名格式:name-version-relase.arch.rpm

    version: major.minor.release,同源代码 

    release: rpm自身的发行号,与程序源码的发行号无关,仅用于标识对rpm包不同制作的修订;同时,release还包含此包适用的OS
    arch: 适用于的硬件平台,例如x86_64

     

    rpm包举例:bash-4.2.3-3.centos5.x86_64.rpm


     二、RPM分包规则

        对于功能比较多的程序,可能还会有分包的概念.比如一个程序有20个功能:常用功能有8个,特殊A:3个,特殊B:6个,二次开发相关功能:3,它会把常用功能打包成主包,把特殊功能和开发相关分别打包成不同的子包.子包的命名必须以主包的名字开头,再跟子包的名字.

        核心包,主包:命名与源程序一致:

        bash-4.2.3-3.centos7.x86_64.rpm

        子包:
        bash-a-4.2.3-3.centos7.x86_64.rpm
        bash-b-4.2.3-3.centos7.x86_64.rpm
        bash-devel-4.2.3-3.centos7.x86_64.rpm


可靠的RPM源

    1、发行的光盘或站点服务器

        安装光盘的DVD1和DVD2上都有YUM包

        国内镜像:

        http://mirrors.163.com

        http://mirrors.sohu.com

    2、项目的官网

        源代码

        rpm包

    3、很多第三方机构或个人制作并公开发布许多rpm包

        http://rpmfind.net

        http://rpm.pbone.net


RPM命令详解

    一、RPM包的安装

    rpm [option] /path/to/package_file 
    
    Option:
        -i: 安装(install)        
        -v: 显示详细信息(verbose)
        -vv: 显示更加详细的信息(verbose)
        -h: 显示进度条
        --test: 仅作测试,并不是真正执行安装
        --nodeps:忽略依赖关系,强行安装
        --replacepkgs:重新安装(如果遇到配置文件被修改过,配置文件会被保留)

    

    所以安装的常用选项组合是:rpm -ivh


    二、RPM包的卸载

        rpm [option] package_name(注意,这里跟上的包名)
        
            -e: 删除(erase)
            --nodeps:忽略依赖关系,强行卸载
            
        如果配置文件安装后被修改,则不会被删除,而会被保留
          warning: /etc/zprofile saved as /etc/zprofile.rpmsave

 

   三、RPM包的升级
        

       rpm [option] /path/to/package_file
           -U:如果程序包没有安装,则进行安装;如果已安装,则进行升级
           -F:只会对已经安装的包进行升级
           -v:显示详细信息
           -h:显示进度条
           --force: 强制升级
           
           常用组合是:rpm -Uvh 或者 rpm -Fvh
           
       注意:不应该对内核执行升级操作,而是安装

    

    四、RPM包的查询        

        1、查询某包是否安装
            rpm -q package_name...
            
        2、查询所有已经安装的包
            rpm -qa 
            按条件过滤:rpm -qa | grep ‘PATTERN‘
            
        3、查询包的描述信息
            rpm -qi package_name
        
            查询信息中英对照
            Name:包名
            Relocations:安装时是否可以自行指定安装位置
            Version:版本号
            Vender:提供商
            Realease:修正号
            Build Date:包的制作日期
            Install Date:包的安装日期
            Build Host:包制作时使用的主机
            Group:包所属的包组
            Source RPM:源码格式的RPM包
            Size:包的大小 
            License:包的许可证
            Signature:签名信息
            Packager:打包人,制作者
            URL:一般都是源码包的地址
            Summary:简要信息
            Description:详细信息
            
        4、查询某包安装生成了哪些文件
            rpm -ql package_name
            
            (1) 查询某包安装生成了哪些配置文件
            rpm -qc package_name
            
            (2) 查询某包安装生成了哪些帮助文件
            rpm -qd package_name
            
            (3) 查询程序包的相关脚本
            rpm -q --scripts package_name
            
                脚本有四类:
                preinstall:安装前脚本
                postinstall: 安装后脚本
                preuninstall: 卸载前脚本
                postuninstall: 卸载后脚本
                
        5、查询某文件是由哪个包安装生成的
            rpm -qf /path/to/some_file
            
        6、对尚未安装的包执行查询
            rpm [option] /path/to/package_file
                -p 是package的意思
                -qpi:查询包信息
                -qpl:查询某包安装会生成哪些文件
                -qpc:查询某包安装会生成哪些配置文件
                -qpd:查询某包安装会生成哪些帮助文件

       


    五、rpm包来源合法性及完整性检验


    前提:在当前系统上导入包的制作者的公钥

        # rpm --import /path/to/key_file


    显示所有已经导入的gpg格式的公钥

        # rpm -qa gpg-pubkey*


    显示密钥的详细信息

        # rpm -qi gpg-pubkey-NAME


    检查包:安装过程中会自动执行


    手动检查:

        # rpm -K /path/to/package_file

        # rpm --checksig /path/to/package_file


        不检查包完整性:

            # rpm -K --nodigest

        不检查来源合法性:

            # rpm -K --nosignature


    六、数据库重建:

        数据库存放目录:/var/lib/rpm


        # rpm --initdb:初始化

        如果事先没有库,会新建一个;如果有,则不新建;


        # rpm --rebuilddb: 重建

        直接重建,覆盖原有的数据库




本文出自 “LC的IT之路” 博客,转载请与作者联系!