Passage de mercure à Lenny avec snapshots LVM

Ces quelques notes décrivent le passage à lenny du serveur mail du ResEl. L'idée principale a été d'utiliser des snapshots LVM afin de laisser une instance de la machine tourner en etch et rendre le service prévu, pendant qu'une deuxième instance est lancée avec une deuxième adresse IP et est mise à jour en lenny.

Elles ont été publiées une première fois sur gestion@, la liste de diffusion des administrateurs, puis complétées pour Linux Attitude avant d'être publiées ici même.

1. Entraînement sur echelon

1.1. Vue d'ensemble

Mercure est le serveur mail du ResEl. Pour éviter de tout casser, pour tirer avantage de la virtualisation, et parce que cela semble être la mode parmi ceux qui parlent d'ext4/zfs/btrfs, j'ai décidé d'utiliser des snapshots LVM. Le premier essai a été fait sur echelon, la machine de surveillance. C'est une machine qui est clairement non critique, dans le sens où si elle tombe les utilisateurs ne s'en plaindront pas (tout au plus, il y aura du retard dans le scan de garbage…).

L'idée est de faire un snapshot de la machine en version lenny. La machine (echelon-etch, ou echelon tout court) continue de tourner sur ce snapshot, pendant qu'une deuxième instance (echelon-lenny) est lancée et mise à jour sur le volume principal. Cela peux sembler contre-intuitif, mais est dû à la mécanique des snapshots LVM : il n'est pas possible de détruire le « volume principal » pour ne garder que le snapshot ; hors à terme, c'est la version passée en lenny qui sera conservée. De plus (mais c'est secondaire, « l'espace disque ça coûte pas cher »), les snapshots ont une taille fixée à l'avance, et le delta entre le volume initial et le snapshot ne doit surtout pas dépasser la taille fixée à la création.

On me souffle à l'oreillette que Linux 2.6.33 supporte la fusion de snapshots. Mais 2.6.33 est bien loin de trolls

1.2. Préparation de echelon-lenny / echelon-etch

Bref, allons-y. Sur trolls, qui est la dom0 hébergeant les fichiers de configuration des VM :

cd /srv/VM/config
cp echelon.cfg echelon-lenny.cfg
vi echelon-lenny.cfg

Dans echelon-lenny.cfg :

  • renommer la VM en echelon-lenny
  • ne pas modifier les disques (pour mercure : enlever les partitions mail !)
  • passer les @IP de .12 à .16
  • idem pour les @mac, de :0c à :10

Dans echelon.cfg :

  • renommer la VM en echelon-etch
  • changer les disques : e3.6 -> echelonetch et e3.7 -> echelonetchswap
  • ne pas modifier les @IP ou mac

Ici, checkdisklink.py a dit que la partition e3.6 n'était plus visible, donc il a mis echelon en pause : normal, cette partition n'était pas encore exportée en AoE, et même elle n'avait pas encore été créée (chekdisklink.py est un script tournant sur chaque dom0, vérifiant si les disques de chaque dumU sont accessibles). Pour mercure, penser à éteindre checkdisklink.py avant de modifier mercure.cfg.

Dans /etc/inittab, ajouter les exports AoE de e3.6 et e3.7.

lvcreate --size 512M -n echelon_etch_swap vg1
mkswap echelon_etch_swap

1.3. Basculement de echelon-etch sur son snapshot

À ce point, echelon est toujours en train de tourner. On va l'arrêter, faire le snapshot, rendre les nouveaux volumes (e3.6 et e3.7) disponibles en AoE, et relancer echelon-etch.

ssh echelon
sudo halt
# de retour sur trolls
lvcreate -s --size 2G -n echelon_etch vg1/echelon
# lancer vblade e3.6 et e3.7 sur echelon_etch{,_swap}
init q  
xmg create echelon perceval 
# oups, le fsck parce que ça n'avait pas été fait depuis longtemps

Temps total avec echelon down : quelques minutes, penser à faire un tune2fs pour éviter le fsck

Vérifier que echelon-etch tourne bien avec le nouveau disque.

1.4. Mise à jour de echelon-lenny

Monter vg1/echelon en local sur trolls, mettre à jour les fichiers suivants :

  • /etc/network/interfaces
  • hostname
  • udev/...persistent-net.rules
  • ssh/sshd_config

>>> Non ! ne pas changer hostname : après la machine n'arrive pas à résoudre son propre NDD, et ça bafouille dans tous les sens.

Démonter vg1/echelon.

Refaire le lien /etc/xen/echelon-lenny.cfg vers /srv/VM/cofig.

xmg create echelon-lenny galaad

Éteindre les services pas nécessaires, mettre à jour la Debian normalement (en suivant les notes de mise à jour !).

Sur echelon, postfix/ma{in,ster}.cf ont été automatiquement modifiés (bien sûr, sur mercure, la même chose sera à faire, et les modifications à vérifier).

