Looking for Computer Science & Information Technology online
courses ?
Check my new web site: https://www.yesik.it !
Dépendances entre paquets — Sur le site http://packages.debian.org on peut trouver pour chaque paquet Debian ses dépendances requises, recommandées et suggérées. Dans sa configuration par défaut, apt-get n'installe que les dépendances requises puisque ce sont les seules indispensable au fonctionnement du logiciel souhaité.
Si vous avez déjà installé un logiciel sous Debian, vous connaissez sans doute le gestionnaire de paquets APT. Celui-ci maintient une base de données des dépendances entre paquets, ce qui permet notamment à apt-get d'installer automatiquement les dépendances requises avec chaque nouveau paquet.
Vous l'avez constaté, la liste des paquets requis est affichée au moment de l'installation pour confirmation. Et pour les aficionados du web, il est aussi possible de visualiser ces informations dans la page de chaque paquet disponible sur packages.debian.org.
Par contre une information qui n'apparaît pas immédiatement c'est celle qui indique les dépendances inverses. C'est à dire connaissant un paquet, déterminer quels autres paquets en ont besoin. Outre satisfaire une légitime curiosité, c'est aussi le moyen de répondre à cette simple question: « pourquoi le paquet X a été installé sur mon système? ».
apt-cache
Pourquoi le paquet X a été installé sur mon système?
La réponse, apt-cache la connait. En effet, cette commande permet d'explorer le cache APT pour obtenir les informations sur les dépendances entre paquets. Ainsi, il est possible d'obtenir toutes les dépendances – directes et inverses – d'un paquets avec la sous-commande showpkg. Par exemple, pour le paquet apache2:
sh$ apt-cache showpkg apache2 Package: apache2 Versions: 2.2.16-3 (/var/lib/apt/lists/ftp.de.debian.org_debian_dists_squeeze_main_binary-i386_Packages) Description Language: File: /var/lib/apt/lists/ftp.de.debian.org_debian_dists_squeeze_main_binary-i386_Packages MD5: d24f049cd70ccfc178dd8974e4b1ed01 2.2.9-10+lenny8 (/var/lib/apt/lists/ftp.de.debian.org_debian_dists_lenny_main_binary-i386_Packages) (/var/lib/dpkg/status) Description Language: File: /var/lib/apt/lists/ftp.de.debian.org_debian_dists_lenny_main_binary-i386_Packages MD5: d24f049cd70ccfc178dd8974e4b1ed01 2.2.9-10+lenny7 (/var/lib/apt/lists/security.debian.org_dists_lenny_updates_main_binary-i386_Packages) Description Language: File: /var/lib/apt/lists/security.debian.org_dists_lenny_updates_main_binary-i386_Packages MD5: d24f049cd70ccfc178dd8974e4b1ed01 Reverse Depends: zoph,apache2 zoneminder,apache2 zabbix-frontend-php,apache2 xapian-omega,apache2 wordpress,apache2 wims,apache2 websvn,apache2 [...]' ajaxterm,apache2 adzapper,apache2 adzapper,apache2 Dependencies: 2.2.16-3 - apache2-mpm-worker (21 2.2.16-3) apache2-mpm-prefork (21 2.2.16-3) apache2-mpm-event (21 2.2.16-3) apache2-mpm-itk (5 2.2.16-3) apache2.2-common (5 2.2.16-3) 2.2.9-10+lenny8 - apache2-mpm-worker (18 2.2.9-10+lenny8) apache2-mpm-prefork (18 2.2.9-10+lenny8) apache2-mpm-event (2 2.2.9-10+lenny8) 2.2.9-10+lenny7 - apache2-mpm-worker (18 2.2.9-10+lenny7) apache2-mpm-prefork (18 2.2.9-10+lenny7) apache2-mpm-event (2 2.2.9-10+lenny7) Provides: 2.2.16-3 - 2.2.9-10+lenny8 - 2.2.9-10+lenny7 - Reverse Provides: apache2-mpm-worker 2.2.16-3 apache2-mpm-prefork 2.2.16-3 [...] apache2-mpm-prefork 2.2.9-10+lenny8 apache2-mpm-event 2.2.9-10+lenny8 apache2-mpm-itk 2.2.6-02-1+lenny3+b1
Comme vous le constatez, le listing obtenu peut être relativement long. D'ailleurs ici j'ai même édité les résultats affichés ci-dessus pour réduire l'encombrement sur la page.
La section qui nous intéresse pour connaître les dépendances inverses est Reverse depends. Un petit sed permet de l'isoler:
sh$ apt-cache showpkg apache2 | sed -n '/Dependencies/q; /Reverse Depends/,$p' Reverse Depends: zoph,apache2 zoneminder,apache2 zabbix-frontend-php,apache2 xapian-omega,apache2 wordpress,apache2 wims,apache2 websvn,apache2 citadel-webcit,apache2 viewvc,apache2 usemod-wiki,apache2 ukolovnik,apache2 trac,apache2 torrus-apache2,apache2 [...]
Comme nous le verrons dans un tout petit instant, il est évidemment possible de jouer avec sort(1) ou d'autres filtres pour trier ces résultats. Toujours est-il qu'au moins nous disposons des données nécessaires.
dpkg
Bien sûr parmi toutes ces dépendances, fort peu sont installées sur votre système. Si vous souhaitez connaître les dépendances inverse correspondant à des programmes installés, il va falloir coupler ce résultat avec les informations sur l'état des paquets fournies par dpkg. En assemblant quelques commandes, on arrive finalement pipeline suivant:
sh$ apt-cache showpkg apache2 | # Extrait les dépendances de apache2 \ sed -n '/Reverse Depends/,/Dependencies/p' | # Ne conserve que les dépendances inverse \ sed '1d;$d' | cut -d, -f1 | sort -u | # Ne conserve que le nom des paquets \ xargs -n 50 dpkg --get-selections 2> /dev/null | # Interroge dpkg pour extraire l'état de ces paquets \ grep '[[:space:]]install' # Ne garder que ceux qui sont installés foswiki install
Ainsi, j'apprends que sur mon système apache2 est requis par le paquet foswiki qui y est installé. Ceci ne me dit pas si j'ai installé directement apache2, ou s'il a été installé automatiquement en tant que dépendance de fowiki. Par contre, je sais maintenant que je ne peux pas désinstaller apache2 si je désire conserver foswiki.

