Внесение исправлений в initrd

Иногда возникает ситуация, при которой загрузка Linux невозможна из за неправильно собранного образа диска initrd. Возникает ситуация курицы и яйца: чтобы исправить initrd необходимо загрузить Linux, чтобы загрузить Linux нужен исправленный initrd.

В CentOS и аналогичных системах последовательность действий такова:

Загрузиться с установочного диска в режим восстановления - Rescue mode. Для этого в момент загрузки на приглашение boot: необходимо ввести linux rescue

Если всё пойдёт нормально, то корневой каталог основной системы будет смонтирован в /mnt/sysimage, загрузочный каталог в /mnt/sysimage/boot. Кроме того текущие каталоги /proc, /sys и /dev будут смонтированы в соответствующие подкаталоги /mnt/sysimage. Если это не случится, то придётся проделать эти операции вручную.

Когда все каталоги смонтированы, можно сменить корневой каталог

#если выяснится, что вы что-то забыли смонтировать, то можно выйти по ^D
chroot /mnt/sysimage

и пересобрать initrd

В CentOS 6

#копируем старый файл
cp -p /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
#создаём новый
dracut -f 
#если версия ядра в основной системе отличается от версии на установочном диске, указываем её явно
dracut -f /boot/initramfs-2.6.32-358.el6.x86_64.img 2.6.32-358.el6.x86_64

В CentOS 5

#копируем старый файл
cp -p /boot/initrd-$(uname -r).img /boot/initrd-$(uname -r).img.bak
#создаём новый
mkinitrd -f -v /boot/initrd-$(uname -r).img $(uname -r)
#если версия ядра в основной системе отличается от версии на установочном диске, указываем её явно
mkinitrd -f -v /boot/initrd-2.6.18-371.el5.img 2.6.18-371.el5

Перезагрузка

cd /
sync
telinit 6

Полный пример с драйвером i2o_block (SCSI адаптер Adaptec 2010S), который не загружается автоматически. Пример выполняется в CentOS 5, поскольку в стандартном ядре CentOS 6 поддержка этого драйвера отключена.

После загрузки с CD в Rescue mode выдаётся сообщение, что Linux разделы не найдены и их надо монтировать самостоятельно.

#Загружаем драйвер
insmod i2o_block

#Проверяем, что всё сработало
lsmod
....
dmesg
...

#Создаём файлы устройств на основе информации в dmesg
mkdir /dev/i2o
mknod /dev/i2o/hda b 80 0
mknod /dev/i2o/hda1 b 80 1
mknod /dev/i2o/hda2 b 80 2

#Активируем VolumeGroup
lvm vgchange -a y

#Монтируем тома
mkdir /mnt/sysimage
mount /dev/mapper/VolGroup00-LogVol00 /mnt/sysimage
mount /dev/i2o/hda1 /mnt/sysimage/boot

#Монтируем спецкаталоги
mount --bind /proc /mnt/sysimage/proc
mount --bind /dev /mnt/sysimage/dev
mount --bind /sys /mnt/sysimage/sys

Далее по инструкции, только при создании образа диска надо указать программе mkinitrd дополнительную опцию --preload=i2o_block и отключить сервисы readahead, поскольку они приводят к зависанию драйвера i2o_block:

chkconfig early-readahead off
chkconfig later-readahead off