ヘッドレスUbuntuサーバーマシンがGRUBメニューでスタックすることがある


54

Ubuntu 10.10 Serverを半組み込み環境のシングルボードマシンにインストールしています。キーボードや画面はありません。SSHでアクセスするだけです。

ですから、ときどき起動してGRUBメニューにとどまり、キーストロークが最初のオプションを選択するのを待つと、本当にイライラします。

どんな状況でもキーストロークを待たないようにGRUBを設定するにはどうすればよいですか?

更新#1:これはGRUB 2であるため、menu.lstはありません。しかし、/ 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サーバーのデフォルトになるとは意味がありません。


1
どんな/boot/grub/menu.lst感じ?
シェーンマッデン

7
調査結果を編集としてではなく、ご自身の質問への回答として投稿してください。そのように、私たちはそれが好きならあなたの答えを支持する機会があります。
スカイホーク

回答:


41

Ubuntu 12.04 LTSには、で設定できる特定のオプションがあります/etc/default/grub

たとえば、2秒のタイムアウト(無人再起動によるハングを回避する)が必要な場合は、次の行を追加します/etc/default/grub

GRUB_RECORDFAIL_TIMEOUT=2

update-grubその後実行することを忘れないでください...


これにより、OPと同じ初期問題が修正されましたが、まれにサーバーをモニターに接続すると、何も表示されないことがわかりました。モニターは接続すらできませんが、SSHは正常に機能します。これは予想されますか?
ダウラーズ

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が接続された2番目のドライブがある場合、grub2がそれを見つけて、起動時にどのドライブを使用するか尋ねます。「update-grub」を実行する前に、余分なドライブをすべて削除します。

https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/797544も参照してください


6

Ubuntu Server 9.10で、この非常に不快なデザインの見落としに出会いました。あなたの修正が私を大いに助けてくれました。同じファイルに「make_timeout()」関数がないため、9.10に必要な修正が異なることを指摘したかっただけです。

Ubuntu 9.10の場合、同じファイル(00_header)の最後に移動して、次を変更します。

if [\ $ {recordfail} = 1]; それから
  タイムアウトを-1に設定
他に
  タイムアウトを設定= $ {GRUB_TIMEOUT}
fi
EOF

if [\ $ {recordfail} = 1]; それから
  タイムアウトを設定= $ {GRUB_TIMEOUT}
他に
  タイムアウトを設定= $ {GRUB_TIMEOUT}
fi
EOF

前と同じように、次に実行します:

sudo update-grub2

これを行う方法を疑問に思っている素晴らしいソリューションは、完璧に動作します!注:grubを更新するときは、実行しているgrubのバージョンに関係なく、「sudo update grub」のみを実行する必要があります。

これにより、ベーコンが節約されました。1週間の再起動ごとにサーバーがgrubメニューに置かれているため、何が間違っているのかわかりませんでした。これと質問のヒントがそれをやった。本当にありがとう。
ダレングリーブス

1

GRUBをシリアルアクセス用に構成し(ブートローダーを使用している間)、これらのインスタンスに便利なシリアルポート、ヌルモデムケーブル、USB-RS232コンバーターを用意してください。ヘッドレスサーバーとGuruplugを実行していますが、他の方法はありません。


1

recordfailに長いタイムアウトを設定しただけです。

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

つまり、前回の起動に失敗した場合、起動時に30秒のタイムアウトが発生します。(他のOSがそれを行う方法とは異なりません...)

これは、/ 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

変数12 /etc/grub.d/00_header

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

失敗がどのように記録されているかを掘り下げると、さらに良い答えが得られるかどうか、少し興味があります。


GRUB_RECORDFAIL_TIMEOUTパラメーターは、この質問が最初に議論されてから追加されました。今日、はい、これはより良い方法です。
マイクパービス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.