首先我们知道所有的rpm的包都在光盘中,他们的名称都有一定的规则。先解读一个rpm包:
centos中的rpm包:
httpd-2.2.15-15.el6.centos.l.i686.rpm
redhat中的rpm包:
httpd-2.4.6-45.el7.x86_64.rpm
这里的扩展名其实只是为了方便管理员区分文件,所有的rpm包都必须以.rpm
结尾。如果我们自己组建rpm包,必须以rpm包都必须以.rpm结尾。
注意以下几点:
linux系统严格区分包名与包全名,有些命令必须使用包全名,有些就可以直接跟包名。
依赖性是一个RPM包的缺点,最典型有以下机中依赖方式:
装软件包a,需要软件包b,装软件包b,需要软件包c。
a->b->c
这时候我们就只能先装软件包c,再装b,最后才可以装a。
卸载的时候就要先卸载a,再卸载b,最后卸载c。
有的时候装一个包可能需要解决十几个依赖性,这是因为你再装系统的时候不想给服务器过大的压力,所以尽量少的安装了软件,所以你再安装一个软件的时候就要一次解决多个依赖性。如果系统装的越大,首先占用太多内存空建,并且宝座的可能性被攻击的可能性都会大幅度的增加。所以生产服务器都是最小化安装。
我们还可能遇到更复杂的一种依赖方式就是环形依赖,装软件包a,需要软件包b,装软件包b,需要软件包c,装软件包c,又需要软件包a。
a->b->c->a
这种方式也可以很简单的解决,用一条命令把软件包abc一起安装就可以解决了。
卸载的时候一台命令一起卸载。
所有以.so.数字
结尾的都是库依赖,这种库依赖包不是单独存在的,他是某一个软件包中的一个软件,只需要把这个软件所在的包安装就可以解决库依赖的问题。
那么我们如何确定这个文件属于哪个rpm包呢,这时候rpm包个的解决方案是一个网站可以查询:
www.rpmfind.net
我们首先看安装,我们知道安装的时候是要使用包全名。可以使用以下几个选项:
rpm -ivh [包全名]
-i:(install)安装
-v:(verbose)显示详细信息
-h:(hash)显示进度
--nodeps:不检测依赖性
一般我们安装的时候都会习惯使用-ivh选项,这样比较确定安装的工作。
而- -nodeps选项不检测依赖性,这个选项你再使用的时候如果直接使用后不再解决依赖性,那么安装的软件,可能无法启动,缺少底层服务的空架子。只能在做实验的时候使用。
接下来我们尝试安装httpd服务,我们首先找到httpd服务对应的软件包,开始安装。
首先我们要先解决我们了解的依赖性,httpd-tools包括版本已经告诉我们,先在找到软件包,进行安装。
模块依赖性需要使用上述的rpmfind网站寻找包含这个文件的软件包。
再次尝试安装httpd-tools软件包,因为有时一个软件包可以解决多个依赖性。
这时再安装httpd-devel与httpd-manual服务软件包就可以成功了,这么多包和依赖性很麻烦。
安装一个包,我们需要解决了多个依赖性。所以说使用rpm还是很不方便的。
我们来解释一下-vh再命令运行后的作用:
升级与安装类似,只是把-i更换为-U,就可以完成升级了。
rpm -Uvh [包全名]
-U: (upgrade)升级
我们如果要升级就需要一个,比现在系统中安装的包更高级的一个包,他的过程和安装完全相同。
卸载跟的是包名,他是可以再后台数据库中搜索到的:
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的查询更加详细,丰富。
查询一个软件再系统中是否已经安装,我们可以使用这个选项:
rpm -q [包名]
-q:(query)查询
这个包既然已经安装好了,那么只需要跟包名就可以了。
查询之前安装的httpd包。
rpm -qa
-a:(all)所有
只需要输入rpm -qa不跟任何包名就可以查看系统中安装的所有软件包。
注意:这个查询命令可以再任何目录中使用,数据库中已经有了安装过的包。
查询一个包的详细信息,可以使用以下选项:
rpm -qi [包名]
-i:查询软件信息(infomation)
-p:查询未安装包信息(package)
这个包信息在组建这个包的时候就已经写好了,保存在这个软件包当中。
同时也可以查询未安装包的详细信息,再选项之后加一个-p,并且必须跟包全名。
包就应该不止一个文件,他的安装位置应该是固定的默认的,时在生产这个包的时候就固定好的合适位置。
rpm -ql [包名]
-l 列表(list)
-p 查询未安装包信息
因为包的安装位置是再组建这个包的时候就确定的所以,不论是否安装了这个包,我们都可以查询到包中的文件安装位置,或将要安装的位置。
注意这里要跟包全名。
先在我们更改过来,知道了系统文件名,如何查询它属于哪个包呢,使用以下选项:
rpm -qf [系统文件名]
-f : 查询系统文件属于哪个软件包(file)
跟的这个文件名必须是要通过包装出来的,才可以反向查询。
再没有安装一个软件包的时候,我们可以通过这个选项找到他需要的依赖性包:
rpm -qR [包名]
-R : 查询软件包的依赖性(requires)
-p : 查询未安装包信息
这样子一次把需要的依赖性安装包一次性找好就不会太麻烦了。
查询未安装的安装包信息才是最重要的,我们可以使用-p查询未安装的安装包信息。
校验:我们把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) |
我们只要可以看懂输出结果就可以了。
不把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