LogicielsTiers
Un article de Projet de documentation fug-fr .
Passée la phase d'installation de FreeBSD, la question de la gestion des logiciels tiers se pose: où trouver ce qui est disponible, comment les installer, les garder à jour, etc.
Dru Lavigne a écrit un excellent article intitulé Portupgrade dans la série FreeBSD Basics du BSD DevCenter d'ONLamp qui aborde toutes ces questions en livrant quelques astuces bien utiles au passage.
En voici donc une traduction avec son aimable autorisation.
Dans un article précédent, nous nous sommes intéressé aux utilitaires de base qui peuvent servir à la gestion des ports de FreeBSD. Dans cet article, je voudrais continuer dans la même veine. Jetons un oeil à portupgrade, un port riche en fonctionnalités destiné à vous aider à tirer le meilleur du système des ports.
Sommaire |
[modifier] Installer portupgrade
Comme pour n'importe quel autre port, vous installez portupgrade en vous plaçant dans son répertoire et en entrant la commande make:
% cd /usr/ports/sysutils/portupgrade % make install clean
Plus d'une douzaine d'utilitaires seront installés. Utilisons une astuce du précédent article et voyons quelles pages de manuel, et par conséquent quels programmes furent installés:
% pkg_info -xL portupgrade | grep man /usr/local/man/man1/pkg_deinstall.1.gz /usr/local/man/man1/pkg_fetch.1.gz /usr/local/man/man1/pkg_glob.1.gz /usr/local/man/man1/pkg_sort.1.gz /usr/local/man/man1/pkgdb.1.gz /usr/local/man/man1/portcvsweb.1.gz /usr/local/man/man1/portsclean.1.gz /usr/local/man/man1/portsdb.1.gz /usr/local/man/man1/portupgrade.1.gz /usr/local/man/man1/portversion.1.gz /usr/local/man/man5/pkgtools.conf.5.gz /usr/local/man//man1/pkg_which.1.gz /usr/local/man//man1/portinstall.1.gz /usr/local/man//man1/ports_glob.1.gz
Le temps investi à survoler ces manuels sera tout bénéfice. Cela vous donnera une idée de la puissance et de la flexibilité du système des ports et vous y découvrirez des trucs et astuces auxquels vous n'auriez jamais pensé. Ne vous laissez pas impressionner néanmoins, même si vous vous sentez submergé par la masse d'informations disponible. Dans les prochains articles, je vous guiderai dans quelques exemples concrets pour vous permettre de prendre en main efficacement ces utilitaires.
Commençons par revoir la structure des ports, où elle se trouve installée dans votre système et comment la garder à jour.
A l'installation de FreeBSD, lorsque vous avez choisi d'installer les ports, /usr/ports et ses fichiers et sous-répertoires furent créés pour vous. Si vous exécutez ls /usr/ports, vous verrez qu'il contient des sous-répertoires divisant logiquement la collection des ports. Par exemple, il y a un répertoire pour mail, www et databases. Chaque sous-répertoire contient lui-même un sous-répertoire pour les applications concernées, si bien que www a des sous-répertoires pour mozilla et lynx. Chacun de ces sous-répertoires contient l'information nécessaire à l'installation de cette application. Par exemple:
$ ls -F /usr/ports/www/mozilla ./ Makefile distinfo pkg-descr pkg-message ../ README.html files/ pkg-descr.gtk2
Dans le précédent article, nous collections les informations des fichiers Makefile, pkg-descr et pkg-message à l'aide de quelques-uns des utilitaires abordés et de leurs options.
La collection des ports évolue constamment. De nouveaux ports sont ajoutés régulièrement, typiquement chaque jour. Si vous êtes du genre curieux et que vous voudriez observer quels ports furent ajoutés quel jour, vous trouverez FreshPorts particulièrement précieux.
C'est super d'avoir une collection si dynamique, mais cela signifie aussi que l'arborescence des ports, la structure des répertoires sous /usr/ports, peut rapidement devenir obsolète. Pour rester en phase et vous assurer de garder la possibilité de construire n'importe quel port disponible, utilisez cvsup.
[modifier] Synchroniser votre arbre de ports
J'ai souvent mentionné cvsup. Si vous n'utilisez pas encore cvsup, vous feriez bien de lire le chapitre du Manuel FreeBSD intitulé "Utiliser CVSup" avant de vous lancer. Le Manuel est le meilleur endroit pour acquérir une bonne compréhension de tout le processus cvsup. Une fois prêt:
% cd /usr/ports/net/cvsup-without-gui % make install clean
cvsup peut être utilisé pour tenir à jour aussi bien votre système d'exploitation que la collection des ports. Si vous êtes intéressé seulement par la synchronisation de votre arbre de ports, un fichier tel celui-ci fera l'affaire:
% more /root/cvs-supfile *default host=cvsup.ca.freebsd.org *default base=/usr/local/etc/cvsup *default prefix=/usr *default release=cvs delete use-rel-suffix compress ports-all tag=.
(ndt : Il conviendra de changer la variable host de votre fichier pour choisir le serveur cvsup le plus proche. La liste des miroirs cvsup est disponible dans le handbook)
Ce fichier sera invoqué avec la commande suivante en tant que super-utilisateur :
% cvsup -g -L 2 ~/cvs-supfile
Si le fichier ou la commande reste obscure à vos yeux, lisez le chapitre du Manuel mentionné plus haut. Notez également que =. dans la ligne ports-all est importante, vérifiez donc bien que votre fichier la contient.
Cette commande cvsup téléchargera tous les derniers bouts de la collection des ports pour les ajouter à votre arbre des ports. C'est le genre de commandes qu'il est bon d'exécuter quotidiennement, vous voudrez donc peut-être en faire un travail pour cron (NdT: sera peut-être traduit plus tard).
Le processus de cvsup met également à jour un fichier nommé /usr/ports/INDEX. Ce fichier contient une liste complète des ports contenus dans votre arbre. Pour voir si votre arbre est à jour, utilisez la commande:
$ ls -l /usr/ports/INDEX -rw-r--r-- 1 root wheel 3678738 May 17 17:04 INDEX
Cette machine-là a été installée le 17 mai et je n'ai pas tenu à jour son arbre de ports. Si je compare ce système à ma machine principale, cvsupée quotidiennement:
$ ls -l /usr/ports/INDEX -rw-r--r-- 1 root wheel 3912366 Aug 17 08:50 INDEX
vous verrez que la taille de ce fichier, et par conséquent le nombre de ports, a considérablement augmentée au cours de ces trois mois.
[modifier] Mettre à jour la base de données des ports
OK, on est finalement prêts pour portupgrade et sa suite d'utilitaires. Après chaque cvsup, exécutez cette commande:
% portsdb -Uu
La première fois que vous utilisez cette commande, une base de données nommée INDEX.db sera créée dans /usr/ports. Cette base de données sera mise à jour à chaque fois que vous exécuterez cette commande portsdb juste après un cvsup. Si vous utilisez l'utilitaire file, vous verrez que vous ne pourrez pas accéder au contenu d'INDEX.db, puisqu'il ne s'agit pas d'un fichier texte ASCII:
$ file /usr/ports/INDEX.db /usr/ports/INDEX.db: Berkeley DB 1.85/1.86 (Btree, version 3, native byte-order)
Néanmoins, plusieurs utilitaires de portupgrade feront usage de cette base de données. Le terme Btree fait référence à un type d'algorithme de base de données conçu pour mener rapidement des recherches parmi une grande quantité de données. C'est idéal pour la collection des ports -- nous verrons que certains utilitaires de portupgrade sont plus rapides et plus efficaces que leurs homologues du dernier article, à cause de ce format Btree.
Il vous faudra être patient, portsdb prenant un certain temps à s'exécuter. Une fois terminé, vous voila prêt à utiliser portversion pour voir si certains des ports que vous avez installés doivent être mis à jour. Vous souvenez-vous de cette commande ?:
% portversion -vL "="
Si la commande renvoie quelque-chose, la prochaine étape sera de les mettre à jour. Sans trop de surprise, nous utiliserons portupgrade, qui se fait appeler aussi portinstall.
[modifier] Mettre à jour les ports
Dans la forme la plus simple, portupgrade -a met à jour tous (-a) les ports le nécessitant. Toutefois, il se peut qu'au fil du temps vous finissiez par avoir des ports qui refusent de se mettre à jour. Cette anomalie apparente ne provient pas de limitations inhérentes à portupgrade, mais c'est plutôt la réalité des dépendances.
Un port a deux types de dépendances. Le premier est appelé build dependency et fait référence à n'importe quel autre port qui doit être installé avant que le port en question ne s'installe correctement. Le second type fait référence aux ports s'appuyant sur le port que vous souhaitez mettre à jour. Vous vous souvenez peut-être du précédent article que pkg_delete ne vous laissera pas désinstaller une application si d'autres applications dépendent d'elle.
Si vous mettez à jour uniquement une application sans vérifier si ses dépendances n'ont pas besoin d'une mise à jour elles-aussi, vous finirez avec des applications qui refusent de se mettre à jour. En guise de prévention, faites usage des deux options récursives de portupgrade de cette façon:
% portupgrade -arR
L'option -R vérifiera les dépendances de construction et -r s'occupera des applications dépendant de l'application mise à jour. Cela empêchera à votre système de voir ses dépendances désynchronisées et de subir des problèmes d'incompatibilités.
Occasionnellement, en faisant usage de portupgrade ou de ses utilitaires, vous verrez un message vous demandant d'exécuter pkgdb -F. Comme le nom vous a peut-être permis de le deviner, cet utilitaire met à jour une base de données des paquetages. Cette base se trouve dans /var/db/pkg/pkgdb.db. Celle-ci est elle-aussi au format Btree pour optimiser le temps de recherche.
Si on vous demande d'exécuter pkgdb -F, faites-le. Néanmoins, n'interrompez pas cette commande sous peine d'aboutir à une base incohérente. Si vous atterrissiez malgré tout dans cette position inconfortable, la commande suivante se chargerait de corriger les incohérences:
% pkgdb -fu
C'est un groupe d'option plutôt facile à retenir, étant donné que des choses similaires vous traverseront sûrement l'esprit à ce moment-là. (NdT: 'fu' est un raccourci de Fuck You...)
Exécuter pkgdb avec -F réparera la base de données interactivement. Cela signifie que pkgdb s'arrêtera pour vous demander quoi faire chaque fois qu'il rencontrera une erreur. Mickael Lucas a écrit un article (Cleaning Up Ports) notamment sur la façon de répondre à cela. Néanmoins, si vous êtes intimidé de devoir fournir les "bonnes" réponses aux questions de pkgdb, utilisez plutôt les options -fu et il fera silencieusement ce qu'il pense être le mieux. Si vous êtes vraiment parano, une alternative est -Fa, qui indique à pkgdb de corriger seulement les discordances qui peuvent être réparées en toute sécurité.
Tout ça a l'air bien plus effrayant que ça ne l'est en réalité. Vous ne serez que rarement contraint à exécuter pkgdb -F. pkgdb est en fait plus souvent utilisé dans d'autres buts, c'est pourquoi il s'appelle aussi pkg_which.
[modifier] Utiliser pkg_which
pkg_which (ou pkgdb) peut servir à trouver à quelle application appartient un certain fichier. Voici un simple exemple montrant la différence entre la commande de base which et pkg_which:
$ which pkgdb /usr/local/sbin/pkgdb
which sert à retrouver le chemin vers une application. pkg_which me dira à quel port appartient une certaine application:
$ pkg_which pkgdb portupgrade-20030723
Cette commande est équivalente à la précédente utilisant pkg_which:
$ pkgdb pkgdb portupgrade-20030723
Voila un autre exemple. Disons que vous vous intéressez à /usr/local, l'arborescence contenant les fichiers utilisés par les applications installées. Vous trouvez tout un tas de fichiers et vous n'avez pas la moindre idée de leur origine ni de l'application dont ils font partie. Voila un boulot pour pkg_which. Jetez un oeil à cet extrait pris sur mon système:
$ ls /usr/local/bin | grep yaf tryaffix* yaf-cdda* yaf-mpgplay* yaf-splay* yaf-tplay* yaf-vorbis* yaf-yuv*
Si vous êtes comme moi, ces fichiers n'ont absolument aucun sens pour vous. Voyons à quelle(s) application(s) ils appartiennent:
$ pkg_which *yaf* ispell-3.2.06_3 kdemultimedia-3.1.3 kdemultimedia-3.1.3 kdemultimedia-3.1.3 kdemultimedia-3.1.3 kdemultimedia-3.1.3 kdemultimedia-3.1.3
pkg_which comprend quelques options utiles. L'une d'elles est -o, ou 'origine'. Disons que vous ne vous rappeler plus d'où venait kdemultimedia-3.1.3. Essayez ça:
$ pkg_which -o kdemultimedia-3.1.3 multimedia/kdemultimedia3
La sortie indique que le répertoire sous lequel l'application a été construite est /usr/ports/multimedia/kdemultimedia3.
L'option -v peut être utile, elle aussi. Pour savoir quelle application kde est installée actuellement:
$ pkg_which -v kde* kde-config: kdelibs-3.1.3 kdebugdialog: kdebase-3.1.3 kded: kdelibs-3.1.3 kdeeject: kdebase-3.1.3 kdeinit: kdelibs-3.1.3 kdeinit_shutdown: kdelibs-3.1.3 kdeinit_wrapper: kdelibs-3.1.3 kdepasswd: kdeutils-3.1.3 kdeprintfax: kdebase-3.1.3 kdesktop: kdebase-3.1.3 kdesktop_lock: kdebase-3.1.3 kdessh: kdeutils-3.1.3 kdesu: kdebase-3.1.3 kdesu_stub: kdelibs-3.1.3 kdesud: kdebase-3.1.3 kdevdlg2ui: kdevelop-2.1.5 kdevelop: kdevelop-2.1.5
La sortie en est instructive. Chaque ligne indique le nom d'une application, suivi d'un : et du nom du port qui a installé l'application. Il semblerait bien que la machine emploie KDE version 3.1.3.
Avant d'aller plus loin, résumons les étapes à suivre pour garder vos applications à jour:
- exécutez cvsup pour garder l'arbre de ports synchronisé
- exécutez pkgdb pour mettre à jour INDEX.db
- utilisez portversion pour déterminer quelle(s) application(s) nécessite(nt) une mise à jour
- utilisez portupgrade pour procéder à leur mise à jour
[modifier] Options supplémentaires de portupgrade
Nous avons déja vu que portupgrade -arR mettra à jour correctement toutes les applications en ayant besoin. Toutefois, portupgrade possède quelques options permettant de choisir quelles applications mettre à jour et comment le faire.
Une option utile si vous n'avez pas une connexion permanente à Internet est -F. Habituellement, lors d'une mise à jour, portupgrade ira chercher un fichier dont il a besoin puis passera un certain temps à construire ce qu'il faut. Si vous faites une grosse mise à jour comme celle de KDE, il aura sans doute besoin d'aller sur Internet quelques fois sur une période de plusieurs heures.
Cette commande ira chercher sur Internet tous les fichiers indispensables à la mise à jour de vos ports, sans rien installer:
$ portupgrade -aFrR
Une fois téléchargés tous ces fichiers, vous pouvez vous déconnecter d'Internet et exécuter portupgrade -arR comme d'habitude.
Une autre option disponible est -n. Cela vous dit simmplement ce que ferait portupgrade sans vraiment qu'il ne le fasse. C'est particulièrement utile si vous êtes inquiet ou un peu parano, et voulez savoir par avance ce qui arrivera à votre installation. En voici une sortie à titre d'exemple:
$ portupgrade -anrR ---> Session started at: Sun, 17 Aug 2003 22:06:00 -0400 <a page of output snipped> ---> Reporting the results (+:done / -:ignored / *:skipped / !:failed) - lang/ruby16 (ruby-1.6.8.2003.04.19) - net/cvsup-without-gui (cvsup-without-gui-16.1h) + lang/ruby16-shim-ruby18 (ruby-shim-ruby18-1.8.0.p2.2003.04.19) + databases/ruby-bdb1 (ruby-bdb1-0.1.9) - sysutils/portupgrade (portupgrade-20030723) - www/lynx (lynx-2.8.4.1d) ---> Session ended at: Sun, 17 Aug 2003 22:06:02 -0400 (consumed 00:00:02)
Regardons de près cette sortie. portupgrade a fait le tour des ports installés et compilé ses résultats dans un rapport. Chaque ligne de ce rapport montre l'origine du port, la version installée actuellement et un symbole indiquant si une mise à jour est nécessaire ou non. Le présent rapport montre que deux ports ont besoin d'une mise à jour. Ce sont ceux dont la ligne débute par +. Si je compare ce résultat avec celui de portversion, je verrais bien sûr les mêmes résultats, présentés différemment:
$ portversion -l "<" ruby-bdb1 ruby-shim-ruby18
Si vous êtes prudent quant à ce qui doit être mis à jour sur votre système, employez l'option -i, ou 'interactive'. Ajoutez-la à vos autres options et portupgrade marquera une pause avant de mettre à jour toute application ou dépendance, comme ceci:
---> Upgrading 'ruby-bdb1-0.1.9' to 'ruby-bdb1-0.2.1' (databases/ruby/bdb1) OK? [yes]
Notez la réponse par défaut à "Oui" entre crochets. Cela signifie qu'en appuyant sur ENTREE, vous acquiescez. Si vous préférez ne pas mettre à jour ce port, saisissez le mot "no" à la place.
La dernière option que je voudrais aborder est -l, ou 'log'. Cette option n'a pas de prix, lorsqu'un port refuse de s'installer et que vous avez besoin d'envoyer la sortie à quelqu'un d'autre. Ci-après, je vais mettre à jour un port déterminé et envoyé la sortie du processus dans un fichier nommé logfile:
$ portupgrade -rR ruby-shim-ruby18 -l logfile
Il vaut mieux éviter l'emploi de -l avec -a, surtout si vous avez un grand nombre de ports réclamant une mise à jour. Personne ne voudrait patauger dans un fichier de log aussi gros.
Dans le prochain article, je souhaite discuter de la désinstallation des ports et du nettoyage des fichiers qui ne sont plus utilisés par aucun port. On devrait aussi avoir le temps d'y jeter un oeil à la personnalisation de pkgtools.conf.

