linux运维基础[软件包管理]——————rpm命令管理[包名、依赖性、安装、升级、卸载、查询、校验与文件提取]

文章目录

  • 1.rpm包命名规则
  • 2.RPM包依赖性
    • 2.1 树形依赖
    • 2.2 环形依赖
    • 2.3 模块依赖
  • 3.安装升级与卸载
    • 3.1 包全名与包名
    • 3.2 RPM安装
    • 3.3 RPM包升级
    • 3.4 卸载
  • 4.查询
    • 4.1查询是否安装
    • 4.2 查询软件包的详细信息
    • 4.3 查询包中文件安装位置
    • 4.4查询系统文件属于哪个包
    • 4.5 查询软件包的依赖性
  • 5.RPM包校验
  • 6.RPM包中文件提取

1.rpm包命名规则

首先我们知道所有的rpm的包都在光盘中,他们的名称都有一定的规则。先解读一个rpm包:

centos中的rpm包

httpd-2.2.15-15.el6.centos.l.i686.rpm
  • httpd:软件包报名
  • 2.2.15:版本
  • 15:发布次数
  • el6.centos :适合的linux平台(适合centos企业6版本)
  • i686:适合的硬件平台
  • rpm:rpm包扩展名

redhat中的rpm包

httpd-2.4.6-45.el7.x86_64.rpm
  • httpd:软件包报名
  • 2.4.6:版本
  • 45:发布次数
  • el7:适合企业7版本
  • x86_64:适合64位操作系统
  • rpm:rpm包扩展名

这里的扩展名其实只是为了方便管理员区分文件,所有的rpm包都必须以.rpm
结尾
。如果我们自己组建rpm包,必须以rpm包都必须以.rpm结尾。

注意以下几点:

  • noarch:表示任何平台都可以安装
  • 如果没有写定适合哪个linux平台,表示任何linux平台都可以使用。
  • 包名:httpd,包全名:httpd-2.4.6-45.el7.x86_64.rpm

linux系统严格区分包名与包全名,有些命令必须使用包全名,有些就可以直接跟包名。

2.RPM包依赖性

依赖性是一个RPM包的缺点,最典型有以下机中依赖方式:

2.1 树形依赖

装软件包a,需要软件包b,装软件包b,需要软件包c。

a->b->c

这时候我们就只能先装软件包c,再装b,最后才可以装a。

卸载的时候就要先卸载a,再卸载b,最后卸载c。

有的时候装一个包可能需要解决十几个依赖性,这是因为你再装系统的时候不想给服务器过大的压力,所以尽量少的安装了软件,所以你再安装一个软件的时候就要一次解决多个依赖性。如果系统装的越大,首先占用太多内存空建,并且宝座的可能性被攻击的可能性都会大幅度的增加。所以生产服务器都是最小化安装。

2.2 环形依赖

我们还可能遇到更复杂的一种依赖方式就是环形依赖,装软件包a,需要软件包b,装软件包b,需要软件包c,装软件包c,又需要软件包a。

a->b->c->a

这种方式也可以很简单的解决,用一条命令把软件包abc一起安装就可以解决了

卸载的时候一台命令一起卸载。

2.3 模块依赖

所有以.so.数字结尾的都是库依赖,这种库依赖包不是单独存在的,他是某一个软件包中的一个软件,只需要把这个软件所在的包安装就可以解决库依赖的问题。

那么我们如何确定这个文件属于哪个rpm包呢,这时候rpm包个的解决方案是一个网站可以查询:

www.rpmfind.net

linux运维基础[软件包管理]——————rpm命令管理[包名、依赖性、安装、升级、卸载、查询、校验与文件提取]_第1张图片
就可以看到查询结果

linux运维基础[软件包管理]——————rpm命令管理[包名、依赖性、安装、升级、卸载、查询、校验与文件提取]_第2张图片
下载即可。

3.安装升级与卸载

3.1 包全名与包名

  • 包全名:操作的包是没有安装的软件包时,使用包全名。而且要注意路径(这些包没有安装过,系统要找到他),一般是安装和升级的时候需要
  • 包名:操作已经安装过的软件包,使用包名。是搜索/var/lib/rpm中的数据库,我们就不需要绝对路径了。查询卸载可以直接用包名

在这里插入图片描述

3.2 RPM安装

我们首先看安装,我们知道安装的时候是要使用包全名。可以使用以下几个选项:

rpm -ivh [包全名]

