Mettre ses packages à jour sans tout casser
Traduction française de l'article publié initialement à cette adresse.
La méthode de construction des packages décrite dans ce howto utilise un “bac à sable” (ou sandbox), dans laquelle on va recompiler puis installer tous les packages nécessitant une mise à jour.
Une fois tous les packages correctement installés dans la sandbox, on génèrera les packages binaires correspondants, et on les utilisera pour mettre à jour l'environnement “réel”.
Préparation
- Mettre ses arbres de packages (/usr/pkgsrc - et éventuellement /usr/pkgsrc/wip) à jour, par la méthode de votre choix. Voir par ailleurs les autres tips de ce wiki.
- Afin de ne pas recompiler de packages dont vous n'avez plus besoin, il peut être intéressant de désinstaller tous les “leaf” packages dont vous ne vous servez plus. Pour celà, on peut par exemple utiliser pkg_rmleaves.
Création de la sandbox
La création de la sandbox n'est à faire qu'une seule fois. Pour ce faire, nous avons le script /usr/pkgsrc/mk/bulk/mksandbox à disposition.
Pour xorg natif
sudo mkdir /usr/sandbox cd /usr/sandbox sudo /usr/pkgsrc/mk/bulk/mksandbox /usr/sandbox
Pour xorg modulaire
sudo mkdir /usr/sandbox cd /usr/sandbox sudo /usr/pkgsrc/mk/bulk/mksandbox --without-x /usr/sandbox echo "X11_TYPE=modular" | sudo tee -a /usr/sandbox/etc/mk.conf
Le script a “null-mounté” en lecture seule tous les répertoires nécessaires au chroot, et en lecture-écriture tous les répertoires dans lesquels nous allons travailler.
guigui@lopette [~] % mount [22:52] /dev/wd0a on / type ffs (soft dependencies, local) /dev/wd0f on /var type ffs (soft dependencies, local) /dev/wd0e on /usr type ffs (soft dependencies, local) /dev/wd0g on /home type ffs (soft dependencies, local) mfs:159 on /tmp type mfs (synchronous, local) kernfs on /kern type kernfs (local) ptyfs on /dev/pts type ptyfs (local) procfs on /usr/pkg/emul/linux/proc type procfs (local) /bin on /usr/sandbox/bin type null (read-only, local) /sbin on /usr/sandbox/sbin type null (read-only, local) /lib on /usr/sandbox/lib type null (read-only, local) /libexec on /usr/sandbox/libexec type null (read-only, local) /usr/X11R6 on /usr/sandbox/usr/X11R6 type null (read-only, local) /usr/bin on /usr/sandbox/usr/bin type null (read-only, local) /usr/games on /usr/sandbox/usr/games type null (read-only, local) /usr/include on /usr/sandbox/usr/include type null (read-only, local) /usr/lib on /usr/sandbox/usr/lib type null (read-only, local) /usr/libdata on /usr/sandbox/usr/libdata type null (read-only, local) /usr/libexec on /usr/sandbox/usr/libexec type null (read-only, local) /usr/lkm on /usr/sandbox/usr/lkm type null (read-only, local) /usr/share on /usr/sandbox/usr/share type null (read-only, local) /usr/sbin on /usr/sandbox/usr/sbin type null (read-only, local) /var/mail on /usr/sandbox/var/mail type null (read-only, local) /usr/src on /usr/sandbox/usr/src type null (read-only, local) /usr/pkgsrc on /usr/sandbox/usr/pkgsrc type null (local) /usr/pkgsrc/packages on /usr/sandbox/usr/pkgsrc/packages type null (local) /usr/pkgsrc/distfiles on /usr/sandbox/usr/pkgsrc/distfiles type null (local)
Le script qui controle ces “null-mounts” se trouve dans /usr/sandbox/sandbox. Il a été invoqué lors de la création de la sandbox. Mais il faudra l'invoquer à nouveau à chaque fois que vous voudrez vous resservir de la sandbox, de la manière suivante:
/usr/sandbox/sandbox mount
pour effectuer le montage,
/usr/sandbox/sandbox umount
pour le démontage.
Peuplement de la sandbox
Afin de pouvoir travailler dans de bonnes conditions, il est nécessaire d'installer quelques packages dans la sandbox:
sudo /usr/sandbox/sandbox mount # Si ce n'est pas déjà fait sudo chroot /usr/sandbox /bin/sh cd /usr/pkgsrc/shells/zsh-current # Ou votre préféré sudo make install clean clean-depends cd /usr/pkgsrc/pkgtools/pkg_tarup sudo make install clean clean-depends
Création de la liste des packages à mettre à jour
Cette étape est à faire à l'extérieur de la sandbox.
cd /usr/sandbox/tmp lintpkgsrc -i > out_of_date # Génération de la liste des packages à mettre à jour pkgdepgraph -D out_of_date > to_delete # Génère la liste des packages à supprimer avant de commencer. pkgdepgraph -R out_of_date > rebuild.sh # Génère le script pour reconstruire les package dans le bon ordre
Mise à jour
A l'intérieur de la sandbox, on se place dans le répertoire tmp, on supprime les packages outdated, et on lance le script rebuild.sh qui va recompiler tous les paquets et leurs dépendances:
cd /tmp pkg_delete -r `cat to_delete` sh rebuild.sh
Ensuite, il faut s'armer de patience.. De beaucoup de patience, vu qu'il faut recompiler tous les paquets et leurs dépendances. Lors du peuplement initial de la sandbox, il va y avoir un grand nombre de packages à compiler et à installer.
L'avantage de cette méthode, c'est que si une compile se vautre pour une raison ou pour une autre, on peut tranquillement chercher à corriger l'erreur tout en continuant à avoir un système fonctionnel à côté.
Conseil: si vous recompilez vos packages sur plusieurs jours - vu le temps que çà prend - ne mettez pas votre pkgsrc tree à jour, sinon vous allez au devant de surprises…
Création des packages binaires
Quand tout a été recompilé sans erreurs, il faut créer les packages binaires, que l'on utilisera ensuite pour mettre à jour le “vrai système” - à l'intérieur de la sandbox.
pkg_tarup `pkg_info | cut -d ' ' -f 1 -s`
Ceci crée les paquets binaires installés dans la sandbox dans le répertoire /tmp de la sandbox.
Enfin, on sort de là, et on met le système à jour:
exit cd /usr/sandbox/tmp sudo pkg_add -uu `cut -d "'" -f 2 -s out_of_date`
Et là, on croise les doigts, on serre les fesses, on touche du bois…. pour que tout se passe bien :)
A la fin, on peut vérifier avec lintpkgsrc ou pkg_chk que tout les packages ont bien été mis à jour.
Nettoyage
Enfin, dernière étape, on nettoie:
cd /usr/sandbox/tmp sudo rm -rf *.tgz sudo rm -rf out_of_date rebuild.sh to_delete sudo /usr/sandbox/sandbox umount
Votre système est maintenant à jour.
Cet article est une libre traduction de ce tip: http://diwp.blogspot.com/2006/09/manage-your-packages-in-sandbox-with.html