セミエンベデッド環境のシングルボードマシンに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のデフォルトであることは、私には意味がありません。
Ubuntu 12.04 LTSの場合、/etc/default/grub
で設定できる特定のオプションがあります。
たとえば、タイムアウトを2秒にしたい場合(したがって、無人再起動によるハングを回避する場合)は、/etc/default/grub
に次の行を追加します。
GRUB_RECORDFAIL_TIMEOUT=2
その後、update-grub
を実行することを忘れないでください...
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
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
特にサーバーの場合、これがデフォルトのアクションである理由は本当にわかりませんが、これはサーバーセットアップスクリプトに実装したものです。
Sudo sed -i 's/set timeout=-1/set timeout=30/g' /etc/grub.d/00_header
Sudo update-grub
このアプローチは少しすっきりしています-/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
}
障害がどのように記録されるかを掘り下げることで、さらに良い答えが得られるかどうかについて、少し興味があります。
Recordfailに長いタイムアウトを設定しただけです。
if [ "\${recordfail}" = 1 ]; then
set timeout=30
else
set timeout=${2}
前回の起動が失敗した場合、起動時に30秒のタイムアウトが発生することを意味します。 (他のOSがどのように行うかとは異なります...)
これは、/ etc/default/grubにある設定である可能性もあります(また、IMHOはそうする必要があります)。
GRUB for serial access(and your bootloader、it it it it it))を構成し、開いているシリアルポート、ヌルモデムケーブル、およびUSB-to-RS232コンバーターをこれらのインスタンスのために手元に置いておきます。ヘッドレスサーバーとGuruplugを実行し、それ以外の方法はありません。