web-dev-qa-db-ja.com

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

セミエンベデッド環境のシングルボードマシンにUbuntu 10.10サーバーをインストールしています。キーボードや画面はありません。SSHアクセスしてください。

つまり、時々起動してGRUB)メニューでスタックし、最初のオプションを選択するためのキーストロークを待っているとき、それはreallyイライラします。

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 Serverのデフォルトであることは、私には意味がありません。

54
mikepurvis

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

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

GRUB_RECORDFAIL_TIMEOUT=2

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

41

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

18
Bryce

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

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

 if [\ $ {recordfail} = 1];次に
 set timeout = -1 
 else 
 set timeout = $ {GRUB_TIMEOUT} 
 fi 
 EOF 

 if [\ $ {recordfail} = 1];次に
 set timeout = $ {GRUB_TIMEOUT} 
 else 
 set timeout = $ {GRUB_TIMEOUT} 
 fi 
 EOF 

前と同じように、次を実行:

 sudo update-grub2 
6
GNTC

特にサーバーの場合、これがデフォルトのアクションである理由は本当にわかりませんが、これはサーバーセットアップスクリプトに実装したものです。

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

このアプローチは少しすっきりしています-/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
}

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

1
Alex North-Keys

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

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

前回の起動が失敗した場合、起動時に30秒のタイムアウトが発生することを意味します。 (他のOSがどのように行うかとは異なります...)

これは、/ etc/default/grubにある設定である可能性もあります(また、IMHOはそうする必要があります)。

1
Gaute Lund

GRUB for serial access(and your bootloader、it it it it it))を構成し、開いているシリアルポート、ヌルモデムケーブル、およびUSB-to-RS232コンバーターをこれらのインスタンスのために手元に置いておきます。ヘッドレスサーバーとGuruplugを実行し、それ以外の方法はありません。

1
LawrenceC