总之:我有许多具有可观服务记录的机器.每次我从一个版本升级到另一个版本时,我都对升级过程的进展感到惊讶.
然而,多年来安装了许多包(通过yum),我知道其中一些不再使用.我想摆脱这些因为它们对资源使用和系统的整体安全性产生负面影响.
我正在寻找找到未使用的包的最佳方法.
一种方法是手动筛选已安装的软件包?该方法有效,我学到了很多,但它非常耗时.
所以我正在寻找一种自动识别未使用包的方法,以便我可以手动清理它们.
我想前进的方法是监视服务器上所有使用过的文件,将它们链接到包,看看剩下的是什么.有什么可用于此目的吗?
有更多创造性的方法来实现这一目标吗?
假设:
> atime已启用.如果您使用noatime的挂载选项,则文件的访问时间将不会更新,也不能用于确定访问哪些文件.通常在文件系统上设置noatime以避免写入惩罚.
免责声明:此方法存在一些您需要考虑的风险.例如,如果您的服务器已经运行了几年,那么运行的守护程序可能会使用自服务器/守护程序启动时间以来您未访问过的旧文件.还有很多其他风险要考虑,但你问这里有一种我可能会开始的方法.这仍然需要人来确定可以安全移除的东西.您不应该使用此方法自动删除包.这仅供教育使用.
构建所有已安装RPM的列表.
rpm -qa | sort -n > /dev/shm/all.txt
构建最近访问的文件列表并保存计数.我们即将迎来新的一年,所以你可能想看看去年.
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磁盘,这样我们就不会滥用服务器.确保您至少有100 MB左右.例如df -Ph / dev / shm
mkdir --mode=0700 /dev/shm/rpmdb rsync -a /var/lib/rpm/. /dev/shm/rpmdb/.
找到与我们的recent.txt列表相关联的RPM.这需要一段时间.我敢打赌,有人可以找到更有效,更快捷,更聪明的方法来完成这一步.我会在屏幕会话中这样做.
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
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的内容.这是我的一个VM上的输出.如您所见,这在我的案例中并不完全有用.
+++ /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
我需要保留文件系统和基本系统,尽管事实上这些文件还没有被访问过.注意:在某些时候我启用了noatime
我删除了dhcp-common及其相关的dhclient包,因为在我的特定用例中我永远不需要DHCP.我意识到这种方法并不完全有效,但它应该为您提供服务器每个独特角色的起点.新年快乐!