zoukankan      html  css  js  c++  java
  • 【程序包管理】Linux程序包管理之rpm安装总结

    rpm简介

    rpm( Red Hat Package Manager )是一个开放的软件包管理系统。它工作于Red Hat Linux及其他Linux系统,成为Linux中公认的软件包管理标准。

    rpm将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操作

    rpm维护一个所有已安装的软件包和文件的数据库,可以让用户进行功能强大的软件包查询和验证工作。

    在rpm学习前我们需要知道其它一些知识点来辅助学习:RPM学习第一篇



     rpm软件包的命名格式

    rpm包的命名格式一般有两部分组成。

      第一部分是源代码版本号。比如:

    name-VERSION.tar.gz

      name:源代码包的名称

      VERSION: major.minor.release 

        major: 主版本号,一般程序功能有重大改变才会变动

        minor: 次版本号,程序功能某个小的分支有变动,才会变动

        release: 发行号,修正了某个BUG或升级了某段代码,才会变动

      

       第二部分是rpm打包制作的版本

    如果用源代码比作面粉,rpm包比作馒头,它们的区别在于: 面粉有不同的工艺,拿面粉又做出了各种可口的馒头。

    这样最终的软件包就构成了:

    name-VERSION-release.arch.rpm

    其中

    name-VERSION仍然沿用源代码包的命名

    release : 是rpm包打包制作的发行号

    arch:是指明适用于哪种操作系统平台,有i386, x64(amd64), ppc, noarch等



    获取包的方法

    除了系统发行版的光盘自带的rpm软件包外,通常还需要到网上下载,下面是几个可信的获取软件包的途径

    (1) 官方的文件服务器(或镜像站点)

        http://mirrors.aliyum.com

        http://mirrors.sohu.com

        http://mirrors.163.com

    (2) 项目的官方站点

    (3) 第三方组织

     (a) EPEL

        (b) 搜索引擎

            http://pkgs.org

            http://rpmfind.net

            http://rpm.pbone.net


    下载后建议先检查程序包的合法性和完整性。(4) 自己动手编译



    rpm命令使用

    安装:-i, --install        

    升级:-U, --update, -F, --freshen

    卸载:-e, --erase

    查询:-q, --query

    验证:-V, --verify

    数据库维护:--builddb, –initdb

    包的来源合法性验证和完整性验证: -K , --import



    No1、安装

    命令格式:

        rpm {-i|--install} [install-options] PACKAGE_FILE ...

     通用选项

     -v : verbose ,详细信息

      -vv : 更详细的信息

    [install-options]

      -h:hash marks输出进度条,每个#表示2%的进度

      --test:测试安装,检查并报告依赖关系及冲突消息等

      --nodeps:忽略依赖关系;不建议使用

      --replacepkgs:强制重新安装已经安装的软件包  【这种安装,其配置文件可能不会安装,也有可能把原来的配置文件覆盖了】

      --nosignature:不检查包签名信息,不检查来源合法性

      --nodigest:不检查包完整性信息

    注意:每一个程序安装时可能会运行脚本,做一些准备操作。rpm包可以自带脚本,这些脚本有四类(四类脚本不一定会全部带上),分别在不同的时刻被触发,分别是:

    preinstall : 安装过程开始之前运行的脚本,%pre , --nopre

    postinstall : 安装过程完成之后运行的脚本,%post , --nopost

    preuninstall : 卸载过程真正开始执行之前运行的脚本,%preun, --nopreun

    postuninstall : 卸载过程完成之后运行的脚本,%postun , --nopostun

    常用命令:

        rpm  -ivh  PACKAGE_FILE ...

    -------------------------------------------------------------

    -------------------------------------------------------------

    示例:

    1、测试安装:

    1 [root@oldboy mnt]# rpm -ivh --test mysql-5.1.73-5.el6_6.x86_64.rpm 
    2 warning: mysql-5.1.73-5.el6_6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
    3 Preparing...                ########################################### [100%]
    4 [root@oldboy mnt]# 

    2、正常安装:

    1 [root@oldboy mnt]# rpm -ivh python-2.6.6-64.el6.x86_64.rpm 
    2 warning: python-2.6.6-64.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
    3 Preparing...                ########################################### [100%]
    4     package python-2.6.6-64.el6.x86_64 is already installed
    5 [root@oldboy mnt]# 

    【注意:该warning是没有对包进行合法验证】

    3、测试安装,且忽略依赖关系:

     1 [root@oldboy mnt]# rpm -ivh --test php-odbc-5.3.3-40.el6_6.x86_64.rpm 
     2 warning: php-odbc-5.3.3-40.el6_6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
     3 error: Failed dependencies:
     4     libodbc.so.2()(64bit) is needed by php-odbc-5.3.3-40.el6_6.x86_64
     5     php-common(x86-64) = 5.3.3-40.el6_6 is needed by php-odbc-5.3.3-40.el6_6.x86_64
     6     php-pdo(x86-64) is needed by php-odbc-5.3.3-40.el6_6.x86_64
     7 [root@oldboy mnt]# rpm -ivh --test --nodeps php-odbc-5.3.3-40.el6_6.x86_64.rpm 
     8 warning: php-odbc-5.3.3-40.el6_6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
     9 Preparing...                ########################################### [100%]
    10 [root@oldboy mnt]# 
    11 
    12 rpm -ivh --test --nodeps php-odbc-5.3.3-40.el6_6.x86_64.rpm

    4、强制重新安装

     1 [root@oldboy mnt]# rpm -ivh zsh-4.3.11-4.el6.centos.x86_64.rpm 
     2 warning: zsh-4.3.11-4.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
     3 Preparing...                ########################################### [100%]
     4     package zsh-4.3.11-4.el6.centos.x86_64 is already installed
     5 [root@oldboy mnt]# rpm -ivh --replacepkgs zsh-4.3.11-4.el6.centos.x86_64.rpm 
     6 warning: zsh-4.3.11-4.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
     7 Preparing...                ########################################### [100%]
     8    1:zsh                    ########################################### [100%]
     9 [root@oldboy mnt]# 
    10 
    11  rpm -ivh --replacepkgs zsh-4.3.11-4.el6.centos.x86_64.rpm

    5、安装时候不检查包的来源合法性

    1 [root@oldboy mnt]# rpm -ivh --test --nodeps php-odbc-5.3.3-40.el6_6.x86_64.rpm 
    2 warning: php-odbc-5.3.3-40.el6_6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
    3 Preparing...                ########################################### [100%]
    4 [root@oldboy mnt]# rpm -ivh --test --nosignature --nodeps php-odbc-5.3.3-40.el6_6.x86_64.rpm 
    5 Preparing...                ########################################### [100%]
    6 [root@oldboy mnt]#
    7 
    8 rpm -ivh --test --nosignature --nodeps php-odbc-5.3.3-40.el6_6.x86_64.rpm


    No2、升级

    命令格式:

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

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

    注意事项:

    -U|--upgrade:如果没有旧版程序包,则安装程序包;如果有旧版程序包,则升级程序包
    -F:仅升级,如果没有旧版程序包,则不执行任何操作  【好像不支持降级功能】

    通用选项:

    -v : verbose ,详细信息

    -vv : 更详细的信息

    [install-options]:

    -h:hash marks输出进度条,每个#表示2%的进度

    --test:只进行升级测试

    --nodeps:忽略依赖关系;不建议使用

    --nosignature:不检查包签名信息,不检查来源合法性

    --oldpackage:降级,如果新版本存在很多问题,就要用到降级  【注意:-F好像不支持降级功能】

    --force:强制升级,如果新版本不再为其它程序提供依赖服务,这时会报错,可用强制升级

    注意:

      (1) 内核升级可能会有若然隐患问题,所以不要对内核进行升级,如果要测试新版本内核,可用直接安装新版本内核,让与老版本并存。

      (2) 如果某程序包在安装后配置文件曾做过修改,在升级时,新版本程序提供的同名配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名( FILENAME.rpmnew )后提供。

    常用命令:    

        rpm -Uvh PACKAGE_FILE ...
         rpm -Fvh PACKAGE_FILE ...

    --------------------------------------------------------------------------

    --------------------------------------------------------------------------

    示例:

    1、-U和-F的区别

    1 [root@oldboy mnt]# rpm -Fvh --test --nodeps php-odbc-5.3.3-40.el6_6.x86_64.rpm 
    2 warning: php-odbc-5.3.3-40.el6_6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
    3 [root@oldboy mnt]# rpm -Uvh --test --nodeps php-odbc-5.3.3-40.el6_6.x86_64.rpm 
    4 warning: php-odbc-5.3.3-40.el6_6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
    5 Preparing...                ########################################### [100%]
    6 [root@oldboy mnt]# 
    7 
    8  rpm -Fvh --test --nodeps php-odbc-5.3.3-40.el6_6.x86_64.rpm   /  rpm -Uvh --test --nodeps php-odbc-5.3.3-40.el6_6.x86_64.rpm

    2、当老版本存在,升级"老版本" 

    1 [root@oldboy mnt]# rpm -q zsh
    2 zsh-4.3.11-4.el6.centos.x86_64
    3 [root@oldboy mnt]# rpm -Uvh --nodeps zsh-5.0.2-28.el7.x86_64.rpm 
    4 warning: zsh-5.0.2-28.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
    5 Preparing...                ########################################### [100%]
    6    1:zsh                    ########################################### [100%]
    7 [root@oldboy mnt]# 
    8 
    9 rpm -Uvh --nodeps zsh-5.0.2-28.el7.x86_64.rpm

    3、降级新版本

     1 [root@oldboy mnt]# rpm -q zsh
     2 zsh-5.0.2-28.el7.x86_64
     3 [root@oldboy mnt]# rpm -Fvh --oldpackage zsh-4.3.11-4.el6.centos.x86_64.rpm   [-F 好像不支持降级功能]
     4 warning: zsh-4.3.11-4.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY 
     5 [root@oldboy mnt]# rpm -Uvh --oldpackage zsh-4.3.11-4.el6.centos.x86_64.rpm 
     6 warning: zsh-4.3.11-4.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
     7 Preparing...                ########################################### [100%]
     8    1:zsh                    ########################################### [100%]
     9 [root@oldboy mnt]# 
    10 
    11 rpm -Uvh --oldpackage zsh-4.3.11-4.el6.centos.x86_64.rpm


     No3、卸载

    命令格式:

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

    注意:这里的PACKAGE NAME  指的是包名,不是包的全名。

     选项:

    --allmatches:卸载所有匹配指定名称的程序包的各版本,即删除系统里有同一程序的多个安装版本

    --nodeps:忽略依赖关系

    --test:测试卸载,dry run模式

    --noscripts:

    ---------------------------------------------------------

    ---------------------------------------------------------

    示例:

    1、卸载包

    1 [root@oldboy mnt]# rpm -q zsh
    2 zsh-5.0.2-28.el7.x86_64
    3 [root@oldboy mnt]# rpm -e zsh-5.0.2-28.el7.x86_64
    4 [root@oldboy mnt]# rpm -q zsh
    5 package zsh is not installed
    6 [root@oldboy mnt]# 
    7 
    8 rpm -e zsh-5.0.2-28.el7.x86_64


    四、查询

    命令格式:

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

    其中

    [select-options]

    PACKAGE_NAME:查询指定的程序包是否已经安装,及其版本

    -a, --all:列出所有已经安装过的包

    -f FILE:查询指定的文件由哪个程序包安装生成

    -p, --package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作

    --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供

    --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖

    [query-options]

    --changelog:查询rpm包的changlog,注意非源码包的历史修订

    -l, --list:程序安装生成的所有文件列表

    -i, --info:程序包相关的信息,版本号、大小、所属的包组,等

    -c, --configfiles:查询指定的程序包提供的配置文件

    -d, --docfiles:查询指定的程序包提供的文档

    --provides:列出指定的程序包提供的所有CAPABILITY

    -R, --requires:查询指定的程序包所依赖的CAPABILITY

    --scripts:查看程序包自带的脚本片断

    常见组合用法:

    查询已安装包的信息【后直接接包名就可实现】

      -qi PACKAGE //查询程序包information

      -qf FILE //查询文件由哪个程序包生成

      -qc PACKAGE //查询程序包的配置文件

      -ql PACKAGE //查询程序包生成的文件列表

      -qd PACKAGE //查询程序包安装后生成的文档

    查询为安装包的信息【后接包的全名】

      -qpi PACKAGE_FILE //查询未安装程序包的information  

      -qpl PACKAGE_FILE //查询未安装程序包将要生成的文件列表

      -qpc PACKAGE_FILE, ... //查询未安装程序包将要提供的配置文件

    示例:

    1、查询bash软件包提供的所有CAPABILITY  【需要理解】

     1 [root@oldboy mnt]# rpm -q --provides bash
     2 config(bash) = 4.1.2-33.el6
     3 bash = 4.1.2-33.el6
     4 bash(x86-64) = 4.1.2-33.el6
     5 [root@oldboy mnt]# rpm -q --provides mysql
     6 mysql = 5.1.73-5.el6_6
     7 mysql(x86-64) = 5.1.73-5.el6_6
     8 [root@oldboy mnt]# rpm -q --provides zsh
     9 config(zsh) = 5.0.2-28.el7
    10 zsh = 5.0.2-28.el7
    11 zsh(x86-64) = 5.0.2-28.el7
    12 [root@oldboy mnt]# rpm -q --whatprovides 'config(bash)'
    13 bash-4.1.2-33.el6.x86_64
    14 [root@oldboy mnt]# rpm -q --whatprovides 'bash(x86-64)'
    15 bash-4.1.2-33.el6.x86_64
    16 [root@oldboy mnt]# rpm -q --whatprovides 'bash'
    17 bash-4.1.2-33.el6.x86_64
    18 [root@oldboy mnt]#

    2、查询sed软件包所依赖的CAPABILITY

     1 [root@oldboy mnt]# rpm -qR sed
     2 /bin/sh  
     3 /bin/sh  
     4 /sbin/install-info  
     5 /sbin/install-info  
     6 libc.so.6()(64bit)  
     7 libc.so.6(GLIBC_2.2.5)(64bit)  
     8 libc.so.6(GLIBC_2.3)(64bit)  
     9 libc.so.6(GLIBC_2.3.4)(64bit)  
    10 libc.so.6(GLIBC_2.4)(64bit)  
    11 libselinux.so.1()(64bit)  
    12 rpmlib(CompressedFileNames) <= 3.0.4-1
    13 rpmlib(FileDigests) <= 4.6.0-1
    14 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
    15 rtld(GNU_HASH)  
    16 rpmlib(PayloadIsXz) <= 5.2-1
    17 [root@oldboy mnt]# 
    18 
    19 rpm -qR sed

     3、查询未安装php-common软件包的配置文件

     1 [root@oldboy mnt]# rpm -qpc php-common-5.3.3-40.el6_6.x86_64.rpm 
     2 warning: php-common-5.3.3-40.el6_6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
     3 /etc/php.d/curl.ini
     4 /etc/php.d/fileinfo.ini
     5 /etc/php.d/json.ini
     6 /etc/php.d/phar.ini
     7 /etc/php.d/zip.ini
     8 /etc/php.ini
     9 
    10  rpm -qpc php-common-5.3.3-40.el6_6.x86_64.rpm

    4、查询系统中安装了哪些rpm包: rpm -qa 

    5、查找所有安装过的包含某个字符串sql的软件包: rpm -qa | grep sql

    6、查询MySQL软件包中的文件安装到那里去了:rpm -qa MySQL

    7、查询XX.rpm中包含那些文件。

    • 一个没有安装过的软件包,使用rpm -qlp XX.rpm
    • 一个已经安装过的软件包,还可以使用rpm -ql XX.rpm

    8、查询某个程序是哪个软件包安装的:

      rpm -qf `/bin/sed`    #返回软件包的全名
      rpm -qif `/bin/sed`   #返回软件包的有关信息
      rpm -qlf `/bin/sed`   #返回软件包的文件列表


    五、校验

    命令格式:

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

    【注意: 一般用于对软件包安装后,校验软件包所有的文件有没有发生修改。】

    示例:

    [root@oldboy mnt]# rpm -V zsh      //没有返回任何提示,即校验通过

    [root@oldboy mnt]# vim /usr/share/zsh/5.0.2/functions/send-invisible   //往zsh包的配置文件添加了几个字符

    [root@oldboy mnt]# rpm -V zsh

    S.5....T. /usr/share/zsh/5.0.2/functions/send-invisible  //这次,就显示被修改过了


    如果一切都被校验正确,屏幕上就不会显示输出。如果出现有修改,相关信息就会被显示至屏幕。输出的格式中,单用“ . ” 表示测试通过,如果是下列字符则代表某类测试失败:

    5: MD5校验和

    S: 文件大小

    L: 符号链接

    T: 文件修改时间

    D: 设备

    U: 用户

    G: 组群

    M: 模式( 包含权限和文件类型 )

    ?: 不可读文件



    六、.数据库重建  --> 仅管理员才能操作,目前还不知道怎么用??

     rpm管理器数据库路径:

      /var/lib/rpm/

    所有的rpm查询操作都是通过此处的数据库进行的。

    命令格式:

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

    其中:

    --initdb:初始化数据库。如果事先不存在数据库,则新建之;否则,不执行任何操作
    --rebuilddb:重新构建。无论当前存在与否,直接重建数据库



    No7.包来源合法性验证和完整性验证 --> 这一步需要在包安装之前进行

    在上面演示的图片中,在每次安装软件包时都会有一个警告信息。软件包在打包制作时,会附加上用单向加密了的软件包自身的特征码,只有与之对应的公钥才能解密验证包的合法性并得到特征码,再利用特征码验证软件包的完整性。由于在本地没有对应的公钥所以才会出现上面的警告信息。这时需要获取公钥,公钥的获取很关键,直接关系着软件包的来源合法性。

    注意:

      1、在可靠站点下的程序包一般我们获取不到公钥,所以就无法进行来源合法性验证,所以最好使用系统光盘自带的rpm程序包。  

      2、如果是系统光盘自带的rpm程序包的话,想要进行来源合法性验正的话,直接导入公钥再验证

    首先要获取并导入信任的包制作者的密钥,对于CentOS发行版来说:

      系统在安装完成后,系统会自动复制一份公钥至/etc/pki/rpm-gpg/ 下,用命令导入公钥,如下:

    1
    [root@localhost ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

      还有一种就是把密钥路径指向发行版光盘

    1
    [root@localhost ~]# rpm --import /media/RPM-GPG-KEY-CentOS-7

    接下来安装软件包时系统就可以自动验证了。

    还可以在安装软件包前,手动验证:

    1
    [root@localhost ~]# rpm -K zsh-5.0.2-7.e17.x86_64.rpm

      关于包合法性验证还可以查看博客:链接地址

     

  • 相关阅读:
    WinForm企业应用框架设计【五】系统登录以及身份验证+源码
    利用windows性能计数器进行服务器性能监控
    WinForm企业应用框架设计【一】界限划分与动态创建WCF服务(no svc!no serviceActivations!)
    杭州驾驶员模拟预约 监控工具 插队工具(准) 请直接联系作者 QQ 412588801
    使用plot绘制实时图表
    SilverLight企业应用框架设计【二】框架画面
    服务器性能监控+邮件发送
    自制安装程序~单文件~可安装windows服务~技巧!类似安装QQ!
    SilverLight企业应用框架设计【四】实体层设计+为客户端动态生成服务代理(自己实现RiaService)
    使用plot绘制可联动的柱状图和饼状图
  • 原文地址:https://www.cnblogs.com/l75790/p/9207779.html
Copyright © 2011-2022 走看看