Vous êtes ici : accueil » article » FreeBSD, mise à jour majeure (système et jails)

FreeBSD, mise à jour majeure (système et jails)

Rédigé par Gérald Niel - - 3 commentaires

Petit complément à mon premier pense-bête… qui est incomplet ! Et comme à mon habitude, j'ai oublié de RTFM, et du coup j'en ai fait les frais.
Donc on va voir ce qu'il ne faut surtout pas faire, et finalement comment s'en sortir…

Puisqu'on parle de RTFM, pour une mise à jour majeure, c'est à dire avec un changement de version du système, il faut absolument lire, et suivre le manuel :

Et n'oubliez pas le $ man ezjail-admin, et comme il s'agit de mettre à jour le système, allons directement au chaptitre ezjail-admin update :

     -u      Use freebsd-update(8) to update the basejail. Note that as
             freebsd-update(8) uses “uname -r” to determine the currently
             running system, the base jail and the host need to be updated at
             the same time, without rebooting on the new kernel in the
             meantime.

Et évidement, si vous êtes un peu pressé, confiant (comme moi), voir insouciant, vous n'avez pas bien lu, ni prêté attention au fait qu'il ne faut surtout pas redémarrer l'hôte après le premier freebsd-update -r 11.1-RELEASE upgrade (il s'agissait pour moi de mettre à jour de 11.0 vers 11.1, ce qui est normalement trivial).
Donc vous y êtes allez gaiement, enchainant les freebsd-update install et les reboot du sytème. Puis ensuite une fois l'hôte complètement installé vous allez tranquillement et toujours confiant faire le ezjail-admin update -u sans autre forme de procès.

Et là… c'est le drame…

Enfin, pas tout de suite, c'est assez sournoit cette histoire. Parce que dans le cas de la mise à jour de 11.0-RELEASE vers 11.1-RELEASE tout fonctionne à priori sans problème, et vous n'avez pas encore mis à jour les paquets à coup de pkg upgrade dans les jails (voir si vous êtes confiant, vous y êtes allez gaiement en faisant une mise à jour globale).
Et on relance les services… PostgreSQL par exemple, et là, rien ne va plus, mais alors plus du tout et vous voilà avec un beau:

/usr/local/bin/postgres: Undefined symbol "fdatasync"

Qu'à cela ne tienne, vous n'allez pas vous laissez abattre pour si peu, probablement le binaire qu'est pas à jour, c'est pas vous qui avez fait une connerie (confiant je vous dis), donc direction /usr/ports/database/postgresql95-server et allons y pour le make deinstall && make reinstall (ou même pas le make config, confiant vous êtes).

Et là, drame, acte II :

/!\ WARNING /!\

Ports Collection support for your FreeBSD version has ended, and no ports are
guaranteed to build on this system. Please upgrade to a supported release.

No support will be provided if you silence this message by defining
ALLOW_UNSUPPORTED_SYSTEM.

Et bien sûr, pressé (dans mon cas) de retrouver une instance Mastodon fonctionnelle, vous allez pas vous laissez emmerder, et malgré tout les avertisssements vous allez fixer la variable ALLOW_UNSUPPORTED_SYSTEM à 1. Et vous allez recompiler ce foutu port de PostgreSQL.
Grave erreur… parce que dans mon cas, ça a fonctionné, mais il n'y a pas que ça de cassé. Et vous vous retrouvez avec des trucs pas très stables qui déconnent dans tout les sens, mais insidueusement.

Et pourtant, vous avez vérifié, revérifié que tout était bien synchro, dans l'hôte :

$ freebsd-version -ku
11.1-RELEASE-p4
11.1-RELEASE-p6

$ uname -a
FreeBSD hostname 11.1-RELEASE-p4 FreeBSD 11.1-RELEASE-p4 #0: Tue Nov 14 06:12:40 UTC 2017     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  amd64