xargs -n 50
Dans le pipeline précédent, la commande xargs permet d'exécuter dpkg en passant les noms de paquets dans la liste des arguments:
[...] xargs -n 50 dpkg --get-selections 2> /dev/null [...]
L'option -n 50 sert à limiter le nombre d'arguments par appel de commande à 50. S'il y en a plus de 50, la commande dpkg sera invoquée plusieurs fois. Pourquoi limiter à 50? En fait, il peut y avoir des erreurs lors de l'exécution de dpkg car apt-cache peut connaître des paquets que dpkg ne connait pas. Or par défaut, au delà de 50 erreurs dpkg abandonne l'exécution de sa tâche. Ici, en limitant l'examen à 50 paquets par appel, je m'arrange pour que même dans le pire des cas, dpkg n'abandonne jamais.
Accessoirement, j'aurais pu aussi modifier cette valeur limite avec l'option --abort-after:
[...] xargs dpkg --abort-after=9999 --get-selections 2> /dev/null [...]
Je n'ai pas choisi cette option parce que je ne sais pas à priori combien de paquets peuvent être passés, ce qui me force à mettre un chiffre absurdément élevé (9999). Par ailleurs, je ne sais pas non plus s'il y a une limite imposée par dpkg ou le shell au nombre maximum de paquets que l'on peut passer en arguments. Rester sur la valeur par défaut de 50 est donc moins efficace, mais au moins je suis certain que cela fonctionnera.
Alternative
Avant de terminer, un mot sur la sous-commande rdepends de apt-cache. Celle-ci sert spécifiquement pour extraire les dépendances inverses:
sh$ apt-cache rdepends apache2
apache2
Reverse Depends:
|zoph
apache2-mpm-itk
apache2-mpm-event
apache2-mpm-prefork
apache2-mpm-worker
zoneminder
apache2-mpm-itk
apache2-mpm-event
apache2-mpm-prefork
apache2-mpm-worker
|zabbix-frontend-php
apache2-mpm-itk
apache2-mpm-event
apache2-mpm-prefork
apache2-mpm-worker
[...]
Je ne la mentionne ici que pour mémoire. En effet, je trouve le résultat obtenu nettement moins facile à interpréter ou exploiter que celui de apt-cache showpkg.

Piège:
apt-cache rdepends ne fait pas la même chose que la commande apt-rdepends du paquet Debian éponyme! En effet, cette dernière commande permet d'extraire de manière récursive les dépendances directes. Mais ne sais pas extraire les dépendances inverses.
Références
- man apt-cache – Le manuel de apt-cache
- man dpkg – Le manuel de dpkg
- man apt-rdepends – Le manuel de apt-rdepends