Étant donné la nature des RPM et des bibliothèques partagées communes à plusieurs paquets, j'adopterais l'approche consistant à établir une liste des paquets que j'utilise réellement et à la comparer à la liste des paquets installés. Il y a des avantages à supprimer les paquets inutilisés, comme libérer de l'espace disque, réduire les paquets qui faciliteraient l'escalade des privilèges, réduire la taille d'une base de données de somme de contrôle, par exemple OSSEC, aide, tripwire.
Assomption :
- atime est activé. Si vous utilisez une option de montage de noatime, les temps d'accès aux fichiers ne seront pas mis à jour et ne pourront pas être utilisés pour déterminer quels fichiers sont accédés. Il est courant que noatime soit défini sur un système de fichiers pour éviter la pénalité d'écriture.
Avis de non-responsabilité : Cette méthode comporte certains risques que vous devez prendre en compte. Par exemple, si votre serveur est en service depuis quelques années, il se peut que certains démons utilisent d'anciens fichiers auxquels vous n'avez pas accédé depuis le démarrage du serveur/du démon. Il y a beaucoup d'autres risques à prendre en compte, mais comme vous l'avez demandé, voici une méthode par laquelle je pourrais commencer. Cette méthode nécessite toujours l'intervention d'un humain pour déterminer ce qui peut être supprimé en toute sécurité. Vous ne devez pas automatiser la suppression des paquets en utilisant cette méthode. Ceci est à usage éducatif uniquement.
Construire une liste de tous les RPM installés.
rpm -qa | sort -n > /dev/shm/all.txt
Créez une liste des fichiers récemment consultés et enregistrez-en le nombre. Nous sommes à l'aube de la nouvelle année, c'est pourquoi nous vous invitons à vous pencher sur l'année dernière.
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`
Copier notre base de données RPM sur le disque RAM pour ne pas abuser du serveur. Assurez vous d'avoir au moins 100 MB de libre, par exemple df -Ph /dev/shm
mkdir --mode=0700 /dev/shm/rpmdb
rsync -a /var/lib/rpm/. /dev/shm/rpmdb/.
Trouvez les RPM associés à notre liste recent.txt. Cela va prendre un certain temps. Je parie que quelqu'un pourrait trouver des moyens plus efficaces, plus rapides et plus intelligents de réaliser cette étape. Je le ferais dans une session d'écran.
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
Retirer de notre liste les fichiers qui ne sont pas possédés par un paquet RPM des résultats.
grep -v "not owned by" /dev/shm/recent_packages.txt | sort -n | uniq > /dev/shm/recent_sorted.txt
Diffuser la sortie. Encore une fois, cela n'est pas complètement utile en soi. Vous devrez déterminer pourquoi les fichiers de ces paquets ne sont pas accessibles.
diff -u /dev/shm/recent_sorted.txt /dev/shm/all.txt | grep '^+'
Vous pouvez lister le contenu d'un RPM avec rpm -ql paquet . Voici le résultat sur l'une de mes machines virtuelles. Comme vous pouvez le constater, ce n'est pas tout à fait utile dans mon cas.
+++ /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
J'ai besoin de conserver filesystem et basesystem, malgré le fait que ces fichiers n'ont pas été accédés depuis un certain temps. Note : A un moment donné, j'ai activé noatime
J'ai supprimé dhcp-common et le paquet dhclient qui lui est associé, puisque je n'aurai jamais besoin de DHCP dans mon cas d'utilisation spécifique. Je réalise que cette méthode n'est pas entièrement efficace, mais elle devrait vous donner un point de départ sur chaque rôle unique de vos serveurs. Bonne année à tous !