Dans la jail (sans le k, on a pas de kernel à l'intérieur des prisons, c'est celui de l'hôte):

$ freebsd-version -u
11.1-RELEASE-p6

$ uname -a
FreeBSD hostname 11.1-RELEASE-p4 FreeBSD 11.1-RELEASE-p4 #0: Tue Nov 14 06:12:40 UTC 2017     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  amd64

Bon c'est quoi le problème, comment on s'en sort ?

Et bien c'est fort simple, comme l'indique la doc (la page de man un peu plus haut) freebsd-update utilise uname -r pour déterminer le système courrent et savoir ce qu'il y a à mettre à jour, donc comme vous avez redémarré sur le nouveau noyau juste après le premier freebsd-update install sur l'hôte, lorsqu'on met à jour depuis ezjail on ne connait plus l'ancienne version du sytème, et la base du sytème des prisons (basejail) n'est donc pas mis à jour… Et reste sur la version précédente, soit dans mon cas 11.0-RELEASE. C'est sournois hein ?

Bon, pas de panique, on va pouvoir s'en sortir, au passage merci à Erwan (vous pouvez allez voir son blog aussi) qui m'a mis sur la piste dans un échange sur Mastodon de ce qui se trouve juste en dessous dans la page de man de ezjail-admin.

     -U      Use freebsd-update(8) to upgrade the basejail to the hosts
             operating system version, or a version you may pass freebsd-
             update's call to “uname -r” via the UNAME_r environment variable.
             Since there currently is no way of inferring the osversion
             currently installed in the basejail, you need to remember the
             original osversion and pass it to this script using the -s
             option.

Donc, en gros, comme lorsqu'on a lancé ezjail-admin update -u après avoir redémarré l'hôte sur le nouveau nouyau et le nouveau système de base, plus aucun moyen pour freebsd-update lancé par ezjail de déterminer la version initiale du système de base pour télécharger ce qu'il y a à mettre à jour. Donc il faut relancer la mise à jour en re-téléchargeant l'ancienne version du système, dans mon cas, pour une mise à jour de 11.0-RELEASE vers 11.1-RELEASE :

ezjail-admin update -U -s 11.0-RELEASE 

Et on retrouve enfin un système fonctionnel, et même pas besoin de redémarrer les jails après cette opération.
Bon, il vaut mieux refaire un pkg upgrade, relancer les services malgrés tout. Ça dépend de ce qui tourne dans les prisons.

En conclusion

Donc pour résumer, pour faire une mise à jour du système, de l'hôte et des jails, pour éviter ces déboires, on lit le manuel, et on procède dans l'ordre (par exemple pour la mise à jour de 11.0-RELEASE vers 11.1-RELEASE :

  1. mise à jour de l'hôte
    $ sudo freebsd-update -r 11.1-RELEASE upgrade
    $ sudo freebsd-update install
  2. On redémarre le système (si nécéssaire, dans ce cas ça l'est) : $ sudo reboot
  3. On met à jour le système de base des prisons en indiquant l'ancienne version
    $ sudo ezjail-admin update -U -s 11.0-RELEASE
  4. On termine l'installation de l'hôte :
    $ sudo freebsd-update install
    $ sudo ezjail-admin update -u
  5. Si nécéssaire on répète les étapes 2 (redémarrage) & 4.

Ce n'est pas très clair entre la page de man et le manuel FreeBSD (chapitre 14.6.4).
Si on en juge la page de man on pourrait enchainer un freebsd-update -u après l'étape 1 avant de rédémarrer sur le nouveau noyau puis passer directement à l'étape 4 après le reboot (étape 2).
Ci-dessus, on se base sur le manuel qui indique qu'il faut mettre à jour le système hôte, redémarrer puis mettre à jour la base des pisons en indiquant l'ancienne version.

Normalement j'ai fait en sorte de mettre dans ce billet à peut prêt tous les mots et phrases clés que j'ai recherché dans mes différents moteurs de recherche (Qwant et DuckDuckGo) sans vraiment trouver la solution ou plutôt la source de mes déboires…

HTH, comme on dit.

3 commentaires

#1 John a dit :

Merci, ça m'a bien aidé.

#2 Doe a dit :

J'avais déjà fait des mises à jour proprement, mais je n'avais pas documenté la procédure. Aujourd'hui je me lance dans la mise à jour de 11.1 vers 11.2. Je fais une recherche et je tombe sur cette belle page qui fait un condensé parfait. Elle est pas belle la vie ?
Merci. :-)

#3 Gérald Niel a dit :

De rien. ;)

Écrire un commentaire

Quelle est la dernière lettre du mot urtw ? :