zoukankan      html  css  js  c++  java
  • Linux程序包管理之rpm

    rpm简介

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

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

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

     

    rpm的功能

    安装:-i, --install

    卸载:-U, --update, -F, --freshen

    升级:-e, --erase

    查询:-q, --query

    验证:-V, --verify

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

     

    rpm软件包命名格式

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

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

    name-VERSION.tar.gz

    name: 源代码包的名称

    VERSION分为:

    • 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命令使用

    安装

    命令格式:

    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

    应用:

    1、下图是正常安装过程

    clip_image002

    2、忽略依赖关系

    clip_image004

    3、强制重新安装

    clip_image006

    升级

    命令格式:

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

    其中

    -U:如果有安装老版本则升级,如果老版本安装不存在,则安装最新版本

    -F:如果有安装老版本就升级,如果老版本安装不存在,则不予理会

    通用选项:

    -v : verbose ,详细信息

    -vv : 更详细的信息

    [install-options]:

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

    --test:只进行升级测试

    --oldpackage:降级,如果新版本存在很多问题,就要用到降级

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

    注意:

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

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

    应用:

    1、-U和-F的区别:

    clip_image008

    2、升级“老版本”

    clip_image010

    卸载

    命令格式:

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

    其中:

    --allmatches:卸载所有匹配指定名称的程序包的各版本

    --nodeps:忽略依赖关系

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

    查询

    命令格式:

    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

    clip_image012

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

    clip_image014

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

    clip_image016

    校验

    命令格式:

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

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

    例如:

    # rpm -V zsh       //没有返回任何提示,即校验通过
    
    # vim /usr/share/zsh/4.3.10/scripts/newuser        //在注释行添加一个“#”
    
    # rpm -V zsh
    
    # [root@localhost Packages]# rpm -V zsh
    
       S.5....T. /usr/share/zsh/4.3.10/scripts/newuser        //文件大小发生变化,MD5校验和发生变化,文件修改时间发生变化
    
    

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

    5: MD5校验和

    S: 文件大小

    L: 符号链接

    T: 文件修改时间

    D: 设备

    U: 用户

    G: 组群

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

    ?: 不可读文件

    rpm包来源合法性验证和完整性验证

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

     

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

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

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

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

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

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

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

    clip_image018

    数据库重建

    rpm管理器数据库路径:

    /var/lib/rpm/

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

    命令格式:

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

    其中:

    --initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;当前有时不执行任何操作

    --rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建

    应用:

    clip_image020

  • 相关阅读:
    Mac的Safari安装油猴插件(Tampermonkey)
    element表格点击行即选中该行复选框
    Previous operation has not finished; run 'cleanup' if it was interrupted最简单有效的解决方法
    读取JDK API文档,并根据单词出现频率排序
    Mac 下安装并配置 Tomcat
    Mac上安装并配置JDK
    GitHub注册失败,卡在第一步
    Jmeter 操作手册(三)
    Jmeter 操作手册(二)
    .Jmeter 使用手册(一)
  • 原文地址:https://www.cnblogs.com/chengtai/p/6235481.html
Copyright © 2011-2022 走看看