В Ubuntu есть проблема - в случае нештатного отключения компьютера (вырубили свет, потом включили) GRUB2 доходит до меню и ждет выбора. Хотелось, чтобы компьютер рестартовал сам при включении света. Как оказалось за это отвечает переменная recordfail, которая по умолчанию выставляется recordfail=1, а после успешной загрузки системы она обнуляется через init.d скрипт /etc/init.d/grub-common.

При загрузке GRUB2 в файле /boot/grub/grub.cfg идет проверка:

if [ ${recordfail} = 1 ]; then
  set timeout=-1
else
  set timeout=0

Таким образом GRUB2 в случае если система была выключена не штатно принудительно выводит меню загрузки и ждет пока администратор в ручную выберет что грузить. Это делается для предотвращения зацикливания загрузки системы, если там что-то серьезно навернулось.

Прямое редактирование /boot/grub/grub.cfg смысла не имеет, т.к. все изменения затрутся, при запуске команды update-grub, поиск по скриптам GRUB2 показал, что в файле /etc/grub.d/00_header есть описание функции recordfail:

function recordfail {
  set recordfail=1
EOF
    FS="$(grub-probe --target=fs "${grubdir}")"
    case "$FS" in
      btrfs | cpiofs | newc | odc | romfs | squash4 | tarfs | zfs)
 cat <<EOF
  # GRUB lacks write support for $FS, so recordfail support is disabled.
EOF
 ;;
      *)
 cat <<EOF
  if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi
EOF
    esac
    cat <<EOF
}

Затем ниже проверка значения переменной recordfail:

make_timeout ()
{
    cat << EOF
if [ "\${recordfail}" = 1 ] ; then
  set timeout=${GRUB_RECORDFAIL_TIMEOUT:--1}
else
EOF

Решение проблемы напрашивается сам собой - установить переменную GRUB_RECORDFAIL_TIMEOUT (таймаут при срабатывании recordfail) в конфигурационном файле GRUB2 /etc/default/grub:

GRUB_RECORDFAIL_TIMEOUT=15

После чего выполнить обновление конфигурации командой:

update-grub

Ссылки по теме:

  1. правильное выключение + GRUB2 отключить подтверждение при перезагрузке
  2. recordfail в grub2 [РЕШЕНО]

Comments

comments powered by Disqus