Chose promise chose due, voici mon script de gestion de dépendances pour aptitude.
L’état Manuel / Automatique des paquets installés est la clef de la gestion automatique de dépendances d’[b]apt/b car c’est ce qui permet de savoir quels paquets ne sont plus utiles et peuvent donc être désinstallés sans problème lorsque plus aucun paquet ne dépend d’eux.
Quand on installe/désinstalle souvent des paquets, il arrive régulièrement que cet état ne soit plus tout à fait correct (trop de paquets marqués en Manuel), voire que des paquets deviennent orphelins.
Il est donc important que l’état Manuel / Automatique des paquets soit le plus précis possible. Ce script se charge de ce problème, et tant qu’à faire automatise dans la foulée la détection des paquets orphelins.
[size=150]IMPORTANT : LISEZ ATTENTIVEMENT CE QUI SUIT[/size]
Bien que j’utilise ce script sans aucun souci depuis longtemps et que j’aie une totale confiance en lui, il n’est pas totalement exclu que vous rencontriez des problèmes. Cela dit étant donné que le paramétrage est très limité, ça réduit d’autant les risques.
Ce script est conçu de telle manière (utilisation de l’option –schedule-only) que même en cas de bug dans mon code, aucun paquet ne puisse être supprimé automatiquement, si vous ne faites pas n’importe quoi par la suite.
Si après invocation de ce script, aptitude venait à vous proposer de supprimer des paquets par le jeu des dépendances considérées (à tort) inutiles (ce qui ne devrait jamais arriver, je n’ai pas vu ça une seule fois en plus de deux ans), pas de panique. La commande suivante s’assurera que vous conserviez tous vos paquets en l’état (par contre il est possible que des paquets restent marqués en Manuel alors qu’ils devraient être en Automatique, mais rien de bien grave au final) :
Notez que cette commande sert à annuler toutes les actions en attente, ce qui fait qu’elle est aussi utile si la première partie du script détecte de telles actions en attente (voir plus loin).
Maintenant que les avertissements d’usage sont faits, on peut passer au reste…
[size=150]Obtenir le script[/size]
Téléchargement : github.com/syam44/fix-aptitude- … encies.deb
Dépôt Git : github.com/syam44/fix-aptitude-dependencies
Installation / mise à jour :
[code]# aptitude install debianutils libappconfig-perl libreadonly-perl libreadonly-xs-perl deborphan ncurses-bin
wget https://github.com/syam44/fix-aptitude-dependencies/raw/master/fix-aptitude-dependencies.deb
dpkg -i fix-aptitude-dependencies.deb
rm fix-aptitude-dependencies.deb[/code]
[size=150]À qui s’adresse ce script ?[/size]
[ul][li] Vous utilisez aptitude comme gestionnaire de paquets principal.
Ça marche également si vous utilisez apt-get mais attendez-vous à ce que la première partie du script vous trouve régulièrement des actions en attente si vous continuez ensuite à utiliser apt-get en parallèle d’aptitude (de ce script, donc). Ce n’est pas grave, faut juste être prévenu. [/li]
[li] Vous n’aimez pas conserver des paquets inutiles lorsque vous désinstallez un paquet.[/li][/ul]
[size=150]Pré-requis[/size]
[ul][li] aptitude version 0.6.3 (squeeze) et plus.[/li]
[li] Il est conseillé mais non nécessaire d’avoir deborphan installé.[/li][/ul]
[size=150]Fonctionnalités[/size]
[ul][li] Corrige automatiquement l’état Manuel / Automatique des paquets installés.
Ce script parcourt les dépendances (PreDepends, Depends et Recommends) de tous les paquets installés, et marque en Automatique tout ce qu’il peut…
Vous pouvez également (et devrez probablement) définir une liste de paquets à maintenir en Manuel quoi qu’il arrive.[/li]
[li] Détection des dépendances circulaires.
Le problème qui survient quand on marque un maximum de paquets en Automatique, c’est les chaînes de dépendances circulaires entre paquets. Plus précisément, les groupes de paquets inter-dépendants qui ne sont une dépendance (directe ou indirecte) d’aucun paquet marqué en Manuel.
Face à ce cas de figure, ce script ne sait pas quel(s) paquet(s) il convient de marquer en Manuel, et se rabat sur la solution de facilité : marquer tous les paquets concernés en Manuels. Mais il vous prévient tout de même, en identifiant les différentes chaînes de dépendances circulaires problématiques. Il vous suffit alors de choisir le bon paquet et de l’ajouter à la configuration du script pour éviter les problèmes la prochaine fois.[/li]
[li] Détection des paquets orphelins.
Une fois tout ce travail effectué, deborphan est appelé automatiquement (s’il est présent) afin de vous avertir des éventuels paquets orphelins. Le comportement exact de deborphan est facilement personnalisable.[/li]
[li] Routine de nettoyage personnalisée.
Vous pouvez facilement rajouter des commandes personnalisées qui s’exécuteront à la fin du script. Personnellement j’utilise ça pour nettoyer le cache d’aptitude et deux-trois autres choses qui me sont utiles.[/li][/ul]
[size=150]Paramétrage[/size]
Le paramétrage du script se passe dans le fichier /etc/apt/fix-aptitude-dependencies.conf :
[ul][li] Variable manual-packages : contient le nom de tous les paquets qui doivent être forcés en mode Manuel. Typiquement il s’agit de paquets contenant des dépendances circulaires, ou bien de paquets que vous tenez absolument à conserver même si tous les paquets qui en sont dépendants venaient à être supprimés.
Les paquets sont séparés les uns des autres par des espaces, tabulations et/ou retours chariots.[/li]
[li] Fonction user-cleanup : vous permet de rajouter des commandes à effectuer à la fin du script si tout s’est bien déroulé. Mettez juste true dans cette fonction si vous ne voulez pas lancer de commandes personnalisées.[/li]
[li] Fonction custom-deborphan : permet de personnaliser le comportement de deborphan. Je vous laisse aller fouiller dans le man si vous voulez l’adapter à vos besoins…[/li][/ul]
Note : voir également mon message ci-après pour un exemple de configuration.
[size=150]Exemple d’utilisation et explication détaillée du fonctionnement[/size]
Note : voir également mon message ci-après pour plus d’explications concernant les actions en attente.
À la première utilisation de ce script, il est plus que probable qu’il va trouver quelques soucis de dépendances, voire même des actions en attente ou des paquets cassés.
[code]# aptitude --schedule-only remove amarok
fix-aptitude-dependencies
Recherche des actions prévues et des dépendances cassées…
État Depuis Vers Paquet
id 2.4.3-1+b2 2.4.3-1+b2 amarok
id 2.4.3-1 2.4.3-1 amarok-common
id 2.4.3-1+b2 2.4.3-1+b2 amarok-utils
id 4:4.6.5-3 4:4.6.5-3 kdemultimedia-kio-plugins
id 0.4.0~git2 0.4.0~git2 liblastfm0
id 1.4.3-7 1.4.3-7 libloudmouth1-0
id 0.7.1-5 0.7.1-5 libqjson0
id 0.1.0+git2 0.1.0+git2 libqtscript4-core
id 0.1.0+git2 0.1.0+git2 libqtscript4-gui
id 0.1.0+git2 0.1.0+git2 libqtscript4-network
id 0.1.0+git2 0.1.0+git2 libqtscript4-sql
id 0.1.0+git2 0.1.0+git2 libqtscript4-uitools
id 0.1.0+git2 0.1.0+git2 libqtscript4-xml
id 1.0.1-3 1.0.1-3 libtag-extras1
ATTENTION : fix-aptitude-dependencies ne peut pas continuer. Veuillez appliquer ou annuler les actions prévues, et résoudre les dépendances cassées avant de relancer fix-aptitude-dependencies.[/code]
Pour des raisons de sécurité, le script refusera de faire quoi que ce soit s’il détecte qu’il y a des actions en attente sur certains paquets, ou que des paquets sont cassés. Il vous donne même la liste des paquets concernés…
On corrige donc cela (ici je dis à aptitude de garder amarok, mais il faut user de jugement : parfois vous voudrez conserver vos paquets en l’état, et d’autres fois appliquer ce qu’aptitude propose) et on relance le script…
Pour rappel, la commande indiquée au début de ce tuto dans la section IMPORTANT permet d’annuler toutes les actions en attente : aptitude keep ‘!~v’
[code]# aptitude keep ‘!~v’
fix-aptitude-dependencies
Recherche des actions prévues et des dépendances cassées…
Marquage des paquets en « Automatique » en fonction des dépendances des paquets…
Recherche des dépendances circulaires…
ATTENTION : des paquets marqués en « Automatique » contiennent des dépendances circulaires.
État Version Paquet
i 0.138-9 acpi-support-base
i 1:2.0.12-1 acpid
i 1.0.23+dfs alsa-base
i 1.0.24.2-3 alsa-utils
i 2.4.3-1+b2 amarok
i 2.4.3-1 amarok-common
i 1.3.13-5+b audacity
i 1.3.13-5 audacity-data
i 1.3.1+git4 konversation
i 1.3.1+git4 konversation-data
i 4:4.6.5-2 kopete
i 4:4.6.5-2 libkopete4
Les différentes chaînes de dépendances circulaires sont :
* acpi-support-base acpid
* alsa-base alsa-utils
* amarok amarok-common
* audacity audacity-data
* konversation konversation-data
* kopete libkopete4
La procédure correcte est de rajouter à la liste « paquets manuels » de fix-aptitude-dependencies.conf au moins un paquet de chaque chaîne de dépendances circulaires afin de casser les cycles de dépendances, puis de relancer fix-aptitude-dependencies pour appliquer la nouvelle configuration. En attendant, ces paquets ont tous été marqués en « Manuel », ce qui n’est probablement pas le résultat souhaité mais permet d’éviter leur suppression accidentelle.
deborphan : 1 bibliothèques orphelines (0 ignorées). Si vous êtes certain(e) que ces paquets ne vous sont pas utiles, vous pouvez les supprimer manuellement.
Pour que ces paquets n’apparaissent plus comme orphelins, utilisez « deborphan -A » (cf. man deborphan).
État Version Paquet
i 280.13.rea libgl1-nvidia-glx-ia32
Nettoyage du cache d’aptitude…
Désactivation des services KDE indésirables…
Suppression des dictionnaires MySpell indésirables…[/code]
Ouhla ça grogne… Voyons ça de plus près…
[quote]Marquage des paquets en « Automatique » en fonction des dépendances des paquets…
Recherche des dépendances circulaires…
ATTENTION : des paquets marqués en « Automatique » contiennent des dépendances circulaires.[/quote]
Le script a détecté ces dépendances circulaires dont je parlais plus haut.
Il commence par donner la liste de tous les paquets concernés, avec leur état et leur version actuelle, puis affiche les différentes chaînes de dépendances :
[quote]Les différentes chaînes de dépendances circulaires sont :
* acpi-support-base acpid
* alsa-base alsa-utils
* amarok amarok-common
* audacity audacity-data
* konversation konversation-data
* kopete libkopete4[/quote]
Chaque ligne correspond à un groupe de paquets inter-dépendants, il va donc falloir choisir lesquels on veut marquer en Manuel (sachant qu’un seul, le principal, est en général suffisant pour solutionner une chaîne complète).
Dans mon cas, les paquets Manuels seront acpi-support-base, alsa-utils, amarok, audacity, konversation et kopete. Je rajoute donc ces paquets dans la variable manual-packages du fichier de configuration /etc/apt/fix-aptitude-dependencies.conf.
[quote]deborphan : 1 bibliothèques orphelines (0 ignorées). Si vous êtes certain(e) que ces paquets ne vous sont pas utiles, vous pouvez les supprimer manuellement.
Pour que ces paquets n’apparaissent plus comme orphelins, utilisez « deborphan -A » (cf. man deborphan).[/quote]
Là c’est deborphan qui me prévient qu’une bibliothèque semble orpheline. Bien évidemment ce n’est pas le cas ici (cette lib me sert pour avoir la 3D sous Wine), je la rajoute donc à la liste des paquets ignorés par deborphan :
Si cette bibliothèque avait réellement été orpheline, j’aurais pu la supprimer manuellement à coup d’« aptitude purge ». Encore une fois il faut user de jugement, deborphan renvoie généralement assez peu de faux positifs mais ça arrive tout de même (la preuve dans l’exemple ci-dessus).
Je relance ensuite le script pour vérifier que la configuration est bonne :
[code]# fix-aptitude-dependencies
Recherche des actions prévues et des dépendances cassées…
Marquage des paquets en « Automatique » en fonction des dépendances des paquets…
Recherche des dépendances circulaires…
deborphan : aucune bibliothèque orpheline (1 ignorées).
Nettoyage du cache d’aptitude…
Désactivation des services KDE indésirables…
Suppression des dictionnaires MySpell indésirables…[/code]
C’est tout bon !
[size=150]Bonus : trouver tous les paquets marqués en Manuel[/size]
Une fois stabilisé l’état Automatique / Manuel de vos paquets, utilisez la commande suivante pour afficher la liste de tous les paquets qui sont encore marqués en Manuel :
Ça pourra vous aider à identifier les paquets dont vous ne voulez plus, pratique pour faire du ménage en complément des informations fournies par deborphan…
[size=150]Bonus : trouver et supprimer tous les paquets désinstallés non purgés[/size]
Lors d’un apt-get remove ou aptitude remove les fichiers de configuration des paquets supprimés restent sur le disque (contrairement aux commandes équivalentes utilisant l’option purge).
Pour trouver tous ces paquets “à moitié” désinstallés :
Si vous voulez purger définitivement tous les paquets concernés :