软件包管理之RPM

一、前言

在没有软件包管理器前,用户都是通过源代码的方式来安装软件。但是我们很容易发现,在每次安装软件时都必须对操作系统的境、编译的参数进行对应的编译,并且操作过程很是复杂,这对于不熟悉操作系统的朋友来说真心困难,那么有没有一款软件能让用户能很简单的安装所需的软件呢?

随着自由软件蓬勃发展,Linux系统的飞快发展,很多软件开发者、企业和社区将这些软件开始通过收集、整理、编译制作成distributions发布到常用的Linux操作系统上,但是后来发现,这样做在日后软件更新、系统更新上面都需要做很多操作。为了解决这个问题,一些社区和企业开始思考关于Linux的软件管理方式。

通过社区与企业的共同努力,Linux开发商将固定的硬件平台和操作系统需要安装或升级的软件编译好,并且将这些软件通过特定的打包方式将软件打包成一个特殊格式的文件,这些软件的文件含有能检测操作系统环境和软件依赖性的脚本,并提供记载该软件提供的所有文件信息等,最后将这个软件发布出去供用户使用。那么用户得到这个软件包,通过特定的命令,就能执行检测系统环境,根据环境所需的要求,对软件进行安装。这就是软件管理器的诞生。

二、目前常见Linux软件安装方式有2种

2.1、dpkg

这个软件安装方法是通过Debian Linux社区开发出来的,通过dpkg机制,Debian所提供的软件就能通过很简单的方法安装软件,并且能记录安装后的软件信息。只有是Debian的Linux distributions大多数都是使用这个方法管理软件。例如B2D、Ubuntu

2.2、RPM

这个软件安装方法是由Red Hat公司开发出来的,由于非常的简单实用,很多的distributions都使用这个机制来安装和管理软件。例如:CentOS、SuSe等

三、程序包管理器

功能:将编译好的程序打包成一个文件或有限的几个文件,可以用于实现安装、卸载、升级、查询等功能

包含:

1、数据库

程序名及版本

依赖关系: X –> Y,Z

功能性说明(rpm -qi bash)

安装生成的各文件路径及校验码

2、程序的组成清单

文件清单

安装卸载时运行的脚本

四、RPM介绍

RPM(RedHat Package Manager),RPM通过以一个种数据库记录的方式来将你所需的软件安装到你的Linux系统上的。在你所安装的软件前先通过编译完成,打包成RPM格式的文件,数据库记录的方式搜索对应需要具备的依赖关系的软件,那么当你在安装该软件的时候,RPM会查看你系统环境和依赖性关系来判定你是否能安装此软件。若能满足,则允许安装。否则将不给予安装。并且在安装的时候将该软件的信息写入RPM的数据库中,以便日后查询、检验和升级。

五、RPM包的命名格式

格式:

name–version–release.arch.rpm

例如:

bash-4.2.3-3.centos5.x86_64.rpm 
#表示bash-4.2.3,第三次发行,支持CentOS5系统,支持硬件平台x86_64位系统

获取rpm包的途径:

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

镜像:

2、项目的官网

  • 源代码
  • rpm包

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

  • http://rpmfind.net
  • http://rpm/pbone.net

六、打包工具的分包机制

假设一个程序有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-devel-4.2.3-3.centos7.x86_64.rpm   #devel就表示开发功能

七、RPM包的使用

7.1、安装(组合选项:-ivh)

rpm [option] Package_file

-i:install安装操作

-v:安装时显示详细信息

-vv:安装时显示更详细信息

-h:hash码,在安装过程中使用#号来显示安装进度

–test:仅作测试,不做安装操作

–noteps:忽略依赖关系,强制安装如果某包依赖于其他包,要么解决所有的依赖关系,要么忽略依赖关系,强制安装。但是如果强制安装完成后,软件未必能正常使用。

–replacepkgs:重新安装程序包
备注:如果原有配置文件作了修改,很有可能不执行替换文件,而是将新生成的配置文件重命名后缀为 .rpmnew

例子:

