Частенько перед многими системными администраторами и владельцами выделенных серверов (dedicated servers) Linux возникает задача обновления ядра операционной системы. Проблема заключается лишь в том, что 100%-ой уверенности в нормальном рестарте системы с новым ядром дать не может никто. Хорошо когда консоль сервера под руками и мы можем просто перезагрузить сервер и в меню GRUB выбрать рабочее ядро. Еще очень хорошо, когда например у админа под руками есть такая чудная вещь как KVM over ip. Тогда никаких проблем с доступом к консоли тоже нет. Но что делать если Дата Центр далеко, физического доступа туда нет, сервер бюджетный и из доступных фишек есть только удаленный ребут (что тоже есть не у всех). Вот в этом нам и поможет наш загрузчик GRUB.
На данный момент практически у всех RPM based дистрибутивов Linux в качестве загрузчика операционных систем установлен GRUB. В любом случае разговор будет про него. Описания инсталляции и настройки GRUB достаточно много на русском языке. Вот например
Итак после установки нового ядра файл /etc/grub.conf выглядит примерно следующим образом:
default=1 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu #вот это номер "0" title CentOS (2.6.8-022stab061.1) root (hd0,0) kernel /vmlinuz-2.6.8-022stab061.1 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.8-022stab061.1.img #вот это номер "1" title CentOS_ServerCD (2.6.9-42.ELsmp) root (hd0,0) kernel /vmlinuz-2.6.9-42.ELsmp ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.ELsmp.img #вот это номер "2" title CentOS_ServerCD-up (2.6.9-42.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.EL.img
Мы видим, что перечислено три варианта загрузки. Причем нумерация начинается с цифры 0.
Таким образом default=1 означает загрузку по умолчанию варианта:
title CentOS_ServerCD (2.6.9-42.ELsmp) root (hd0,0) kernel /vmlinuz-2.6.9-42.ELsmp ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.ELsmp.img
Предположим что нам необходимо единожды загрузить сервер с вариантом загрузки 0. Заходим в консоль и набираем:
echo "savedefault --default=0 --once" | grub --batch
после чего перегружаем сервер командой:
reboot
После чего сервер уходит на перезагрузку и мы затая дыхание ждем пока он как космический аппарат вернется из зоны тени. Если новое ядро нормально заработало, то через пару минут мы спокойно заходим в консоль, набираем
uname -a
и видим версию нашего нового ядра. После чего, если нас все устраивает, изменяем файл /etc/grub.conf. Меняем в нем default=1 на default=0, после чего во время следующей перезагрузки загрузится новое ядро. Если же сервер остался недоступен, то его необходимо удаленно перезагрузить. Благо такая функция у нормальных продавцов бесплатна. После ребута сервера загрузится наше старое оригинальное ядро (которое в нашем случае имеет номер 1).
Таким образом можно максимально безболезненно удаленно заменить ядро и протестировать его нормальную загрузку.