C'est ce que je croyais...

On a dû changer de bus et/ou d'emplacement le disque root d'un serveur ? Qu'à cela ne tienne, on modifie le disque de boot dans le BIOS, on édite les options de grub au démarrage, puis une fois le système booté on va dans /boot/grub/menu.lst pour rendre les changements définitifs. Il y a alors deux lignes par noyau à changer, du type :

root            (hd0,0)
kernel          /boot/vmlinuz-2.6.18-6-486 root=/dev/hda1 ro

À chaque fois, il convient de mettre la bonne partition : ici hd0,0 ou /dev/hda1, selon la convention choisie.

Bien, bien. On reboote la machine, pour valider la chose. Elle boote comme un charme, pas de problème. On va donc la remettre à son emplacement de « production », au hasard au fond d'un placard, sans clavier ni écran bien entendu. Encore un boot, tout se passe bien, on en profite pour appliquer les dernières mises à jour, puis la machine vit sa vie.

Un jour, la machine reboote pour une raison quelconque, et là, perte de contact réseau ! Bien qu'elle soit headless, on se rend vite compte que Debian n'a pas booté. On l'extrait de son placard, on la connecte à un écran et un clavier, et là stupeur, on constate que grub cherche à booter sur l'ancien emplacement de la partition racine... À se taper la tête contre les murs.

Explication

Parmi les mises à jour effectuées, il y avait eu une mise à jour du noyau. Or lors des mises à jour du noyau, les sections par défaut de menu.lst (celles qui sont repérées par les BEGIN/END AUTOMAGIC KERNELS LIST) sont écrasées par un script qui s'appelle update-grub. Les modifications faites à la main sont donc perdues. Il ne faut donc pas faire comme expliqué ci-dessus sous Debian, mais au contraire, modifier directement les paramètres qui sont utilisés par update-grub. Ces paramètres sont donnés directement dans le fichier menu.lst, sous forme de commentaires spéciaux. Il y en a deux qui nous intéressent :

# kopt=root=/dev/hda1 ro 
# groot=(hd0,0)

Ce sont donc ces deux lignes qu'il faut modifier, puis pour appliquer les modifications aux lignes « réelles » du fichier de configuration, il suffit d'appeler update-grub.