Initramfs : corriger les petits problèmes de boot kernel grâce à initramfs

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Préblématique

Je viens d'installer un serveur avec plein de SATA dans le ventre, la bête a 4,5To de disques répartis sur 2 controleurs Areca ARC-1280ML. L'installation d'une Debian/etch se passe sans problème, noyau 2.6.18-5-686. Après avoir installé le système sur 2 disques connectés à la carte mère (contrôleur ICH5R sur pilote ata_piix), des volumes RAID5 sont créés sur les cartes Areca (pilote arcmsr). Le démarrage s'arrête sur une invite de commande initramfs, la partition racine est introuvable :

Begin: Waiting for root file system... ...
Done.
        Check root= bootarg cat /proc/cmdline
        or missing modules, devices: cat /proc/modules ls /dev
ALERT! /dev/sda1 does not exist. Dropping to a shell!
 
 
Busybox v1.1.3 (Debian 1:1.1.1-4) Built-in shell (ash)
Enter 'help' for a list of built-in commands.
 
/bin/sh: can't access tty; job control turned off
(initramfs)

2 Explication

Mais qu'est-ce qu'il nous arrive madame Michu ? Tout simplement, les nouveaux volumes sont détectés par le noyau avant le disque sur lequel est installé le système. Résultat, le système n'est plus sur /dev/sda mais sur /dev/sdc. Et le plus drôle c'est qu'il est parfois sur /dev/sdb parce que les controleurs Areca mettent du temps à se déclarer.

Comment laver l'affront que nous impose ce petit impudent ? En jouant avec la partition RAM d'initialisation, j'ai nommé initramfs.

3 Résolution

C'est extrêmement simple, on va demander à la partition de démarrage en RAM de charger les modules sata dans l'ordre qu'on souhaite. Dans notre cas, le pilote ata_piix avant arcmsr. Les outils Debian permettent de faire ça de façon très simple, il suffit d'ajouter les modules qu'on souhaite voir chargés lors du démarrage dans le fichier /etc/initramfs-tools/modules. Les modules doivent être listés, un par ligne dans l'ordre de chargement souhaité. Dans notre cas, il suffit de préciser le module qui prend en charge le disque de démarrage.

# cat /etc/initramfs-tools/modules
[...]
ata_piix

Il faut maintenant mettre à jour l'image en RAM pour propager ces modifications.

# update-initramfs -v -k 2.6.18-5-686 -t -u
Keeping /boot/initrd.img-2.6.18-5-686.dpkg-bak
update-initramfs: Generating /boot/initrd.img-2.6.18-5-686
Adding module /lib/modules/2.6.18-5-686/kernel/drivers/scsi/scsi_mod.ko
Adding module /lib/modules/2.6.18-5-686/kernel/drivers/scsi/scsi_transport_spi.ko
Adding module /lib/modules/2.6.18-5-686/kernel/drivers/scsi/aic7xxx/aic7xxx.ko
[...]
Adding binary /sbin/mdrun
Building cpio /boot/initrd.img-2.6.18-5-686 initramfs
Backup /boot/initrd.img-2.6.18-5-686.bak

Un petit redémarrage et tout est revenu en ordre. Et le plus beau, c'est que lorsque vous devrez mettre à jour votre noyau, le nouveau noyau fera automatiquement la reconstruction de l'image RAM d'initialisation.