Comment vieillir prématurément : FreeBSD, de 8.1 à 8.2

L’ouvrage classique de Michael W. Lucas sur FreeBSD le dit bien : « Toute mise à jour d’un système d’exploitation peut accélérer la pousse de vos cheveux blancs. » (FreeBSD 7.0 chez Pearson, p.387) Il faut cependant le vivre pour le comprendre.

Hier soir, de retour à la maison, je décidai de faire une pause dans la correction des montagnes de copies que je dois avoir terminé de corriger demain. Pause geek donc, avec la mise à jour vers Wordpress 3.1. Sauvegardes et installation en moins de cinq minutes ; impeccable.

Comme une pause de cinq minutes est un peu trop courte à mon goût, je prends une décision de bleu, une vraie : passer dans la foulée un serveur FreeBSD de 8.1 à 8.2. C’est vrai, quoi : pourquoi rester sur une vieille branche (même si les màj de sécurité sont assurées pour un bon moment) alors qu’une nouvelle branche toute belle, toute neuve et stable est apparue ?

Après une brève lecture du guide de la nouvelle release et de quelques articles sur les màj de FreeBSD, je lance une magnifique séquence :

freebsd-update upgrade -r 8.2-RELEASE
freebsd-update install
reboot
freebsd-update install

Le changement de noyau ne pose pas de problème, mais le programme de màj me demande de fusionner à la main dans vi tous les fichiers de /etc : ça fait un paquet ! Les instructions annonçaient effectivement pudiquement : « During this process, FreeBSD Update may ask the user to help by merging some configuration files or by confirming that the automatically performed merging was done correctly. » Le plus ridicule (je pèse mes mots) dans l’histoire, c’est que pour 99% des fichiers, les seules différences concernent le commentaire en en-tête :

# nsswitch.conf(5) - name service switch configuration file

<<<<<< current version

# \$FreeBSD\$

=======

# \$FreeBSD: src/etc/nsswitch.conf,v 1.1.10.1.6.1 2010/12/21 17:09:25 kensmith Exp \$

>>>>>> 8.2-RELEASE

#

Un temps fou perdu pour des tâches sans aucun impact sur le fonctionnement de la machine. Je suis assez agacé, je l’avoue. J’envoie donc paître l’ordinateur à grands coups de :q dans chaque fichier ouvert par vi, ayant vérifié que les fichiers restaient ainsi intacts.

Après une bonne vingtaine de minutes de labeur particulièrement répétitif et absurde, l’ordinateur reprend chaque fichier et me demande :

Does this look reasonable (y/n)?

J’appuie donc frénétiquement une centaine de fois sur la touche « y », manière bourrin, puis je m’aperçois, avec l’arrêt brutal de la séquence de mise à jour, que je viens de faire une grosse bêtise. Au lieu de garder inchangés mes fichiers de configuration, ils les a tous modifiés avec une syntaxe illisible puisqu’il a laissé tous les magnifiques caractères qui soulignent les différences :

<<<<<<< current version

=======

>>>>>>> 8.2-RELEASE

Résultat : tout mon /etc est devenu inutilisable tel quel. Heureusement, j’en avais fait une sauvegarde auparavant sur mon poste de travail, avec scp.

Un peu secoué par la catastrophe en cours, je me lance donc dans le rétablissement du répertoire /etc initial. Pas facile car le ssh ne fonctionne plus et le montage de clés USB (que je ne maîtrise pas bien sous FreeBSD) refuse toute partition en ext2 ou xfs (mon poste de travail est sous Linux) et n’accepte que fat32, ce qui fait perdre les droits des fichiers /etc : inacceptable. Je m’en sors avec un tar des fichiers, copié sur la clé en fat32. Mais je commets deux erreurs :

  • Comme ssh est configuré pour ne pas pouvoir se connecter avec root, j’ai effectué le scp avec un nom d’utilisateur. Les fichiers qui ne peuvent être lus que par root sont donc absents de ma sauvegarde (cela je l’ai évidemment réalisé après avoir tout modifié et redémarré, devant l’absence de certains fichiers importants… trop tard…)

  • L’autre erreur est beaucoup plus stupide et triviale. Stressé comme je commence à l’être à l’idée qu’il risque de falloir réinstaller le serveur et m’en passer plusieurs jours, je redémarre sans avoir rétabli les propriétaires (root:wheel) des fichiers de /etc.

Le redémarrage qui suit est donc bourré d’erreurs et le login ne fonctionne plus : tous les authentifications d’utilisateurs ont disparu, y compris celle de root.

Là, évidemment, difficile de ne pas blêmir. Qu’à cela ne tienne, il me reste le mode single user. Je redémarre dans ce mode, exécute un mount -a pour disposer de toutes les commandes, puis réinstalle /etc en prenant soin de rétablir les propriétaires légitimes : root:wheel. Après redémarrage, cela ne règle pas tout : je n’ai toujours plus d’utilisateurs. Redémarrage en mode single user mais la commande passwd root se termine par une erreur.

Il faut récupérer un fichier master.passwd, lancer une commande :

pwd\_mkdb -p /etc/master.passwd

Puis passwd root fonctionne, mais pour les utilisateurs, il faut les recréer, après avoir déplacé leur home, puis recopier le contenu dans le nouvel home créé par la création de l’utilisateur.

Le système est sauvé. Restent les services Apache et MySQL. Plus rien ne marche !

Après bien des questionnements, une recompilation des deux (l’utilisateur-système mysql avait disparu de /etc/passwd après la réinitialisation des comptes utilisateurs), je m’aperçois qu’en fait chacun essaie de démarrer deux fois : une première fois depuis /etc/rc.d/ et une seconde fois (comme cela doit être) depuis /usr/local/etc/rc.d/. Le second démarrage échoue puisque le service est déjà lancé (mais avec de mauvais paramètres puisqu’il ne va pas les chercher dans /usr/local/etc/ mais dans /etc/)

Je supprime donc les lanceurs dans /etc/rc.d/ et tout rentre dans l’ordre.

Ma pause geek aura duré cinq heures au lieu d’une demi-heure… J’en sors plus expérimenté, certes, mais assez peu reposé.

En conclusion :

  • Ne jamais utiliser freebsd-update upgrade. Ça sonne comme du Debian, mais ça n’est pas du Debian. Il existe plusieurs autres méthodes de màj ; je ne compte cependant pas les tester de sitôt.

  • Répéter la màj sur une machine virtuelle avant de s’attaquer au serveur : ça prend un peu de temps, mais je suis sûr qu’on en gagne beaucoup plus qu’on en perd.

  • Ne pas mettre à jour un serveur sans nécessité.

  • Ne pas mettre à jour un FreeBSD sans avoir plusieurs heures devant soi. Je pense cependant que cette remarque est à peu près vraie pour tous les systèmes. C’est là qu’on apprécie vraiment les rolling release : les petits problèmes sont plus fréquents, mais ils s’étalent dans le temps.

  • Un point positif tout de même : le système est costaud, puisqu’on parvient à le rétablir, même quand il manque un gros morceau (l’authentification des utilisateurs et plusieurs autres services)

  • Je suis un peu moins « bleu » et un peu plus « blanc » (de cheveux)

links

social