Rebooter Linux "rapidement" avec KEXEC

Rebooter un serveur est souvent un casse tête et notamment parce que ça prend du temps… KSplice est une technologie unique qui permet d’éviter les « reboot » de Linux lorsque vous appliquez les patchs de sécurité sur vos noyaux UEK, RHCK (le noyau compatible Redhat comme l’appel Oracle), Ubuntu et Fedora. Pourtant, il y a toujours des cas pour lesquels vous devrez rebooter vos serveurs, notamment et par exemple, pour changer de noyau ou pour certains paramètres de boot.

Outre son utilisation avec KDUMP pour collecter les informations lors d’un crash, KEXEC permet également d’accéler les « reboot » en préchargeant un noyau en RAM et en faisant un « bypass » de l’ensemble des opérations d’initialisation des « firmware ». Sur les serveurs qui mettent parfois plusieurs minutes à démarrer l’intérêt est immédiat, même si l’opération n’est pas sans danger…

Note préalable
Il y a 2 causes qui rendent l’utilisation de KEXEC un peu fancy :

  • La première est due au fait que vous changez brutalement de noyau sans arrêter proprement le système et notamment les systèmes de fichiers ou vos clusters. Ce risque peut être facilement évité, cf la méthode « Sur du velours… »
  • La seconde est due au fonctionnement naturel de KEXEC. Vous ne réinitialisez pas les firmware lors du reboot. Il peut arriver – en fait il arrive – que la collaboration entre votre OS et votre système s’en trouve plutôt très perturbée. Testez votre configuration avec ce type de reboot avant de passer vos serveurs en production.

A la hache…

Dans l’exemple ci-dessous, vous allez redémarrer votre système brutalement sur un malentendu ; commencez par décharger une éventuelle image d’OS chargée par KEXEC précédemment :

kexec -u

Chargez ensuite votre noyau en mémoire en reprenant les paramètres en cours (sauf rhgb et quiet) :

kexec  /boot/vmlinuz-2.6.39-400.17.1.el6uek.x86_64 
-l --append="`cat /proc/cmdline | sed 's/rhgb//g' |sed 's/quiet//g'`"
--initrd=/boot/initramfs-2.6.39-400.17.1.el6uek.x86_64.img

Enfin changez de noyau :

kexec -e

Note :
Si vous voulez éviter les mauvaises surprises, vérifiez et modifiez les paramètres « Maximum mount count » et « Check interval » de vos systèmes de fichiers avec tune2fs.

Sur du velours…

Si vous préférez être prudent, procédez plutôt comme suit ; créez un fichier qui contient la commande de chargement de votre noyau dans /usr/local/bin par exemple :

cat >/usr/local/bin/kexec.load <<EOF
kexec /boot/vmlinuz-2.6.39-400.17.1.el6uek.x86_64
-l --append="`cat /proc/cmdline | sed 's/rhgb//g' |sed 's/quiet//g'`"
--initrd=/boot/initramfs-2.6.39-400.17.1.el6uek.x86_64.img
EOF

chmod +x /usr/local/bin/kexec.load

Une fois le fichier créé, passez sur la console pour arrêtez proprement l’ensemble des services, démonter les systèmes de fichiers et remonter /boot ; vous devriez avoir un message d’erreur pour indiquer que / est utilisé d’où la nécessité de le redémarrer en mode read-only :

telinit 1
umount -a
mount -o ro /boot
mount

Une fois l’opération terminée, vous pouvez recharger la nouvelle version de votre OS :

kexec -e

Note finale:
Pour toujours jouer sur du velours et aller encore plus vite, vous pouvez également procéder comme suit :

  • Charger l’image de votre OS avant de passer la commande telinit 1
  • Démonter tous les systèmes de fichiers et passer / en read-only
  • Démarrer sur votre image en mémoire