Удаленное тестирование ядра


Вполне обычное дело, когда администрирование системы FreeBSD производится удаленно, например, когда сервер находится в другом, закрытом помещении. У вас может не быть последовательной консоли, вследствие чего становится невозможным получить доступ к командной строке загрузчика. Самое большее, на что можно надеяться в таких ситуациях, это то, что у вас будет некто, кто сможет подойти к компьютеру и нажать кнопку питания. Как в таких обстоятельствах можно протестировать новое ядро? Здесь хорошо бы иметь возможность попробовать загрузить новое ядро и если что-то пойдет не так — выполнить перезагрузку с рабочим ядром. И такая возможность есть, она называется однократная тестовая загрузка. Здесь вам пригодится nextboot(8).

nextboot(8) — это способ сказать: «Загрузи это ядро в следующий раз, но только один раз». Команда nextboot принимает единственный аргумент -k, параметром которого является имя каталога с тестовым ядром, вложенного в каталог /boot. Например, я собрал и установил новое ядро, мне нужно однократно загрузить новое ядро, а если оно окажется неработоспособным, то на следующей перезагрузке должно быть загружено предыдущее ядро. Прежде всего, необходимо скопировать новое ядро в каталог, отличный от /boot/kernel, а в /boot/kernel должно находиться рабочее ядро.

# mv /boot/kernel /boot/kernel.test
# mkdir /boot/kernel
# cp /boot/kernel.good/* /boot/kernel/

Можно заранее предусмотреть установку ядра в данный каталог, установив значение переменной INSTKERNAME при сборке ядра. Дайте ядру имя во время установки ядра, и утилита make(1) автоматически поместит собранное ядро в нужное место:

# cd /usr/src
# make KERNCONF=TESTKERNEL INSTKERNAME=test kernel

Эта команда установит ядро как /boot/kernel.test.

Теперь, когда имеется рабочее ядро, установленное как ядро по умолчанию, и тестовое ядро как /boot/kernel.test, можно вызвать команду nextboot(8) и передать ей тестовое ядро в виде параметра ключа -k, указав имя каталога, вложенного в каталог /boot:

# nextboot -k kernel.test

На следующей перезагрузке системы загрузчик запустит ядро из /boot/kernel.test вместо /boot/kernel и заодно сотрет файл с настройками, где говорится о необходимости загрузить тестовое ядро. После этого при следующей перезагрузке будет загружено стандартное ядро. Вся хитрость состоит в том, чтобы рабочее ядро находилось в каталоге /boot/kernel. Если новое ядро хорошо себя зарекомендовало, можно выполнить следующие команды:

# mv /boot/kernel /boot/kernel.previous
# mv /boot/kernel.test /boot/kernel

Вуаля! И тестовое ядро превратилось в рабочее.

Осторожно — nextboot!

В руководстве говорится, что nextboot(8) выполняет запись в корневую файловую систему до того, как она пройдет проверку целостности на этапе загрузки. Это означает, что в случае некорректного завершения системы до момента загрузки нового ядра возможно, что nextboot повредит файловую систему. В действительности утилита nextboot(8) не выделяет новое дисковое пространство, она просто редактирует файл, который уже существует в системе, поэтому риск повреждения файловой системы сводится к минимуму.

Комментарии запрещены.