-i:(install)安装
-v:(verbose)显示详细信息
-h:(hash)显示进度
--nodeps:不检测依赖性

一般我们安装的时候都会习惯使用-ivh选项,这样比较确定安装的工作。

而- -nodeps选项不检测依赖性,这个选项你再使用的时候如果直接使用后不再解决依赖性,那么安装的软件,可能无法启动,缺少底层服务的空架子。只能在做实验的时候使用。

接下来我们尝试安装httpd服务,我们首先找到httpd服务对应的软件包,开始安装。

linux运维基础[软件包管理]——————rpm命令管理[包名、依赖性、安装、升级、卸载、查询、校验与文件提取]_第3张图片
首先我们要先解决我们了解的依赖性,httpd-tools包括版本已经告诉我们,先在找到软件包,进行安装。

在这里插入图片描述
模块依赖性需要使用上述的rpmfind网站寻找包含这个文件的软件包。

linux运维基础[软件包管理]——————rpm命令管理[包名、依赖性、安装、升级、卸载、查询、校验与文件提取]_第4张图片
找到对应硬件、操作系统的软件包进行安装。

在这里插入图片描述
再次尝试安装httpd-tools软件包,因为有时一个软件包可以解决多个依赖性。

在这里插入图片描述
再次使用rpmfind网站进行查找。

linux运维基础[软件包管理]——————rpm命令管理[包名、依赖性、安装、升级、卸载、查询、校验与文件提取]_第5张图片
寻找对应的硬件、操作系统的软件包进行安装。

在这里插入图片描述
这时安装httpd-tools软件包就可以了。

在这里插入图片描述
尝试安装httpd服务安装包。

在这里插入图片描述
经过我的搜索最后确定需要mailcap软件包。

在这里插入图片描述
这时再安装httpd-devel与httpd-manual服务软件包就可以成功了,这么多包和依赖性很麻烦。

在这里插入图片描述
安装一个包,我们需要解决了多个依赖性。所以说使用rpm还是很不方便的。

我们来解释一下-vh再命令运行后的作用:

  • -v:警告信息,httpd再安装的时候一些注释信息。

在这里插入图片描述

  • -h:哈希显示#代替安装进度条,为了显示安装进入与准备进度。

在这里插入图片描述

3.3 RPM包升级

升级与安装类似,只是把-i更换为-U,就可以完成升级了。

rpm -Uvh [包全名]

-U: (upgrade)升级

我们如果要升级就需要一个,比现在系统中安装的包更高级的一个包,他的过程和安装完全相同。

3.4 卸载

卸载跟的是包名,他是可以再后台数据库中搜索到的:

rpm -e [包名]

-e: (erase) 卸载
--nodeps : 不检查依赖性

注意卸载命令在哪里都能执行,不像安装与升级必须在软件包所在目录安装,而且只跟包名,再后台数据库中搜索到的。

卸载httpd服务。

我们安装的时候循序是这样的:

httpd->httpd-tools  mailcap
     ->arp
     ->arp-util

所以卸载的时候我们必须先卸载httpd最后安装的,然后卸载httpd-tools,再卸载arp、arp-util,最后卸载mailcap就可以了。

在这里插入图片描述rpm的安装因为要解决过多的依赖性,所以我们大多数会使用yum进行代替。

但是rpm的查询是要比yum多得多,yum也有查询功能,但是他没有rpm的查询更加详细,丰富。

4.查询

4.1查询是否安装

查询一个软件再系统中是否已经安装,我们可以使用这个选项:

rpm -q [包名]

-q:(query)查询

这个包既然已经安装好了,那么只需要跟包名就可以了。

查询之前安装的httpd包。

在这里插入图片描述
卸载安装包,再次查询httpd包。

在这里插入图片描述
我们还可以查询所有已经安装的包:

rpm -qa

-a:(all)所有

只需要输入rpm -qa不跟任何包名就可以查看系统中安装的所有软件包。

linux运维基础[软件包管理]——————rpm命令管理[包名、依赖性、安装、升级、卸载、查询、校验与文件提取]_第6张图片
注意:这个查询命令可以再任何目录中使用,数据库中已经有了安装过的包。

4.2 查询软件包的详细信息

查询一个包的详细信息,可以使用以下选项:

rpm -qi [包名]

-i:查询软件信息(infomation)
-p:查询未安装包信息(package)

这个包信息在组建这个包的时候就已经写好了,保存在这个软件包当中。

