在CentOS / Fedora上查找(un)使用的软件包?

简而言之:从安装的所有(rpm)软件包中,我想找出未使用的软件包(例如自过去6个月以来)。

总之:我有很多机器有着可敬的服务logging。 每次我从一个版本升级到另一个时,我感到惊讶的是升级过程如何。

然而,多年来,许多软件包被安装(通过百胜餐饮),我知道其中的一些不再使用。 我想摆脱这些,因为它们对资源使用和系统的整体安全性有负面影响。

我正在寻找find未使用的软件包的最佳方法。

一种方法是手动筛选已安装的软件包? 该方法的工作,我学到了很多,但它非常耗时。

所以我正在寻找一种自动化的方式来识别未使用的包,所以我可以手动清理它们。

我想一个前进的方法是监视服务器上所有使用的文件,将它们链接到包,看看剩下的是什么。 有什么可用于此目的吗?

有更多创造性的方法来完成这个吗?

考虑到多个软件包共有的RPM和共享库的特性,我将采取build立我实际使用的软件包列表的方法,并将其与已安装的软件包列表进行比较。 移除未使用的软件包(如释放磁盘空间,减less可能有助于提升权限的软件包,减小校验和数据库(例如OSSEC,助手,tripwire)的大小)有好处。

假设

  • atime已启用。 如果您使用的是noatime挂载选项,那么文件的访问时间将不会更新,也不能用于确定要访问的文件。 在文件系统上设置noatime以避免写入损失是很常见的。

免责声明:这种方法有一些风险,你需要考虑。 例如,如果您的服务器已经运行了几年,那么可能会有守护进程在运行,这些守护进程会使用自服务器/守护进程启动以来没有访问过的旧文件。 还有很多其他的风险因素,但是你问这么一个方法,我可以从头开始。 这仍然需要一个人来确定什么可以安全地被删除。 您不应该使用此方法自动移除软件包。 这仅供教育使用。

build立所有安装的RPM列表。

rpm -qa | sort -n > /dev/shm/all.txt 

build立最近访问的文件列表并保存一个计数。 我们即将迎来新的一年,所以你可能想看看去年。

 YEAR=`date -d "one year ago" '+%Y'` # YEAR=2014 OFS="$IFS";IFS=$'\n';stat --printf="%y %n\n" $(ls -tr $(find /bin /boot /etc /lib /lib64 /sbin /usr /var -type f ! -name "*~" ! -name "*.gz" ! -name "*.tar")) | grep ^${YEAR} | awk {'print $NF'} > /dev/shm/recent.txt;IFS="$OFS"; FILECOUNT=`egrep -c ^.+ /dev/shm/recent.txt` 

复制我们的RPM数据库到RAM磁盘,所以我们不滥用服务器。 确保您至less有100 MB的空闲空间。 例如df -Ph / dev / shm

 mkdir --mode=0700 /dev/shm/rpmdb rsync -a /var/lib/rpm/. /dev/shm/rpmdb/. 

find与我们的recent.txt列表相关的RPM。 这将需要一段时间。 我敢打赌,有人可以find更有效,更快,更聪明的方法来做这一步。 我会在屏幕会话中做到这一点。

 renice 19 -p $$ > /dev/null 2>&1 printf "${FILECOUNT} files to iterate through." > /dev/shm/recent_packages.txt for file in `cat /dev/shm/recent.txt` do rpm --dbpath /dev/shm/rpmdb -q --whatprovides ${file} >> /dev/shm/recent_packages.txt 2>/dev/null # optional status indicator. printf "." done 

从调查结果中删除不是由RPM软件包拥有的文件。

 grep -v "not owned by" /dev/shm/recent_packages.txt | sort -n | uniq > /dev/shm/recent_sorted.txt 

区分输出。 再次,这本身并不完全有用。 您将需要确定为什么这些软件包中的文件没有被访问。

 diff -u /dev/shm/recent_sorted.txt /dev/shm/all.txt | grep '^+' 

您可以使用rpm -ql软件包列出RPM的内容。 这是我的一个虚拟机的输出。 正如你所看到的,这对我来说并不完全有用。

 +++ /dev/shm/all.txt 2014-12-31 20:50:06.521227281 +0000 +basesystem-10.0-4.el6.noarch +dhcp-common-4.1.1-43.P1.el6.centos.x86_64 +filesystem-2.4.30-3.el6.x86_64 +rootfiles-8.1-6.1.el6.noarch 

我需要保持文件系统和基础系统,尽pipe事实上这些文件还没有被访问。 注意:在某些时候,我启用了noatime

我删除了dhcp-common及其相关的dhclient包,因为在我的具体用例中我永远不需要DHCP。 我意识到这种方法不是完全有效的,但它应该给你一个服务器的每个独特angular色的起点。 新年快乐!

我不知道这是一个适当的答案…

需要注意的是,多余的软件包通常安装在许多通用的Linux部署中。

大多数工程师不需要手动select安装的单个软件包,而是根据应用程序(networking服务器,邮件服务器,NFS服务器)或系统angular色(服务器,工作站,最小)的逻辑组进行select。

还有作为上述select的一部分安装的依赖项。 由于这个原因,确定哪些软件包“未使用”的概念是充满的。

安全性并不完全取决于安装的内容……这更多的系统上实际运行的function; 即守护进程,networking服务,端口暴露,进程等。

在资源利用方面,你只会通过安装未使用的软件而损失磁盘空间。 进程在执行之前不会占用CPU或RAM资源。 所以,后果很低。 如果我是一个雇主/经理,我build议其他的事情得到你的关注。 不是这个。

如果你想改进系统构build,正确的方法是从一套基本的包开始,并添加必要的任何东西来提供必要的系统function。 logging附加软件包列表并将其添加到kickstart ( 下面的示例 )。 不要从正在运行的系统中删除软件,从而走错方向。

从我的kickstart包列表中的一个片段,包组和几个额外的软件包…

 %packages @ base @ core @ cifs-file-server @ compat-libraries @ console-internet @ development @ mail-server @ nfs-file-server @ network-server @ network-tools @ system-management @ system-admin-tools @ web-server yum-fastestmirror rpm-devel e2fsprogs grub kernel-devel net-snmp-utils screen