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

 
howto/majports.txt · Dernière modification: 2010/03/10 08:15 (édition externe)
Derniers changements · Afficher le texte source · Connexion