#测试安装RPM包
[[email protected] mnt]# mount /dev/cdrom /mnt                                                     #挂载光盘镜像到/mnt目录下
mount: block device /dev/sr0 is write-protected, mounting read-only 
[[email protected] mnt]# cd /mnt/Packages/                                                         #进入光盘目录
[[email protected] Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm                                 #安装zsh-4.3.10-7.el6.x86_64.rpm包
warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY      #这里的是提示密钥,无法校验包的合法性
Preparing...                ########################################### [100%]                  #使用#代表安装进度,一个#代表2%
   1:zsh                    ########################################### [100%]
#仅作测试,不做安装
[[email protected] Packages]# rpm -q zsh    
package zsh is not installed
[[email protected] Packages]# rpm --test -ivh zsh-4.3.10-7.el6.x86_64.rpm                          #仅作测试安装,实际上未安装
warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...                ########################################### [100%]
[[email protected] Packages]# rpm -q zsh                                                              
package zsh is not installed

7.2、卸载

rpm [option] Package_name

     -e:erase 删除

卸载的时候也会存在依赖关系的,如果被其他包所依赖:

  • 1、将依赖于此包的所有包一并卸载
  • 2、忽略依赖关系能卸载,但依赖于此包程序包可能会运行不正常
    –nodeps 忽略依赖关系

练习:

[[email protected] Packages]# rpm -q zsh  #查看软件是否安装,显示出包的信息证明已经安装
zsh-4.3.10-7.el6.x86_64
[[email protected] Packages]# rpm -e zsh  #卸载zsh软件
[[email protected] Packages]# rpm -q zsh
package zsh is not installed           #提示该软件未安装

注意:如果包的配置文件安装后曾被改动过,卸载时,此文件将不会卸载,而是重命名并保存,会出现下面的字段

            warning: /etc/zshrc saved as /etc/zshrc.rpmsave

例如:

[[email protected] Packages]# rpm -e zsh
warning: /etc/zshrc saved as /etc/zshrc.rpmsave
[[email protected] Packages]# ls /etc/ | grep "zsh*"
zshrc.rpmsave

7.3、升级(一般而言是新版本取代老版本)

rpm [option] Package_file

(1)、升级或安装 (如果有老版本就升级,如果没有就安装)

   组合 -Uvh

(2)、直接升级 (如果有老版本就安装新版本)

   组合 -Fvh

升级的时候也可能会出现版本冲突等问题,所以如果想强制升级可以使用 –force

注意:不应该对内核执行升级操作,而是安装(因为Linux系统允许多内核并存)

7.4、查询

(1)、查询某包是否安装

rpm -q package_name…..

(2)、查询所有已经安装的包

rpm -qa           #a表示all

按条件过滤: rpm -qa | grep ‘PATTERN‘

(3)、查询包的表述信息

rpm -qi package_name         (这里查询仅查询已安装的包)

(4)、查询某包生成了哪些文件

rpm -ql package_name

①查询某包生成了哪些配置文件

rpm -qc package_name

②查询某包生成了哪些帮助文件

rpm -qd package_name

③查询程序包的相关脚本

rpm -q –scripts package_name

脚本有四类

preinstall:安装前脚本

postinstall:安装后脚本

preuninstall:卸载前脚本

postuninstall:卸载后脚本

(5)、查询某文件是由哪个包安装生成的

rpm -qf /path/to/some_file

(6)查询某包所提供的capabilities

rpm -q provides PACKAGE_NAME

(7)查询某包所依赖的capabilities

rpm -q --requires PACKAGE_NAME

(6)、对尚未安装的包执行查询

rpm [option] /path/to/package_file

-q  :查看软件包是否安装

-qpi:安装以后会生成哪些配置文件

-qpl:安装以后会生成什么文件

-qpc:安装以后会生成什么配置文件

-qpd:安装以后相关脚本

练习:

[[email protected] Packages]# rpm -q zsh             #查看zsh软件是否安装                    
zsh-4.3.10-7.el6.x86_64
[[email protected] Packages]# rpm -qa | grep zsh     #查看zsh软件是否安装  
zsh-4.3.10-7.el6.x86_64
[[email protected] Packages]# rpm -qd zsh            #查询zsh包生成了哪些帮助文件
[[email protected] Packages]# rpm -qpl httpd-2.2.15-29.el6.centos.x86_64.rpm  #在未安装httpd时,查询安装httpd会生成什么文件
[[email protected] Packages]# rpm -qf /etc/bashrc    #查询bashrc这个文件是通过什么程序包安装生成的
setup-2.8.14-20.el6_4.1.noarch

7.5、校验(用于检查包装后文件属性是否发生变化)

rpm -V Package_name

    S file Size differs   大小

    M Mode differs (includes permissions and file type)   权限,文件类型改变

    5 digest (formerly MD5 sum) differs    md5校验码发生改变

    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    能力发生变化(可以理解为功能)

某属性无改变,则显示为:

[[email protected] Packages]# tail -5 /etc/zshrc 
}
_src_etc_profile_d
unset -f _src_etc_profile_d
#test file                               #在 /etc/zshrc文件中最后一行添加了最后一段
[[email protected] Packages]# rpm -V zsh    #查询该zsh软件的配置文件是否更改
S.5....T.  c /etc/zshrc                  #看出文件大小,MD5校验,修改时间都发生了变化

