Иногда возникает ситуация, при которой загрузка 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