1.5. Arrêt de echelon-etch et mise en production d'echelon-lenny

Rebasculement vers la version mise à jour : sudo halt sur echelon-lenny , monter la partition sur trolls, annuler les modifications faites à /etc/network/interfaces & friends, svn revert echelon.cfg pour retrouver notre echelon du début.

xmg shutdown echelon-etch
xmg create echelon galaad

Ce coup-ci, Nagios n'a pas eu le temps de voir qu'echelon s'est éteinte.

1.6. Soucis constatés

Pour me repérer entre echelon-etch et echelon-lenny, j'avais modifié /etc/hostname de echelon-lenny. Il y a un certain nombre de systèmes qui n'aiment pas ne pas pouvoir résoudre le hostname de la machine, au vu du nombre de mails (que j'ai droppé) contenant « can't resolve echelon-lenny ».

echelon-lenny ne pouvait pas se connecter à maia (compte MySQL / pgSQL). Donc, je n'ai pas testé voir si somak continait à marcher, ayant la flemme de refaire un compte avec la nouvelle IP d'echelon-lenny. On aura le même souci avec la base MySQL de sympa (qui devra probablement être convertie…) -> les modifications faites sur la base MySQL de sympa le temps de la MàJ seront perdues.

D'une manière générale, vérifier que mercure-lenny fonctionnera bien ne sera pas forcément trivial.

2. Passage de mercure à lenny

2.1. Préparation de mercure

mercure_etch -> e3.8
mercure.cfg : e1.13
phy:/dev/etherd/e0.0,hda10,r',
@IP : .106, et @mac : :70

Désactivation du fsck régulier pour éviter qu'il ne tourne au reboot de mercure.

On a gardé /var/lib/postfix dans / : bonne idée ?

Fichiers modifiés après avoir monté mercure en local :

network/interfaces, udev/rules/...persistent-net, ssh/sshd_config, fstab

mercure-lenny relancée sur galaad.

2.2. Mise à jour de mercure-lenny

Après le premier allumage, éteindre amavisd, postgrey, spamd, whitelister, clamd n'a pas réussi à démarrer sans /var/log, authdaemond, imapd, pop3d, inn2, postfix, sympa, apache, munin.

Il a fallu fusionner à la main divers fichiers de configuration : /etc/default/saslauthd, /etc/courier/pop3d-ssl, /etc/courier/imapd, /etc/courier/imapd-ssl, vérifier /etc/amavis/conf.d/15-content_filter_mode, /etc/amavis/conf.d/50-user.

WWSympa : modification de la position de la CSS.

sympa : il a fallu refaire le lien /var/lib/sympa -> /srv/mail/lib-sympa

Recoder les descriptions de listes en UTF-8 (puisqu'au moment de l'upgrade, sympa --upgrade ne pouvait pas voir les vrais définitions de listes).

Sympa n'avait pas accès à ses bases de données, les mots de passe ont dû être restaurés depuis un backup (changement subtile dans le format de la base de données ? je n'ai rien vu pour ma part…)

2.3. Soucis constatés sur mercure

La partition des mail et de sympa (le gestionnaire des listes de diffusion) est séparée de la partition racine. Je m’étais dit que chouette, les mails vont continuer à vivre leur vie, et lors du basculement sur la version de mercure mise à jour, on va récupérer la queue des mails, et les modifications faites par les lusers sur les fichiers de conf de sympa, tout ça. Le problème, c’est qu’il s’est passé avec les fichiers de conf ce que je craignais avec les base SQL de sympa : l’un des scripts post-upgrade de sympa a fait des modifications (une sombre histoire d’encodage des fichiers) sur les configurations des listes de diffusion. Lors du basculement sur la version de mercure mise à jour, sympa n’avait plus les fichiers dans le format qu’il attendait, et a refusé de redémarrer. Dans le même genre, les seuils des spams ont dû changer, et après le passage à mercure-lenny, plein de spams ont été acceptés ; on a eu aussi des problèmes avec les mots de passe sur sympa.

En résumé, on a eu deux soucis : les modifications sur les fichiers de configuration des listes de diffusion par les scripts post-upgrade de Debian ont été perdues. L’alternative était de perdre les modifications faites sur ces fichiers par les lusers le temps de l’upgrade (et non, je ne me voyais pas faire le merge à la main). L’autre souci, c’est que certains effets de la mise à jour ne peuvent se manifester que lors du passage en production.

La mécanique des snapshots en elle-même a bien fonctionné ; j’ai pu tester, en étant serein, un certain nombre de services de mercure avant le basculement. Xen en permettant de lancer rapidement une copie d’une machine sur un snapshot a également été utile (pour une fois au ResEl ?).

Auteur : Frédéric Perrin

Date : samedi 8 mai 2010, modifié le samedi 22 janvier 2011

Sauf mention contraire, les textes de ce site sont sous licence Creative Common BY-SA.

Ce site est produit avec des logiciels libres 100% élevés au grain et en plein air.