7.6、RPM数据库重建

rpm 的数据库目录: /var/lib/rpm

rpm –initdb:初始化如果事先没有库,会新建一个;如果有,则不覆盖

rpm –rebuilddb:重建直接重建,覆盖原有的数据库

7.7、校验RPM包来源合法性及完整性

前言:包制作者制作完成之后会附加数字签名于包上;包的制作者使用单向加密提取原始数据的特征码,而后使用自己的私钥加密这段特征码,附加原始数据后面。

验证包来源合法性和完整性的过程:

前提:必须有可靠机制获取到包制作者的公钥

  • 1、使用制作者的公钥解密加密的特征码,能解密则意味着来源合法
  • 2、使用与制作者同样的一样加密算法提取原始数据的特征码,并与解密出来的特征码比对,相同,则意味着完整性没问题,所以我们必须在当前系统上导入包的制作者的公钥

导入公钥:

 rpm –import /path/to/key_file

小贴士:centos6的密钥是在光盘里的“RPM-GPG-KEY-CentOS-6 ”文件

显示所有已导入的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

实验:

误删除rpm修复方法:

1.进入救援模式

2.创建挂载目录:

mkdir /mnt/cdrom

3.挂载光盘镜像:

mount -r /dev/sr0 /mnt/cdrom

4.进入软件包目录:

cd /mnt/cdrom/Packages/

5.安装rpm:

rpm -ivh rpm-4.11.3-17.el6.x86_64- --root=/mnt/sysimage/


练习:

