Безголовий серверний сервер Ubuntu іноді затримувався в меню GRUB


54

У мене сервер Ubuntu 10.10 встановлений на одноплановій машині у напіввбудованому середовищі; немає клавіатури чи екрану, просто доступ до SSH.

Тож справді неприємно, коли час від часу завантажується і застрягає в меню GRUB, чекаючи натискання клавіші, щоб вибрати перший варіант.

Як налаштувати GRUB так, щоб ні в якому разі не чекати натискання клавіші?

Оновлення №1: немає menu.lst, оскільки це GRUB 2. Але у мене є / etc / default / grub, що так:

GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=2
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

Оновлення №2: я зрозумів це. У черевиках, які слідують за невдалими черевиками, GRUB вимикає власний тайм-аут. Оскільки показ меню робить завантаження невдалим, це неминучий цикл. Таку поведінку можна відключити, відредагувавши файл /etc/grub.d/00_header та змінивши функцію make_timeout:

make_timeout ()
{
    echo "set timeout=0"
}

Тепер вийдіть та запустіть сценарій оновлення конфігурації grub:

sudo update-grub2

Для мене немає сенсу, що така поведінка була б за замовчуванням для Ubuntu Server, продукту, призначеного для машин, до яких доступ до консолі.


1
Як виглядає твій /boot/grub/menu.lst?
Шейн Мадден

7
Ви можете розмістити свої висновки як відповідь на власне питання, а не як редагування. Таким чином, ми маємо можливість підкріпити вашу відповідь, якщо нам це подобається.
Skyhawk

Відповіді:


41

Для Ubuntu 12.04 LTS існує певна опція, яку можна встановити /etc/default/grub.

Наприклад, якщо ви хочете отримати 2-секундний тайм-аут (таким чином уникаючи зависань для беззастережного перезавантаження), просто додайте наступний рядок у /etc/default/grub:

GRUB_RECORDFAIL_TIMEOUT=2

Не забудьте бігти update-grubпісля цього ...


Це вирішило мою первісну проблему, яка була такою ж, як і ОП, але тепер я помітив, що в рідкісних випадках, коли я підключаю свій сервер до монітора, я нічого не бачу. Монітор навіть не отримує з'єднання, але SSH все ще працює чудово. Це очікується?
Dowlers

18

Ось інструкції для Ubuntu 10.10, які трохи відрізняються від попередніх версій. У файлі /etc/grub.d/00_header прокоментуйте тупу перевірку на попередню помилку завантаження:

##if [ \${recordfail} = 1 ]; then
##  set timeout=-1
##else
  set timeout=${2}
##fi

Потім оновіть:

sudo update-grub

Майте на увазі, що якщо є другий накопичувач із підключеним Linux, grub2 знайде його, і запитайте вас при завантаженні, який саме ви хочете. Видаліть усі додаткові диски перед запуском "update-grub".

Дивіться також https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/797544


6

Я натрапив на цей глибоко неприємний нагляд за дизайном з Ubuntu Server 9.10. Ваше виправлення дуже допомогло мені. Я просто хотів зазначити, що виправлення, необхідне для 9.10, відрізняється, оскільки в одному файлі немає функції "make_timeout ()".

Для Ubuntu 9.10 перейдіть до кінця того ж файлу (00_header) та змініть наступне:

якщо [\ $ {recordfail} = 1]; тоді
  встановити тайм-аут = -1
ще
  встановити тайм-аут = $ {GRUB_TIMEOUT}
фі
EOF

до

якщо [\ $ {recordfail} = 1]; тоді
  встановити тайм-аут = $ {GRUB_TIMEOUT}
ще
  встановити тайм-аут = $ {GRUB_TIMEOUT}
фі
EOF

Як і раніше, тоді запустіть:

sudo update-grub2

Блискуче рішення, цікавились, як це зробити, працює чудово! Примітка. Коли ви оновлюєте grub, вам потрібно запустити лише "sudo update grub" незалежно від версії grub, яку ви використовуєте.

Це тільки що врятувало моє бекон - мій сервер протягом тижня сидів у меню груб на кожному перезавантаженні - не знав, що не так, і спробував усе. Це і підказка у питанні це зробила. Дуже дякую.
Даррен Грівз

1

Налаштуйте GRUB для послідовного доступу (і завантажувача, поки ви перебуваєте на ньому), і підтримуйте відкритий послідовний порт, нульовий модемний кабель та перетворювач USB-RS232 для цих примірників. Я запускаю безголовий сервер і Guruplug, і не було б іншого способу.


1

Я просто встановив тривалий час для рекорду:

if [ "\${recordfail}" = 1 ]; then
  set timeout=30
else
  set timeout=${2}

Це означає, що ви отримуєте час очікування 30 секунд під час завантаження, якщо попереднє завантаження не вдалося. (Не на відміну від того, як це робить інша ОС ...)

Це може (і IMHO повинно) навіть бути налаштуванням прямо в / etc / default / grub.


1

Я дійсно не знаю, чому це дія за замовчуванням, особливо для сервера, але це те, що я реалізований у своїх сценаріях настройки сервера.

sudo sed -i 's/set timeout=-1/set timeout=30/g' /etc/grub.d/00_header
sudo update-grub

1

Цей підхід трохи чистіший - просто модифікуйте, /etc/default/grubщоб додати рядок:

GRUB_RECORDFAIL_TIMEOUT=2

... що може зробити автоматично з чимось подібним у забезпеченні:

if grep '^GRUB_RECORDFAIL_TIMEOUT=' /etc/default/grub ; then
   echo GOOD: /etc/default/grub
else
   echo FIXING: /etc/default/grub
   perl -pi.bak -e \
      's/^(GRUB_TIMEOUT=.*\n)/${1}GRUB_RECORDFAIL_TIMEOUT=2\n/' \
      /etc/default/grub
   update-grub
fi

Це має бути життєздатним, якщо змінна GRUB_RECORDFAIL_TIMEOUT згадується в /etc/grub.d/00_header(як я бачу в 12.04 LTS) у:

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

Мені трохи цікаво, чи можна розібратися в тому, як фіксуються збої, ще краще відповісти.


Параметр GRUB_RECORDFAIL_TIMEOUT доданий з моменту обговорення цього питання. Сьогодні, так, це кращий метод.
mikepurvis
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.