赞
踩
熟悉Linux的人都可能知道rpm,而且绝大多数人可能都用过rpm命令。RPM全称Red Hat Package Manager,是红帽Linux的包管理器,也是使用最大的三个个包管理器之一,另外两个的debian系的dbpkg和Unix、BSD用的pkg。
RPM主要用来对RedHat系Linux二进制软件包管理,包括对软件包的安装、卸载、升级、更新、查询以及校验。实际上为了软件包管理,RPM在本地维护了一个rpm包数据库(RPM Database),记录了本机所有软件包的版本信息、包变化信息等。大家都用的最多的就是查询、安装和卸载,而其他功能则鲜为人知,本文虫虫就给大家介绍这些功能。
RPM查询是最常用的功能之一,大家都会会用rpm -q ,rpm -q|grep查询特定的包信息,下面是一些很有用,但是可能没有用过的功能。
这几个选项用来查找某安装包和文件够成的信息。-i表示某安装包的概述信息,比如我们搜索nginx的信息用rpm -qi nginx
如上图,信息包括了软件名、Relocations,版本、发行商、发布时间、编译时间、安装时间,编译主机名,包大小、授权信息、组、源RPM、数字签名、URL、概述、描述等信息。如果我们要列出某包安装后文件列表使用-l选项:
如果我们知道某个命令,想要查找它是通过哪个安装包安装,用-f加文件绝对路径来查找,比如要找lsof的安装包:
其他查询比较常见,我们不在赘述。下面我们说几个很少用,但是很有用的popt指令
该语句可以按照时间顺序列出最近安装的包,结合重定向到head可以查找到最近安装包,比如最近安装的10个包。
rpm -qa --last|head -n 10
该语句非常有用,如果你的系统发生异常,被黑或者别人修改过,可以用他来找出来别人安装什么软件,可以做为证据或者进一步排查的依据。
该语句,可以列出程序包中附带的的脚本,比如安装脚本、卸载脚本,启动项脚本等。比如我们查找nginx包中附带的安装脚本,如下:
上图中可见,安装中先增加了nginx组和nginx用户,然后用chkconfig注册了nginx服务。
接着创建了nginx日志目录和文件。然后是卸载脚本,卸载脚本中停止nginx服务,注销nginx启动项目。该命令非常有用,善用之可以学习很多shell脚本。
该语句可以列出软件包的整个变更历史,尤其在更新打包后,可以让我们了解其补丁包的安装情况,比如某些安全补丁包有没有安装过没有,比如openssl曾经暴露的心脏出血漏洞Heartbleed,CVE编号:CVE-2014-0160。我们就可以利用—changelog搜索当前版本是否已经打过该漏洞的补丁包。
rpm -q --changelog openssl|grep CVE-2014-0160
可以见我们已经安装过这个补丁了。查看其详细列表,可见是在1.0.1e-23解决的。
该语句可以列出软件包安装所依赖的各种包及其最小版本。比如nginx的依赖
rpm -q --requires nginx,结果如下(列出部分):
该语句可以列出,本软件包被其他软件依赖的情况,比如当你计划要升级或者删除某个包时候,可以用该语句查查其他包对它的依赖项,然后再决定下一步的操作,免得影响其他软件。比如nginx包:
RPM数据库还提供包验证的功能,可以用来发现原始安装包变化情况。包验证的
基本命令是rpm -V。比如查询验证nginx包可以用rpm -V nginx:
上面列出了nginx包安装后对default.conf文件的大小,md5哈希值,文件修改时间都有过变化。这些由列表前面的位属性表示,.表示属性正常,其他标志表示属性有变化。如果文件被删除,则会提示"missing xxxx",属性参数表示见下表:
上图中注意到中间位还有个字母c标志,该标志用来表示文件具体属性,c表示文件为配置文件。
c %config 配置文件
d %doc 说明文档
g %ghost 不应包含的文档,如果有可能有问题
l %license 授权文件
r %readme readme说明
包文件删除过的显示如下:
-V选项增加-a就可以列出当前系统中安装后,所有变化过的包文件,可以以此来检查文件包的完整性,安全性等。比如我们检查下bin目录中变化过的文件:
对于RPM安装包,下载的同时为了保证包的完整性质,防止由于下载或者被篡改等原因导致包变化,可以使用包校验来校验其完整性,校验需要下载安装包同时也一并下载校验的哈希包(md5,sha1,sha256等)校验文件。包安装数字校验使用-K 命令或者--checksig:
OK表示校验通过。增加-v可以显示更多的信息:
显示了sha1 和md5的哈希校验值。
前面我介绍了很多功能,这些功能都是建立在RPM数据的基础上,所以维护RPM数据的准确可信非常重要。最后我们就来介绍下RPM数据库的构成及其维护。
RPM数据库是有文件组成的数据结构,数据库位于"/var/lib/rpm"目录,数据文件格式为Berkeley DB,使用file命令就可以列出其格式:
由上图所示,除了四个__db.00数字的可执行文件外,其他数据都是Berkeley DB 哈希表。这些数据文件对应于不同的rpm查询命令,比如Name文件就是rpm -q 包名的查询,文件保存所有包名称,其他文件也类似。如果这些文件被删除,则rpm的对应功能项就不能执行,甚至安装卸载等功能都会有问题。
RPM数据库备份相当简单,只需对该目录进行备份即可:
tar cvfz RPMDB-20190429.tar.gz /var/lib/rpm
可以用cron计划任务定期备份,使用rsync同步到异地存储,就可以万无一失了。
如果数据被破话出现问题,可使用数据重建--rebulddb命令恢复。注意重建之前一定注意备份数据,备份数据,备份数据库!重要的事情说三遍!
备份RPM数据库后,可以使用下面方法重建恢复数据库:
移除 /var/lib/rpm/__db* 文件:
mkdir /tmp/rpmdb
mv /var/lib/rpm/__db* /tmp/rpmdb
然后执行rpm --rebuilddb
添加-vv可以显示具体详细过程:
如果重建出现问题,没有成功,则需要移除整个/var/lib/rpm 文件夹再试。如果还不行,则可能数据库出现大问题了,则需要重新生成RPM数据了:
新建一个目录重建数据库:
rpm --initdb --dbpath /rpm/rpmdb
在目录下,再执行重构数据库命令:
rpm --rebuilddb
RPM大家最熟悉,但是又很陌生的一个命令。熟悉的是常用的安装卸载操作,陌生的一些鲜为人知,但却十分有用的功能,尤其在安全检测和审计方面。本文我们介绍了这些鲜为人知但非常有用的命令,并且实例介绍他们的使用,最后我们介绍了RPM数据库急切备份、恢复修复的操作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。