[[email protected] Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm                              
#安装时会提示你没有公钥,无法校验包的完整性与合法性
warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
[[email protected] Packages]# rpm --import /mnt/RPM-GPG-KEY-CentOS-6                            
#导入密钥
[[email protected] Packages]# rpm -qa gpg-pubkey*                                               
#查看所以已导入的gpg格式的密钥
gpg-pubkey-c105b9de-4e0fd3a3
[[email protected] Packages]# rpm -qi gpg-pubkey-c105b9de-4e0fd3a3                              
#查看密钥详细信息
[[email protected] Packages]# rpm -ivh --replacepkgs zsh-4.3.10-7.el6.x86_64.rpm                
#可以导入密钥后安装软件会自动执行检查,通过后直接安装      
Preparing...                ########################################### [100%]    
   1:zsh                    ########################################### [100%]
[[email protected] Packages]# rpm -K zsh-4.3.10-7.el6.x86_64.rpm                                
#手动检查包的完整性与合法性
zsh-4.3.10-7.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

八、知识要点总结

  • 8.1、了解软件包管理器的来源与使用
  • 8.2、熟悉RPM包的命名格式 name-version-release.arch.rpm
  • 8.3、熟悉打包和分包机制
  • 8.4、熟悉RPM命令的使用 ,包括 安装、卸载、查询、升级、校验、公钥导入、合法性的检验、RPM数据库重建

虽然在安装软件时还有其他更好的命名,比如yum(日后再介绍),但是yum也是基于RPM而衍生出来的,而且在查询软件包很有用,日后也会经常使用这个命令,所以必须要对RPM命令非常熟悉,尤其是查询命令,对日后维护Linux系统帮助很大。建议多加练习

时间: 2024-12-26 01:22:14

软件包管理之RPM的相关文章

linux软件包管理之RPM

RPM是RHEL的一款后端软件包管理工具:全称为RedHat Package Manage,由RedHat公司开发,主要作为RehHat Linux软件包的管理机制之一,但并未用作商业用途,而是遵循GPL协议,其设计理念是开放的:现包括SUSE.Openlinux等发行版都采用,是非常强大的软件管理工具. RPM是以一种数据库记录的方式来将需要的软件包安装到linux系统的一套管理机制,最大特点是: 1.由于软件包是已经编译过且打包完毕的,所以软件传输与安装很方便 2.由于软件安装之后信息都记录

linux软件包管理之rpm 、yum基本使用

linux软件包管理之rpm .yum基本使用 一.RPM RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux.S.u.S.E.以及TurboLinux等Linux的分发版本都有采用,可以算是公认的行业标准了. RPM主要功能在于对linux中以.rpm为后缀的软件包的安装.升级.卸载.校验及查询进行便捷管理. 1.安装软件包及常用选项       rpm

学习笔记(十)——软件包管理:rpm + yum

1.rpm : rpm(RedHat Package Manager)是 RedHat 的软件包管理工具,由于CentOS 是基于 RedHat Linux的,所以 rpm 对于 CentOS 同样适用.下面列举了一些rpm 的常用参数: [[email protected] ~]# rpm -ivh packagename.rpm        //安装包 [[email protected] ~]# rpm -e packagename.rpm          //卸载包 如果要卸载 vi

Linux 软件包管理之RPM

在 GNU/Linux( 以下简称 Linux) 操作系统中,RPM 和 DPKG 是最为常见的两类软件包管理工具,他们分别应用于基于 RPM 软件包的 Linux 发行版本和 DEB 软件包的 Linux 发行版本中. Linux软件包管理器主要用于管理Linux系统中的软件包,其主要用于实现安装.卸载.升级等功能,并提供对系统中所有软件包状态信息的查询. RPM 最开始官方解释为:"Redhat Package Manager",由 Red Hat 公司制定实施,由于被 GNU 开

Linux基础管理——软件包管理:rpm,yum高级使用方法(史上最全,没有之一)

前言: GRU Linux操作系统中,实现软件包管理的常见工具有RPM和yum:本专题将就Centos系统中安装包的命名.校验.密钥导入导出.包安装.卸载.升级.查询等众多rpm包管理相关的操作实现进行总结. 1.安装包 1.1.包管理器分类 二进制应用程序的组成部分:二进制文件.库文件.配置文件.帮助文件.所以包管理器就是对这四类文件进行分门别类存储的一个管理工具. 程序包管理器:     debian:deb文件, dpkg包管理器.         redhat: rpm文件, rpm包管

sed的高级命令和软件包管理器rpm

一. sed的高级编辑命令  1.高级编辑命令   P:打印模式空间开端至\n内容,并追加到默认输出之前  h:把模式空间中的内容覆盖至保持空间中  H:把模式空间中的内容覆盖至保持空间中  g:从保持空间取出数据覆盖至模式空间  G:从保持空间取出内容追加至模式空间  x:把模式空间中的内容与保持空间中的内容进行互换  n:读取匹配到的行的下一行覆盖至模式空间  N:读取匹配到的行的下一行追加至模式空间  d:删除模式空间中的行  D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中

软件包管理:rpm

/usr/share/man /etc, /bin, /sbin,  /lib,    操的作系统自身运行和启动需要用到的路径,这些目录不能挂载额外分区必须在根上 /usr/   操作系统核心功能路径,可以单独分区 bin sbin lib usr/local 软件安装目录 bin sbin lib etc man /opt /proc不能单独分区,默认为空 /sys /dev 设备文件,不能单独分区 udev:动态创建设备文件. /root  不能单独分区 /var 建议单独分区 /boot

Linux软件包管理器rpm与yum

在我们的运维工作,总是避免不了安装某些软件,或者编译安装某些软件,我们知道操作系统当中的程序都是有程序员通过开发工具开发的来,程序员直接编写的纯文本的文档我们称之为源代码,但我们的计算机只能识别二进制程序,那么必须要将源代码变成计算机能识别的二进制程序,这里需要通过编译器来进行编译,将源码转换成二进制程序,再通过安装即可. 还有一类程序就是二进制程序,系统是由某些厂商来做的,在厂商的系统上编译出来的程序,自然就在系统上运行了,这里是由厂商直接编译好程序然后释放出来给用户,如此一来,由于我们本来就

linux中软件包管理工具rpm和yum

首先了解下linux中程序包的相关知识  包管理器:打包,包管理(安装.升级.卸载.查询及校验)             rpm: redhat package manager (早起使用perl语言写)           RPM is Package Manager ---->通过C语言实现,性能大幅提升            程序包的组成部分:                    二进制程序:/bin, /sbin,/ /usr/bin, /usr/sbin,  可执行文件