简而言之:从安装的所有(rpm)软件包中,我想找出未使用的软件包(例如自过去6个月以来)。
总之:我有很多机器有着可敬的服务logging。 每次我从一个版本升级到另一个时,我感到惊讶的是升级过程如何。
然而,多年来,许多软件包被安装(通过百胜餐饮),我知道其中的一些不再使用。 我想摆脱这些,因为它们对资源使用和系统的整体安全性有负面影响。
我正在寻找find未使用的软件包的最佳方法。
一种方法是手动筛选已安装的软件包? 该方法的工作,我学到了很多,但它非常耗时。
所以我正在寻找一种自动化的方式来识别未使用的包,所以我可以手动清理它们。
我想一个前进的方法是监视服务器上所有使用的文件,将它们链接到包,看看剩下的是什么。 有什么可用于此目的吗?
有更多创造性的方法来完成这个吗?
考虑到多个软件包共有的RPM和共享库的特性,我将采取build立我实际使用的软件包列表的方法,并将其与已安装的软件包列表进行比较。 移除未使用的软件包(如释放磁盘空间,减less可能有助于提升权限的软件包,减小校验和数据库(例如OSSEC,助手,tripwire)的大小)有好处。
假设 :
免责声明:这种方法有一些风险,你需要考虑。 例如,如果您的服务器已经运行了几年,那么可能会有守护进程在运行,这些守护进程会使用自服务器/守护进程启动以来没有访问过的旧文件。 还有很多其他的风险因素,但是你问这么一个方法,我可以从头开始。 这仍然需要一个人来确定什么可以安全地被删除。 您不应该使用此方法自动移除软件包。 这仅供教育使用。
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