Linux软件包管理器—rpm

rpm 最开始是Red Hat Package Manager 之意,原用在Red Hat Linux一款软件包管理器,先在已被许多其他Linux 发行商使用,成为主流包管理器,rpm包的文件格式也写进Linux标准库中,所以rpm 现在递归意为RPM Package Manager。rpm的诞生使得在Linux上管理软件包变得方便许多,rpm功能强大,可完成构建、安装、查询、校验、升级和卸载软件包。

过去,许多 Linux 程序以源代码的形式发行,用户把源代码构建为所需的程序或程序集;源代码还附带必需的手册页、配置文件等等。现在,大多数 Linux 发行商使用称为包 的预构建的程序或程序集,包便于在发行版上安装。

rpm 最开始是Red Hat Package Manager 之意,原用在Red Hat Linux一款软件包管理器,先在已被许多其他Linux 发行商使用,成为主流包管理器,rpm包的文件格式也写进Linux标准库中,所以rpm 现在递归意为RPM Package Manager。rpm的诞生使得在Linux上管理软件包变得方便许多,rpm功能强大,可完成构建、安装、查询、校验、升级和卸载软件包。

一、软件包介绍

一个标准的rpm包里面包含包描述文件,依赖性,程序文件,文档说明,安装和卸载时运行的脚本。

安装一个rpm包,编译生成的程序文件,以及配置文件,帮助文件等将按照Linux文件层级结构标准来放置,这都是由脚本控制完成。那么我们获取一个rpm包的来源可靠性变得十分重要,一般来讲有以下几个安全获取路径:

  1. Linux发行商光盘及镜像网站

    如国内镜像站点:http://mirrors.aliyun.com

  2. 项目官方网站

  3. EPEL源,Extra Packages for Enterprise Linux  官方网址为:https://fedoraproject.org/wiki/EPEL

  4. rpm包搜索引擎

    pkgs.org

    rpmfind.net

    rpm.pbone.net


rpm包命名格式

        name-version-release.arch.rpm

version构成:major.minor.release

release:一般指OS,如el6,el7

arch:架构

    x86:i386,i486, i586, i686

    x86_64:x64, x86_64, amd64

    powerPC:ppc

    与平台无关:noarch

一个软件项目通常会被拆分成主包和支包

    Application-VERSION-ARCH.rpm: 主包

     Application-devel-VERSION-ARCH.rpm 开发子包

     Application-utils-VERSION-ARHC.rpm 其它子包

     Application-libs-VERSION-ARHC.rpm 其它子包

zip-3.0-10.el7.x86_64.rpm

二、rpm数据库

rpm包管理器的运行依赖它的数据库,数据库文件路径为/var/lib/rpm。数据库记录了:

1、已安装的程序包名称和版本信息,依赖关系

2、安装生成文件路径

3、软件包的校验码信息

一旦数据库信息丢失了,就不能正常进行升级,查询,卸载,校验等操作。

数据库操作命令

rpm --initdb        #如果不存在数据库,则建立一个新数据库
rpm --rebuilddb     #根据已安装包的头文件信息,重新构建数据库。如果一个数据库文件全部丢失,连已安装的包都无法找到,该命令无作用

三、rpm命令使用说明

rpm 命令的使用必需指定一种模式,安装,升级,卸载,查询,校验,以及数据库维护等。

所有模式下的常用选项

1)–quiet

    打印少量信息,通常只显示出错误信息

2)-v

    打印细节信息

3)-vv

    打印比-v更为详细的信息

4)–dbpath

    使用指定的数据库路径

5)–root

    使用指定的路径作为根路径。通常在救援模式下使用此选项

1、合法性检测

在执行安装,升级等操作的时,rpm默认会检测包来源合法性及包完整性,首先包来源合法性要先检测通过,包的来源合法性没有通过,其包特征码信息无法保障真实性,再去校验也毫无意义。

包来源合法性通过验证数字签名来校验,数字签名使用非对称加密算法RSA加密,校验需要导入公钥,如果没有公钥,会有提示

004.png

获取包制作者公钥后,rpm –import /path/key 导入公钥

Centos6,7 在/etc/pki/rpm-gpg/下已存放光盘包校验所需的公钥

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

导入正确公钥后,将不会出现nokey提示

