Initramfs : corriger les petits problèmes de boot kernel grâce à initramfs
Contents
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.