; rpm详解 | Linux运维部落

rpm详解

rpm详解

rpm详解

  • rpm使用方法

  • rpm起源

  • rpm是什么

  • rpm命名格式

  • rpm优缺点

  • rpm获取注意

  • rpm命令使用

rpm起源

 由于在linux中安装应用程序需要源码包编译安装,对于非专业人员而言难度太大,因而出现一种将源码编译好的二进制程序,库文件,配置文件,帮助文件等打包成一个或多个特定格式的程序包,而管理这类包的工具之一,则称为rpm.

rpm是什么

rpm 是 reahat package manage,最开始由redhat公司在其rhel系统上提供的程序包管理器,但是由于rpm的使用十分的方便,因此现在rpm是rpm is package manager,成为linux中通用的程序包管理器之一.

rpm命名格式

首先我们先了解一下,此类程序包的命令方法.直接上实例更加明显,
    php-5.4.16-21.el7.x86_64.rpm
格式为name-VERSION-rpm_release.os.arch.rpm
name:程序的名称,php
VERSION:程序源码包的版本号,5.4.16
rpm_release:rpm的发行号,21
os:操作系统版本,el7
arch:编译此包的cpu架构,x86_64
注:arch中有noarch,其表示此包可在任何架构平台上安装;

对于用户而言,程序能够运行则足够,但是对于某些需要在此程序上进行二次开发,或者添加额外组件的专业人员,那该怎么办呢?
因此rpm有一个拆包的机制,将一个程序分为主包跟其子包来管理,一般用户只需要安装主程序就能稳定使用,专业人员根据自己需求去安装其它子包.以下来看看哪些是子包,
    openssl-1.0.1e-34.el7.x86_64
    openssl-devel-1.0.1e-34.el7.x86_64
    openssl-libs-1.0.1e-34.el7.x86_64
子包格式为application-function-VERSION-rpm_release.os.arch.rpm
function:该程序的某功能组件
常见的有:libs-->库文件
         utils-->工具程序
         devel-->开发组件

rpm优缺点

优点

 为了更好的管理程序包的安装,卸载,更新和查询等操作,rpm提供
  1.rpm包的组成文件列表(每个rpm包所必有的)
  2.rpm包安装或卸载时的脚本信息
  3.公共数据库保存
            程序包的名称和版本
            依赖关系
            功能说明
            安装生成的各文件的文件路径及校验码信息
            等信息

缺点

    1 rpm包都是在特定环境定制的,因此对安装环境有所要求.
    2 在linux中,各程序之间的依赖关系由作者所设计,但由于程序包多种多样,其依赖关系则非常的复杂,如果安装一个应用程序,它会需要很多其它程序,才能正常运行起来,在安装中很常见.因此这在rpm中是个弊端.

rpm获取注意

 由于rpm包是源码编译再将其打包,则rpm包也随处可见,任何人都能够进行发布rpm包.我们所需注意的是
 1.包的来源性
 2.包的完整性

rpm命令使用

rpm作用有:安装,卸载,更新,查询,校验常用功能

rpm 
     RPM Package Manager
     rpm包管理器
     rpm [options] PACKAGE_FILE ...
基本选项:
    --version:显示RPM版本号
    -v:显示操作过程详细信息
    -vv:显示更加详细的信息

安装格式:
    rpm {-i|--install} [install-options] PACKAGE_FILE ...
         -i:安装
         -h:hash,以#表示安装进度
         --force:强制安装
         --nodeps:不检查包的依赖关系
         --test:不安装,简单的检查和报告可能的冲突
         --replacepkgs:覆盖安装

        example:
            安装rpm包,时会因依赖关系而无法安装,若想忽略依赖关系安装,则需使用--nodeps
         ]# rpm -ivh httpd-2.2.15-53.el6.centos.x86_64.rpm 
            error: Failed dependencies:
	    apr-util-ldap is needed by httpd-2.2.15-53.el6.centos.x86_64
	    httpd-tools = 2.2.15-53.el6.centos is needed by httpd-2.2.15-53.el6.centos.x86_64
	    libdb-4.7.so()(64bit) is needed by httpd-2.2.15-53.el6.centos.x86_64
	    libpcre.so.0()(64bit) is needed by httpd-2.2.15-53.el6.centos.x86_64
	        忽略依赖关系并安装
	    ]# rpm -ivh --nodeps httpd-2.2.15-53.el6.centos.x86_64.rpm 
	             Preparing...                          ################################# [100%]
                       Updating / installing...
                            1:httpd-2.2.15-53.el6.centos       ################################# [100%]