rpm -q gpg-pubkey        #查询已导入的公钥
rpm -qi gpg-pubkey       #查询导入公钥详细信息
[root@centos7 Packages]$ rpm -q gpg-pubkey
gpg-pubkey-f4a80eb5-53a7ff4b
gpg-pubkey-b6792c39-53c4fbdd
[root@centos7 Packages]$ rpm -e gpg-pubkey-b6792c39-53c4fbdd   #删除指定一个公钥
[root@centos7 Packages]$ rpm -q gpg-pubkey
gpg-pubkey-f4a80eb5-53a7ff4b

2、安装

rpm -i [install-options] PACKAGE_FILE...

常用install-options

-h    显示进度条,hash marks形式

     常用安装命令:rpm -ivh file

[root@centos7 Packages]$ rpm -ivh tree-1.6.0-10.el7.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:tree-1.6.0-10.el7                ################################# [100%]

–replacepkgs    重新安装

rpm -ivh --replacepkgs tree-1.6.0-10.el7.x86_64.rpm

–nodeps       忽略依赖关系

           安装前不检查依赖关系,直接安装

–nosignature    不校验包签名信息

–nodigest      不校验包特征提取码

–test        不安装软件,只是显示检查并报告潜在的问题   

3、升级

rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...   #升级或安装软件包,如果是升级一个软件,则会移除其他版本的文件
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...   #只对软件包进行升级操作,如果没有旧版本程序,则不执行

升级模式的命令和安装模式命令的附加选项相同,再介绍几个常用选项

–oldpackage    允许进行降级操作

rpm -ivh --oldpackage xxx.rpm

–force       强制操作,等同于–replacepkgs, –replacefiles, and –oldpackage

注意:

    1)不要对内核进行升级操作,升级会删掉原有的内核;Linux支持多内核并存,直接安装即可。

    2)如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接

      覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留

4、查询

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

先讲解一下 [select-options],该选项返回的值都是rpm包名

PACKAGE_NAME    查询已安装的该命名的包

[root@centos7 Packages]$ rpm -q bash
bash-4.2.46-19.el7.x86_64
[root@centos7 Packages]$ rpm -q zsh
zsh-5.0.2-14.el7.x86_64

-a    查询所有已安装的包

[root@centos7 Packages]$ rpm -qa |grep .*sh-      #经常搭配grep使用,模糊查找包
zsh-5.0.2-14.el7.x86_64
bash-4.2.46-19.el7.x86_64
openssh-clients-6.6.1p1-22.el7.x86_64
tcsh-6.18.01-8.el7.x86_64

-f    查询指定的文件是由哪个包生成的

[root@centos7 Packages]$ rpm -qf /bin/sh
bash-4.2.46-19.el7.x86_64

-p    查询一个未安装rpm包的信息,经常需要配合[query options]使用

[root@centos7 Packages]$ rpm -qp xcb-util-devel-0.4.0-2.el7.x86_64.rpm      #单独使用返回包名
xcb-util-devel-0.4.0-2.el7.x86_64
[root@centos7 Packages]$ rpm -qpd xcb-util-devel-0.4.0-2.el7.x86_64.rpm     #配合-d 查询文档 
/usr/share/doc/xcb-util-devel-0.4.0/NEWS

–whatprovides CAPBILITY    查询此能力由哪个已安装的包提供,能力也可以是文件

[root@centos7 Packages]$ rpm -q --whatprovides tree
tree-1.6.0-10.el7.x86_64

–whatrequires CAPBILITY    查询该能力被哪些已安装的包所依赖

[root@centos7 Packages]$ rpm -q --whatrequires bash         
dracut-033-359.el7.x86_64
initscripts-9.49.30-1.el7.x86_64
lvm2-2.02.130-5.el7.x86_64
mariadb-5.5.44-2.el7.centos.x86_64
rsyslog-7.4.7-12.el7.x86_64
jline-1.0-8.el7.noarch
PackageKit-command-not-found-1.0.7-5.el7.centos.x86_64
kpatch-0.1.10-4.el7.noarch
bash-completion-2.1-6.el7.noarch

[query-options]

-l    查询程序包安装生成的列表

-i    查询程序包内含信息

-c    只列出配置文件列表

-d    只列出文档文件列表

–provides    查询该包提供哪些能力