linux运维基础[软件包管理]——————rpm命令管理[包名、依赖性、安装、升级、卸载、查询、校验与文件提取]_第7张图片
同时也可以查询未安装包的详细信息,再选项之后加一个-p,并且必须跟包全名。

linux运维基础[软件包管理]——————rpm命令管理[包名、依赖性、安装、升级、卸载、查询、校验与文件提取]_第8张图片

4.3 查询包中文件安装位置

包就应该不止一个文件,他的安装位置应该是固定的默认的,时在生产这个包的时候就固定好的合适位置。

rpm -ql [包名]

-l 列表(list)
-p 查询未安装包信息

linux运维基础[软件包管理]——————rpm命令管理[包名、依赖性、安装、升级、卸载、查询、校验与文件提取]_第9张图片
因为包的安装位置是再组建这个包的时候就确定的所以,不论是否安装了这个包,我们都可以查询到包中的文件安装位置,或将要安装的位置。

注意这里要跟包全名。

linux运维基础[软件包管理]——————rpm命令管理[包名、依赖性、安装、升级、卸载、查询、校验与文件提取]_第10张图片

4.4查询系统文件属于哪个包

先在我们更改过来,知道了系统文件名,如何查询它属于哪个包呢,使用以下选项:

rpm -qf [系统文件名]

-f : 查询系统文件属于哪个软件包(file)

跟的这个文件名必须是要通过包装出来的,才可以反向查询。

在这里插入图片描述

4.5 查询软件包的依赖性

再没有安装一个软件包的时候,我们可以通过这个选项找到他需要的依赖性包:

rpm -qR [包名]

-R : 查询软件包的依赖性(requires)
-p : 查询未安装包信息

这样子一次把需要的依赖性安装包一次性找好就不会太麻烦了。

linux运维基础[软件包管理]——————rpm命令管理[包名、依赖性、安装、升级、卸载、查询、校验与文件提取]_第11张图片
查询未安装的安装包信息才是最重要的,我们可以使用-p查询未安装的安装包信息。

linux运维基础[软件包管理]——————rpm命令管理[包名、依赖性、安装、升级、卸载、查询、校验与文件提取]_第12张图片

5.RPM包校验

校验:我们把RPM包安装好之后,先把他的特征记录下来,当我需要的时候,把现在的文件和之前的文件进行比较,两个文件是否有什么变换,判断是否做了修改,如果这个修改不是我们自己做的,而莫名其妙出现的,说明这个文件再我不知道的情况下被人做了修改。

rpm -V [包名]

-V: 校验指定rpm包中的文件。(verify)

我们校验一下之前安装的httpd包。

在这里插入图片描述
说明我们安装的文件没有出现任何更改,就是初始安装的状态。

现在我们自己做一个修改。

在这里插入图片描述
添加一个默认文件类型:

在这里插入图片描述然后我们再次进行校验:

在这里插入图片描述
现在我们确定八个修改标志:

标志 意义
S 文件大小是否改变
M 文件的类型或文件的权限(rwx)是否被改变
5 文件MD5校验和是否改变(可以看为文件内容是否改变)
D 设备的主从代码是否改变
L 文件路径是否改变
U 文件的所有者是否改变
G 文件的所属组是否改变
T 文件的修改时间是否该百年

如果显示是.表示这些值没有发生改变。

文件类型:

符号 类型
c 配置文件 (config file)
d 普通文件(documentation)
g “鬼”文件,莫名其妙出现的文件,这个文件不应该出现在rpm包中(ghost file)
l 授权文件(license file)
r 描述文件(read me)

我们只要可以看懂输出结果就可以了。

6.RPM包中文件提取

不把RPM包中的所有文件都安装,而是把某个文件提取出来,指定安装某一个文件:

rpm2cpio 包全名(文件绝对路径) | cpio -idv .文件绝对路径


2 : to转化
cpio: 用于从档案中提取文件或者向档案中写入文件
-i: copy-in模式,还原
-d: 还原时自动新建目录
-v: 显示还原过程
.: 将文件复制到当前路径

我做了误操作,把某一个重要文件删除了,这时只需要这个文件是属于哪一个软件包,将这个文件题取出来进行覆盖就可以修复。

rpm2cpio coreutils-8.22-18.el7.x86_64.rpm | cpio -idv ./bin/ls
         将rpm包转化位cpio格式            提取其中的/bin/ls文件到单前位置

cp ./bin/ls /bin/ls

你可能感兴趣的:(linux)