Intéressé par des cours d'informatique en ligne ?
Visitez mon nouveau site https://www.yesik.it !

Dépendances entre paquets.jpg

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