要するに:インストールされているすべての(rpm)パッケージから、未使用のパッケージを特定したいと思います(たとえば、過去6か月以降)。
長い間:私は立派なサービス記録を持つマシンをたくさん持っています。あるリリースから別のリリースにアップグレードするたびに、アップグレード手順がどれほどうまくいくかに驚いています。
ただし、何年にもわたって多くのパッケージが(yumを介して)インストールされ、その多くは使用されなくなったことがわかっています。これらはリソースの使用とシステムの全体的なセキュリティに悪影響を与えるため、これらを取り除きたいと思います。
未使用のパッケージを見つけるための最良の方法を探しています。
1つの方法は、インストールされたパッケージを手動でふるいにかけることです。この方法は機能し、私は多くのことを学びますが、非常に時間がかかります。
そのため、未使用のパッケージを自動で識別して、手動でクリーニングできるようにする方法を探しています。
一つの方法は、サーバー上で使用されているすべてのファイルを監視し、それらをパッケージにリンクして、残っているものを確認することだと思います。この目的のために利用できるものはありますか?
これを達成するためのより独創的な方法はありますか?
複数のパッケージに共通するRPMと共有ライブラリの性質を考えると、実際に使用するパッケージのリストを作成し、インストールされているパッケージのリストと比較するというアプローチを取ります。ディスクスペースの解放、特権の昇格を容易にするパッケージの削減、チェックサムデータベース(OSSEC、aide、tripwireなど)のサイズの削減など、未使用のパッケージを削除することには利点があります。
仮定:
免責事項:この方法には、考慮する必要のあるリスクがあります。たとえば、サーバーが2年間稼働している場合、サーバー/デーモンの開始時刻以降にアクセスしていない古いファイルを使用するデーモンが実行されている可能性があります。考慮すべきリスクは他にもたくさんありますが、あなたが尋ねたので、ここに私が始めるかもしれない1つの方法があります。これでも、安全に何を取り除くことができるかを人間が判断する必要があります。 この方法を使用してパッケージの削除を自動化しないでください。これは教育目的でのみ使用されます。
インストールされているすべての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ディスクにコピーします。少なくとも100MB程度の空き容量があることを確認してください。例えばdf -Ph/dev/shm
mkdir --mode=0700 /dev/shm/rpmdb
rsync -a /var/lib/rpm/. /dev/shm/rpmdb/.
最近の.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
調査結果から、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の内容はrpm -ql packageで一覧表示できます。これが私のVMの1つでの出力です。ご覧のとおり、私の場合、これは完全には役に立ちません。
+++ /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が必要になることはないため、dhcp-commonとそれに関連するdhclientパッケージを削除しました。この方法は完全に効率的ではないことは理解していますが、サーバーのそれぞれの固有の役割についての出発点となるはずです。明けましておめでとうございます!
これに対する適切な答えがあるかどうかはわかりません...
無関係なパッケージは、多くの汎用Linuxデプロイメントにインストールされることが多いことに注意することが重要です。
ほとんどのエンジニアは、インストールする個々のソフトウェアパッケージを手動で選択するのではなく、アプリケーションの論理グループ(Webサーバー、メールサーバー、NFSサーバー)またはシステムの役割(サーバー、ワークステーション、最小)。
上記の選択の一部としてインストールされる依存関係もあります。このため、どのパッケージが「未使用」であるかを判断するという概念は誤りです。
セキュリティは、インストールされているものだけに依存するのではありません...それは、システム上で実際に実行されているものの機能です。つまり、デーモン、ネットワークサービス、公開されたポート、プロセスなどです。
リソース使用率に関しては、未使用のソフトウェアをインストールすることによってのみディスク容量が失われます。プロセスは、実行されるまでCPUまたはRAMリソースを消費しません。したがって、影響は少なくなります。私が雇用主/マネージャーだった場合は、他のことに注意を向けることをお勧めします。この。
システムビルドを改善したい場合、正しい方法は、パッケージの基本セットから始めて、必要なシステム機能を提供するために必要なものを追加することです。追加のパッケージリストを文書化し、それらを キックスタート (以下の例)に追加します。実行中のシステムからソフトウェアを削除して、間違った方向に進まないでください。
私のキックスタートパッケージリストの1つからのスニペット、パッケージグループといくつかの追加パッケージ...
%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