卸载格式:

    rpm {-e|--erase} {ERASE OPTIONS} PACKAGE_NAME ...
        -e:卸载
        --nodeps:不检查包的依赖关系
        --test:测试卸载,跟-vv连用
        --allmatches:删除此包所有的版本

    注:如果程序包的配置文件被修改过,卸载时,此文件通常不会被删除,而是被重命名(加后缀.rpmsave)后留存.
       还需要注意卸载时,不要加.rpm后缀,因为安装完成之后,就不是以rpm结尾的包.
    建议:尽量不要卸载程序,只要不启用就可以,以免由依赖关系所引起不必要的麻烦.
        example:
            卸载tcsh的rpm包
            ]# rpm -e tcsh-6.17-24.el6.x86_64
            ]#

更新格式:  
    rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
    rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
        -U:升级或安装(如果不存在旧文件,直接安装最新包)
        -F:升级(如果旧文件不存在,则什么都不做)
        --oldpackage:降级到旧版本
        --force:有冲突时强制升级
        --nodeps:不检查包的依赖关系
        --test:不安装,简单的检查和报告可能的冲突
    注意:(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核;同样不要对python进行升级.
       (2) 如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;
        
    
    example:
             (只是为做演示,是rpm的发行号更新)
             1 旧版本httpd升级为新版本httpd  
        ]# rpm -Uvh  --nodeps --oldpackage httpd-2.2.15-53.el6.centos.x86_64.rpm 
           Preparing...                          ################################# [100%]
                  Updating / installing...
                   1:httpd-2.2.15-55.el6.centos.2     ################################# [ 50%]
                  Cleaning up / removing...
                   2:httpd-2.2.15-53.el6.centos       ################################# [100%]
         2 新版本降级到旧版本  
        ]# rpm -Uvh  --nodeps --oldpackage httpd-2.2.15-53.el6.centos.x86_64.rpm
        Preparing...                          ################################# [100%]
            Updating / installing...
               1:httpd-2.2.15-53.el6.centos       ################################# [ 50%]
            Cleaning up / removing...
               2:httpd-2.2.15-55.el6.centos.2     ################################# [100%]