[root@centos7 Packages]$ rpm -q --provides bash
/bin/bash
/bin/sh
bash = 4.2.46-19.el7
bash(x86-64) = 4.2.46-19.el7
config(bash) = 4.2.46-19.el7

-R,–requires    查询该包依赖哪些能力

–scripts    查看该包自带的脚本片段

5、校验

此模式校验是指比较指定包已安装的文件信息与rpm数据库存储的元数据对应的信息

rpm {-V|--verify} [select-options] [verify-options]
[root@centos7 Packages]$ rpm -V zsh      #手动修改过配置文件,校验结果如下
S.5....T.  c /etc/zshrc

校验结果九个位代表意义如下

      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

6、卸载

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

–allmatches    卸载所有匹配包名的所有版本程序

–nodesp      不检查依赖关系,直接卸载。强制卸载的含义

[root@centos7 Packages]# rpm -evv tree
D: loading keyring from pubkeys in /var/lib/rpm/pubkeys/*.key
D: couldn't find any keys in /var/lib/rpm/pubkeys/*.key
D: loading keyring from rpmdb
D: opening  db environment /var/lib/rpm cdb:0x401
D: opening  db index       /var/lib/rpm/Packages 0x400 mode=0x0
D: locked   db index       /var/lib/rpm/Packages
D: opening  db index       /var/lib/rpm/Name 0x400 mode=0x0
D:  read h#    1521 Header SHA1 digest: OK (5d09d886c3b9240f03006ab41d0cdd44dce7a723)
D: added key gpg-pubkey-b6792c39-53c4fbdd to keyring
D:  read h#    1522 Header SHA1 digest: OK (489efff35e604042709daf46fb78611fe90a75aa)
...

原创文章,作者:cutemsyu,如若转载,请注明出处:http://www.178linux.com/39865

(0)
cutemsyucutemsyu
上一篇 2016-08-26 09:11
下一篇 2016-08-26 09:11

相关推荐

  • 文件查找命令find详解

    文件的查找命令 find 用法 功能:实时查找工具,通过遍历指定路径完成文件查找 工作特点: •  查找速度略慢•  精确查找•  实时查找•  可能只搜索用户具备读取和执行权限的目录 语法:   find [OPTION]… [查找路径] [查找条件] [处理动作] 查找路径:指定具体目标路径;默认为当前目录查找条件…

    Linux干货 2016-11-07
  • 马哥教育网络班21期+第6周课程练习

    VIM基础知识 常用模式: 编辑模式–>命令模式 输入模式 末行模式:内置的命令行接口 模式转换: 编辑模式–>输入模式 i:在光标所在处前转换为输入模式; a:在光标所在后面转入输入模式; o:在当前光标所在行的下方打开一个新行,并转为输入模式; I:在当前光标所在行的行首输入; A:在当前光标所在行的行尾输入; O:在当前光标所在行的上方…

    Linux干货 2016-08-15
  • CentOS7.3安装Jumpserver0.3.2

    CentOS7.3安装Jumpserver0.3.2 公司服务器前端增加堡垒机,选用开源的jumpserver 软件环境CentOS Linux release 7.3.1611 python 2.7.5 mysql5.7 安装git yum -y install git 克隆jumpserver # cd /opt # git clone https://…

    Linux干货 2017-07-11
  • linux磁盘管理及文件系统

    linux磁盘管理及文件系统 硬盘存储术语    head:磁头          track:磁道          cylinder: 柱面    &nbsp…

    Linux干货 2016-08-26
  • Java线程

    线程是一个单独程序流程。多线程是指一个程序可以同时运行多个任务,每个任务由一个单独的线程来完成。也就是说,多个线程可以同时在一个程序中运行,并且每一个线程完成不同的任务。程序可以通过控制线程来控制程序的运行,例如线程的等待、休眠、唤起线程等。本章将向读者介绍线程的机制、如何操作和使用线程以及多线程编程。  1. 线程的基本知识   &nb…

    2015-06-08
  • 数组

    数组 变量:存储单个元素的内存空间 数组:存储多个元素的连续的内存空间,相当于多个变量的集合 数组名和索引 索引:编号从0开始,属于数值索引 注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引, 八十的数组支持稀疏格式(索引不连续 声明数组: Declare -a ARRAY_NAME Declare -A ARRAY_NAME:关联数组 注意…

    Linux干货 2018-01-02