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

Date: 2011-03-06 17:28
Author: jdn06
Category: Distributions
Tags: FreeBSD, Mises à jour

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)