查询格式:  
    rpm {-q|--query} [select-options] [query-options] [PACKAGE_FILE ...]     
        -q:是否安装指定的程序包
        select-options
            -a:查看所有已经安装的包
            -f:查看某个文件自己的安装包,/path/to/file
            -p:查看没有安装的包

        query-option
            --changelog:查看程序包的变化信息
            -i,--info:查看包的详细信息
            -c:查看包的配置文件
            -l:查看包安装的文件列表
            -d:查看包安装的帮助文件列表
            --dump:查看包文件列表元数据的详细信息
            --provides:查看包的capabilities
            --requires:查看包所依赖的capabilities
            --scripts:查看包安装或卸载时执行的脚本
                    此类脚本有四种:
                        preinstall:安装过程开始之前执行的脚本
                        postinstall:安装过程完成之后执行的脚本
                        preuninstall:卸载开始之前执行的脚本
                        postuninstall:卸载之后执行的脚本
            Capabilities:即该包能够提供的能力(例如:httpd能提供web server的能力)
            
            
    example:
        1 查看httpd是否已经安装
        ]# rpm -q  httpd
        httpd-2.2.15-55.el6.centos.2.x86_64
        2 查看系统上所有以安装的rpm包
        ]# rpm -qa
        gcc-4.8.2-16.el7.x86_64
        policycoreutils-2.2.5-11.el7.x86_64
        cairomm-1.10.0-8.el7.x86_64
        ...
        3 查看安装/usr/sbin/httpd的rpm包
        ]# rpm -qf /usr/sbin/httpd
        httpd-2.2.15-55.el6.centos.2.x86_64
        4 查看尚未安装的包
        ]# rpm -qp httpd-2.2.15-53.el6.centos.x86_64.rpm 
        httpd-2.2.15-53.el6.centos.x86_64
        5 查看httpd包的版本修改日志 
        ]# rpm -q --changelog httpd
        * Fri Nov 18 2016 Johnny Hughes <johnny@centos.org> - 2.2.15-54.2
                - Roll in CentOS Branding
        6 查看httpd包所安装的所有文件清单
        ]# rpm -ql httpd
        /etc/httpd/conf.d/welcome.conf
        /etc/httpd/conf/httpd.conf
        /etc/httpd/conf/magic
        /etc/logrotate.d/httpd
        ...
        7 查看httpd包的详细信息 
        ]# rpm -qi httpd
        Name        : httpd
        Version     : 2.2.15
        Release     : 55.el6.centos.2
        Architecture: x86_64
        ...
        The Apache HTTP Server is a powerful, efficient, and extensible web server.
        8 查看httpd包提供的capabilities 
        config(httpd) = 2.2.15-55.el6.centos.2
        httpd-mmn = 20051115
        httpd-suexec = 2.2.15-55.el6.centos.2
        mod_actions.so()(64bit)
        ...
        webserver
        httpd = 2.2.15-55.el6.centos.2
        httpd(x86-64) = 2.2.15-55.el6.centos.2
        9 查询httpd包所依赖的capabilities
        ]# rpm -q --requires httpd
        /bin/bash
        /bin/sh
        ...
        rtld(GNU_HASH)
        system-logos >= 7.92.1-1
        rpmlib(PayloadIsXz) <= 5.2-1
        10 查询httpd包安装及卸载时所执行的脚本
        ]# rpm -q --scripts httpd
        preinstall scriptlet (using /bin/sh):
        # Add the "apache" user
        getent group apache >/dev/null || groupadd -g 48 -r apache
        ...
        preuninstall scriptlet (using /bin/sh):
        if [ $1 = 0 ]; then
        ...
        /sbin/service httpd condrestart >/dev/null 2>&1 || :
   
   技巧使用:
       一般当安装出现缺少某库时,可以使用-qf来查询此库由哪个程序包所提供,进而解决.
       例如:
       当安装时出现缺少,liblogin.so.2库时:
       # find / -name "liblogin.so.2"|xargs rpm -qf 
          cyrus-sasl-plain-2.1.23-13.el6_3.1.x86_64
校验格式:
    rpm {-V|--verify} [select-options] [verify-options]
        -V:检查包安装之后生成的文件是否发生了改变
            如果没有输出结果,则
            当有结果输出时,则根据下面查询对应原因:
                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
            S:文件大小改变
            M:文件权限和类型发生改变
            5:MD5这一种指纹码内容改变
            D:设备主/次号改变
            L:Link路径改变
            U:文件所属人改变
            G:文件所属组改变
            T:文件修改时间改变
            p:文件的Capabilities发生改变
        example:
            在httpd所安装的文件中添加一个数
            echo 1 >>  /etc/httpd/conf/httpd.conf
            大小改变,MD5码改变,文件修改时间改变 
            # rpm -V --nodeps  httpd
            S.5....T.  c /etc/httpd/conf/httpd.conf

包来源合法性验证和完整性验证:
    获取并导入信任的包制造者的公匙:
        对于CentOS发行版其命令
            rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-#
        导入公匙之后时,会进行自动验证其完整性
        也可手动验证:
            rpm {-K|--checksig} PACKAGE_FILE...

数据库重建:
    rpm的数据库路径:/var/lib/rpm/
        查询通过此数据库进行
        centos 6 获取帮助: man rpm
        centos 7 获取帮助: man rpmdb
    rpm {--initdb|--rebuilddb}[--dbpath DIRECTORY] [--root DIRECTORY]
        --initdb:初始化数据库;当前系统中无数据库时,创建一个新的数据库;
        --rebuildb:通过读取当前系统已安装的包,重新构建一个数据库;
        --dbpath DIRECTORY:指定数据库安装路径
        --root DIRECTORY:指明所在根目录   
     example:   
        在/tmp/rpm下创建一个数据库
            # rpm --initdb --dbpath /tmp/rpm
            # ls /tmp/rpm
            __db.001  __db.002  __db.003  __db.004  Packages
            
           当数据库损坏时,进入/tmp/rpm目录下,执行以下命令
               # rpm --rebuilddb
               # rpm --initdb

原创文章,作者:N25_sadan,如若转载,请注明出处:/64508

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1660809109@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:华宇招商  万达招商  测试  万达直属QQ  万达娱乐直属  万达主管  万达娱乐开户  万达娱乐主管QQ  万达娱乐注册