Les caractères génériques dans le
système de paquetages de NetBSD
Hubert Feyrer <hubertf@NetBSD.org>, janvier 2000
Préambule : ce document commence par rappeler la manière dont fonctionnaient les dépendances dans le Système de Paquetages de NetBSD. Il décrit ensuite une façon d'utiliser les caractères génériques pour installer des paquetages binaires contenant des dépendances génériques afin de mieux gérer les conflits. Enfin, il survolera les changements depuis que les outils pkg_* ont été introduits.
1) Il était une fois
Laissez-moi vous remettre en mémoire comment fonctionnait la gestion des dépendances dans les systèmes de paquetages/ports de *BSD. Vivant au côté de RUN/BUILD_DEPENDS, le shéma de dépendances fonctionnait en inscrivant des lignes dans les fichiers Makefile. Par exemple :
DEPENDS+= foo-1.2:../../uncat/foo
spécifie deux choses :
- La version de «foo» dont dépend ce paquetage. S'il doit être installé, foo-1.2 doit être présent.
- S'il n'est pas présent dans la version requise, il doit être compilé par le système de paquetages.
Pour l'installation, «pkg_info -e» est utilisé pour savoir si la version requise de «foo» est présente. Si c'est le cas, le processus d'installation se poursuit, que ce soit la compilation avec pkgsrc ou l'intégration d'un binaire avec pkg_add.
Si la version voulue n'est pas présente, le système se rabattra sur le répertoire indiqué pour l'installer. Les dépendances sont ainsi satisfaites. Dans le cas d'installation de paquetage binaire, pkg_add considère qu'il existe foo-1.2.tgz dans les chemins d'accès et l'installe.
2) Dépendances et caractères génériques
Indiquer en dur la version voulue de «foo» pose des problèmes de maintenance. De plus, la plupart du temps, ce n'est pas une version précise qui est nécessaire mais plusieurs voire toutes. Les dépendances se présentent alors sous la forme :
DEPENDS+= foo-*:../../somecat/foo
C'est à dire que «toute» version de «foo» fait l'affaire. Le système de compilation cherche si «foo» est présent en appelant «pkg_info -e 'foo-*'». S'il ne l'est pas, le système prend la version se trouvant dans pkgsrc et l'installe en utilisant le chemin d'accès précisé.
Pour les paquetages binaires, la gestion est plus complexe. En effet, un paquetage binaire sait parfaitement qu'il dépend de «toute» version installée de «foo» et effectue la même vérification que le système de compilation. Si une version voulue est présente c'est bien. Sinon, l'installation (automatique) d'une version de «foo» devient légèrement problématique. En effet, le répertoire indiqué est inutilisable dans le contexte binaire, la compilation depuis les sources n'étant pas l'option demandée.
pkg_add se met donc à parcourir tous les paquetages (binaires !) disponibles pour installer le plus récent (correspondant au critère «foo-*»). Cette exploration est nécessaire avec la notion de caractères génériques. Si le logiciel requis est voulu jusqu'à une certaine version, par exemple foo<1.0, alors le plus récent paquetage avant la version 1.0 sera trouvé et installé, satisfaisant les dépendances.
Les paquetages binaires peuvent être installés non seulement depuis le disque local mais aussi par FTP, parcouru lui aussi. Ce dernier parcours de répertoire distant était la dernière pièce manquante au Système de Paquetages de NetBSD pour entièrement gérer les caractères génériques.
3) Notes sur l'implémentation
Prenons l'exemple d'une installation de paquetages par FTP. Nous voulons installer «a-1.0» qui dépend de «b-1.*» qui nécessite «c-*»... (quelque chose du genre de «kde»). Les actions sont approximativement les suivantes :
- consulte +CONTENTS de «a-1.0»
- recherche quelles versions de «b» sont disponibles
- consulte +CONTENTS de «b-1.quiestdisponible»
- recherche quelles versions de «c» sont disponibles
- consulte +CONTENTS de «c-quelquechose»
- récupère le reste de «c-quelquechose»
- récupère le reste de «b-1.quiestdisponible»
- récupère le reste de «a-1.0»
Les opérations «récupère le reste de» pourraient utiliser la même connexion (FTP ou autre) mais tout nouveau paquetage est ajouté par un processus pkg_add différent. Il y a donc de nombreuses connexions potentielles au même serveur ftp avec, comme inconvénients :
- inondation du site distant avec des connexions
- perte de temps pour établir chaque nouvelle connexion
Pour éviter cela, toutes les requètes pkg_add utilisent la même session FTP. Le processus faisant tourner ftp(1) ouvre deux pipes, l'une pour stdin et l'autre pour stdout. Elles sont passées aux commandes pkg_add suivantes qui en connaissent le descripteur par des variables d'environnement. Ainsi, une connexion permet de récupérer et d'installer plusieurs paquetages binaires.
4) Plus que pour les dépendances
Les caractères génériques du Système de Paquetages de NetBSD sont un super ensemble de ceux des interpréteurs de commandes. Il reconnait actuellement :
- les caractères de l'interpréteur de commandes (*, ?, ...), tels que décrits dans fnmatch(3)
- les choix {foo,bar} du style csh
- les numéros de version utilisant les opérateurs >=, <=, < et >
Par exemple, «pkg_info -e 'foo>=1.3'» correspond à la version 1.3 ou plus récente du paquetage «foo». Les caractères génériques ne sont pas uniquement utilisés pour connaitre les paquetages installés ou pour savoir quel paquetage dépendant récupérer. Il sont aussi permis (et utilisés) pour résoudre les conflits et éviter que deux paquetages soient présent alors qu'il ne devraient pas (conflits sur les noms de fichiers ou les fonctions).
pkg_info et pkg_delete utilisent aussi les caractères génériques. Le nom seul du paquetage, sans la version, peut leur être donné pour qu'ils retrouvent ce qu'il faut. De cette manière, non seulement nous économisons des frappes clavier mais, plus important, nous n'avons pas besoin de connaitre la version installée.
5) Autres modifications du Système de Paquetages de NetBSD
Depuis l'intégrations de pkg_*, issu de FreeBSD à la mi 1997, NetBSD a apporté de nombreuses améliorations. Voici les plus intéressantes :
- Le code ftp a été réécrit deux fois. La première fois, la bibliothèque ftpio a été remplacée en divisant le processus ftp(1), permettant au serveur mandataire (proxy) de gérer les limites de bande passante ou autre. La seconde fois, la réécriture a permis à plusieurs appels de pkg_add d'être traités non plus par plusieurs processus mais par un seul co-processus.
- Une «base de données des paquetages» a été mise en place pour savoir à quel paquetage appartient tout fichier du système. De cette manière, la documentation (pages de manuels, README...) et les fichiers de configuration peuvent se retrouver facilement.
- Les paquetages installés et binaires contiennent désormais leur taille en octets. Ils contiennent également leur taille avec les paquetages pré-requis. Cette information permet de connaitre l'espace disque nécessaire avant et après l'installation d'un paquetage.
- Le retrait récursif de paquetages permet , soit d'effacer tous les paquetages dont a besoin celui en question, soit d'effacer tous les paquetages qui ont besoin de celui en question, soit les deux.
- Ajout d'outils pkg_* permettant de savoir si un paquetage peut être mis à jour, dans le cas où bsd.pkg.mk est utilisé avec les nouveaux numéros de version. Cette caractéristique, combinée au paquetage pkgsrc/pkgtools/pkg_install, permet de contrôler les mises à jour des outils pkg_* du système.
- Avec l'aide du paquetage «zoularis», un environnement de quelques composants de base de NetBSD porté sur Solaris et Linux, le Système de Paquetages de NetBSD peut être (et est !) aussi utilisé sur ces systèmes. Ceux-ci fournissent leur propre ducumentation mais cette possibilité montre une fois encore que NetBSD est le système d'exploitation le plus portable du monde.
Les personnes suivantes ont permis au Système de Paquetage de NetBSD d'être ce qu'il est aujourd'hui :
- Outils pkg_* : Jordan Hubbart, John Kohl et d'autres héros non chantés
- Gestion des conflits de paquetages : Thorsten Frueauf
- Caractères génériques : Alistair Crooks, Hubert Feyrer
- Dépendances et caractères génériques : Hubert Feyrer
- Portage de NetBSD sur Solaris et Linux : Christos Zoulas,
Alistair Crooks, Kimmo Suominen
- Les contributeurs et les utilisateurs du pkgsrc de NetBSD pour leur aide, assistance, support et pour leur foi.
Pour plus d'informations :
(c) Copyright 20000110 Hubert Feyrer <hubertf@NetBSD.org>
$NetBSD: pkg-wildcards.html,v 1.2 2003/07/17 07:50:09 keihan Exp $