3 votes

Trouver des paquets (non)utilisés sur CentOS/Fedora ?

En bref : Parmi tous les paquets (rpm) installés, je voudrais identifier ceux qui ne sont pas utilisés (par exemple depuis les 6 derniers mois).

En long : J'ai un certain nombre de machines dont les états de service sont respectables. Chaque fois que je passe d'une version à une autre, je suis surpris de voir à quel point la procédure de mise à niveau se déroule bien.

Cependant, au fil des ans, de nombreux paquets ont été installés (via yum), et je sais qu'un certain nombre d'entre eux ne sont plus utilisés. Je veux m'en débarrasser car ils ont un impact négatif sur l'utilisation des ressources et la sécurité globale du système.

Je cherche la meilleure méthode pour trouver les paquets inutilisés.

Un moyen serait de passer manuellement en revue les paquets installés ? Cette méthode fonctionne et j'apprends beaucoup, mais elle prend énormément de temps.

Je cherche donc un moyen automatisé d'identifier les paquets inutilisés afin de pouvoir les nettoyer manuellement.

Je pense qu'une solution serait de surveiller tous les fichiers utilisés sur un serveur, de les lier à des paquets et de voir ce qu'il reste. Y a-t-il quelque chose de disponible à cet effet ?

Existe-t-il des moyens plus inventifs d'y parvenir ?

9voto

Aaron Points 2779

É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 !

4voto

ewwhite Points 193555

Je ne sais pas s'il y a une réponse appropriée à cette question...

Il est important de noter que des paquets superflus sont souvent installés dans de nombreux déploiements de Linux à usage général.

La plupart des ingénieurs ne sélectionnent pas à la main les logiciels individuels qui sont installés, mais choisissent plutôt des groupes logiques d'applications. (serveur web, serveur de messagerie, serveur NFS) ou les rôles du système (serveur, station de travail, minimal) .

Il y a également des dépendances qui sont installées dans le cadre des sélections ci-dessus. La notion de détermination des paquets "inutilisés" est délicate à cause de cela.

La sécurité ne dépend pas uniquement de ce qui est installé... C'est plus une fonction de ce qui est en fait fonctionnant sur le système, à savoir les démons, les services réseau, les ports exposés, les processus, etc.

En termes d'utilisation des ressources, vous ne perdez de l'espace disque que parce que des logiciels inutilisés sont installés. Un processus ne consomme pas de ressources CPU ou RAM tant qu'il n'est pas exécuté. Les conséquences sont donc faibles. Si j'étais un employeur/manager, je suggérerais que d'autres choses reçoivent votre attention. Pas ça.

Si vous voulez améliorer les constructions du système, la bonne façon de procéder est de commencer avec un ensemble de paquets de base et d'ajouter ce qui est nécessaire pour fournir la fonctionnalité requise du système. Documentez les listes de paquets supplémentaires et ajoutez-les à un fichier démarrer ( exemple ci-dessous ). Ne prenez pas la mauvaise direction en supprimant un logiciel d'un système en fonctionnement.

extrait d'une de mes listes de paquets kickstart, avec des groupes de paquets et plusieurs paquets supplémentaires...

%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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X