#+TITLE: ZFS pour des mises à jour sereines #+KEYWORDS: cyborg freebsd planete-libre Avec FreeBSD 9.0 qui est sorti il y a presque six mois, il est grand temps de se mettre à jour. On ne peut pas à la fois prétendre au status de cyborg, et utiliser autre chose que la dernière version de son OS préféré ! Dans [[file:freebsd-zfs-kimsufi.org][un épisode précédent]] on avait installé son serveur avec ZFS, justement pour pouvoir faire des mises à jour avec une solution de repli si les choses tournent mal. On a deux solutions : faire un /snapshot/ puis mettre à jour, avec la possibilité de faire un /rollback/ plus tard ; ou alors installer dans un nouveau volume et pointer le /bootloader/ sur le nouvel environnement. J'ai exploré la deuxième option. Cette deuxième option permet de ne pas tout perdre s'il faut revenir en arrière. On verra dans la suite si cela devait se révéler utile... * Préparation Histoire d'avoir les ports déjà construits, on installe [[http://fossil.etoilebsd.net/poudriere/][poudriere]], la configuration se résume à pointer sur un FTP proche de chez nous. Ensuite on prépare un environnement pour 9.0 : : poudriere jail -c -v 9.0-RELEASE -a amd64 -j poudre90 : poudriere ports -c On récupère la liste des ports installés, et tant qu'on y est on récupère aussi leur configuration pour que poudriere reconstruise les ports avec les bonnes options. : (pkg_version -o; jexecall pkg_version -o) >portlist : sort portlistuniq : cut -d' ' -f1 portlist : cp -r /srv/jails/*/var/db/ports/* /usr/local/etc/poudriere.d/options : poudriere bulk -f portlist * Le système de base Pendant que poudriere mouline, on installe FreeBSD 9.0 sur un système de fichiers à part. : zfs create zroot/slash90 : zfs set mountpoint=/slash90 zroot/slash90 : zfs create zroot/slash90/usr : : cd /slash90 : fetch http://ftp.fr.freebsd.org/pub/FreeBSD/releases/amd64/amd64/9.0-RELEASE/{base,kernel,src}.txz : tar -xpf base.txz : tar -xpf kernel.txz : tar -xpf src.txz Pour les fichiers de configuration, on va copier la configuration depuis notre environnement actuel vers l'installation toute fraîche, puis lancer un coup de =mergemaster(8)= : : cd /slash90/etc : cp -a /etc/ . : chroot /slash90 : mergaster -FUvi On profite également d'être dans un /chroot/ dans =/slash90= pour installer les ports qu'on vient de construire. La configuration réseau a [[http://www.freebsd.org/releases/9.0R/relnotes-detailed.html#AEN1395][un peu changé]]. Une configuration avec plusieurs addresses dans chaque famille ressemble à : #+BEGIN_SRC sh ifconfig_nfe0="inet 203.0.113.13/24" defaultrouter="203.0.113.254" ifconfig_nfe0_ipv6="inet6 2001:db8:1:8248::1/64 accept_rtadv" rtsold_enable="YES" # ou ipv6_defaultrouter="fe80::f00:baa%nfe0" ifconfig_nfe0_alias0="inet 198.51.100.43/32" ifconfig_nfe0_alias1="inet6 2001:db8:1:8248::25" ifconfig_nfe0_alias2="inet6 2001:db8:1:8248::53" #+END_SRC =ipv6_network_interfaces= n'est plus nécessaire. On copie également =/usr/local/etc= dans =/slash90=. * Bascule vers 9.0 Pour basculer d'un environnement vers l'autre, il suffit[fn:1] de faire : : zfs set canmount=noauto zroot/slash82 : zfs set canmount=noauto zroot/slash82/usr : : vi /slash90/boot/loader.conf : # Ajouter : zfs_load="YES" : # et : vfs.root.mountfrom="zfs:zroot/slash90" : zfs unmount zroot/slash90 : zfs unmount zroot/slash90/usr : zfs set mountpoint=/ zroot/slash90 : zfs set mountpoint=/usr zroot/slash90/usr : zpool set bootfs=zroot/slash90 zroot Dans mon cas, l'environnement actuel est installé dans =zroot/slash82=, avec =/usr= qui est dans =zroot/slash82/usr=. Si la racine du système est directement à la racine du /pool/ ZFS, il y aura quelques subtilités, si on passe =zroot= en =noauto= il faudra penser à modifier les autres points de montage par exemple. De plus, chez moi =/var= est dans =zroot/var=, monté automatiquement par ZFS, donc il n'y a pas besoin de le déplacer. Au premier essai, ma /kimsufi/ n'a pas démarré. Un peu d'investigation via le le mode /rescue-pro/ d'OVH (un simple /netboot/ avec les disques accessibles) ne donne rien. Un =zpool import -o altroot=/mnt= plus tard, on refait la bascule dans l'autre sens (en utilisant =zroot/slash82=), et on retrouve une machine qui boote. Le lendemain, je retente l'opération, cette fois en /vKVM/ (une machine virtuelle qui démarre sur le disque dur du serveur), et là... le démarrage se passe correctement. Je ne sais pas pourquoi au premier essai, les choses se sont bloquées au /boot/. Après un peu d'exploration, on voit qu'il y a certaines choses qui ont été « perdues » : - ce qui est dans =/root= (un script de sauvegarde, par exemple) ; - ce qui est dans =/usr/local=. J'ai pensé aux =ports= et à leur configuration, mais j'ai laissé de côté le RTM d'OVH, les dossiers de données de =poudriere=... ; - =/home= (qui ne contenait guère que =~fred/.ssh/authorized_keys= d'intéressant). Il suffit de monter =zroot/slash82= (qui est actuellement en =canmount=noauto=) pour avoir accès à ses données et les réinstaller. * Les /jails/ On pourrait tout à fait adopter la même procédure : installer dans un système de fichiers à part, y compris les ports, rapatrier les configurations, et pointer /ezjail/ vers la nouvelle installation. La mise à jour en place semble plus simple, et tellement moins risquée que pour la machine hôte... : ezjail-admin update -s 8.2-RELEASE -U Attention, =freebsd-update= essaie de mettre à jour le noyau, il faut le relancer à la main une deuxième fois. Malheureusement, il faut lancer à la main =mergemaster= pour chacune des /jails/ (et tant qu'on y pense, mettre à jour le gabarit d'ezjail). Pour les ports, grâce à la préparation faite plus haut, on a déjà des packages binaires à jour pour nos /jails/, et il suffit de lancer un =jexecall portmaster -a= pour tout mettre à jour. * Conclusion Le passage à 9.0 n'a pas été aussi facile qu'attendu. En particulier, je ne sais pas pourquoi le premier démarrage n'a pas réussi du premier coup, et si c'est dû à l'utilisation de ZFS ou pas. De plus, la méthode que j'ai suivie n'était pas idéale ---je suppose qu'en ayant de vraies procédures de /backup-restore/, je n'aurais pas oublié RTM ou les scripts qui traînent dans =/root=. D'un autre côté, le paramètre =bootfs= plus jouer un peu avec les points de montage permet de basculer facilement d'une installation à l'autre ; c'était une promesse de ZFS, et cette promesse est tenue. Au premier essai, c'est ce qui m'a permis de revenir sur une configuration fonctionnelle. Je regrette de ne pas avoir adopté poudriere plus tôt. * Footnotes [fn:1] Il serait certainement possible de laisser =/usr= hériter de =zroot/slashXX=, et ainsi il n'y aurait qu'un seul point de montage à déplacer.