Mesin server Ubuntu tanpa kepala terkadang macet di menu GRUB

54

Saya memiliki Ubuntu 10.10 Server diinstal pada mesin papan tunggal di lingkungan semi-embedded; tidak ada keyboard atau layar, hanya akses SSH ke sana.

Jadi benar - benar membuat frustrasi ketika kadang-kadang boot dan macet di menu GRUB, menunggu keystroke untuk memilih opsi pertama.

Bagaimana cara saya mengonfigurasi GRUB dalam keadaan apa pun tanpa menunggu penekanan tombol?

Pembaruan # 1: Tidak ada menu.lst, karena ini GRUB 2. Tapi saya punya / etc / default / grub yang seperti ini:

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=""

Pembaruan # 2: Saya menemukan jawabannya. Pada boot yang mengikuti boot yang gagal, GRUB menonaktifkan timeout-nya sendiri. Karena memperlihatkan menu membuat boot tidak berhasil, ini adalah loop yang tak terhindarkan. Perilaku ini dapat dinonaktifkan dengan mengedit file /etc/grub.d/00_header, dan mengubah fungsi make_timeout:

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

Sekarang keluar dan jalankan kembali skrip updater konfigurasi grub:

sudo update-grub2

Tidak masuk akal bagi saya bahwa perilaku ini akan menjadi default untuk Ubuntu Server, produk yang ditujukan untuk mesin yang diakses oleh konsol.

mikepurvis
sumber
1
Seperti apa /boot/grub/menu.lstpenampilanmu?
Shane Madden
7
Anda dipersilakan memposting temuan Anda sebagai jawaban untuk pertanyaan Anda sendiri, bukan sebagai suntingan. Dengan begitu, kami memiliki kesempatan untuk meningkatkan jawaban Anda jika kami menyukainya.
Skyhawk

Jawaban:

41

Untuk Ubuntu 12,04 LTS ada opsi khusus yang dapat diatur /etc/default/grub.

Misalnya, jika Anda ingin memiliki batas waktu 2 detik (sehingga menghindari macet untuk reboot tanpa pengawasan) tambahkan saja baris berikut di /etc/default/grub:

GRUB_RECORDFAIL_TIMEOUT=2

Ingatlah untuk berlari update-grubsetelah itu ...

Andrea Barcellona
sumber
Ini memperbaiki masalah inital saya, yang sama dengan OP tetapi sekarang saya perhatikan bahwa kadang-kadang ketika saya menghubungkan server saya ke monitor saya tidak melihat apa-apa. Monitor bahkan tidak mendapatkan koneksi, tetapi SSH masih berfungsi dengan baik. Apakah ini yang diharapkan?
Dowlers
18

Berikut adalah instruksi untuk Ubuntu 10.10, yang sedikit berbeda dari versi sebelumnya. Dalam file /etc/grub.d/00_header beri komentar cek bodoh untuk kegagalan boot sebelumnya:

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

Kemudian perbarui:

sudo update-grub

Ketahuilah bahwa jika ada drive kedua dengan Linux terpasang, grub2 akan menemukannya, dan menanyakan Anda saat boot mana yang Anda inginkan. Hapus semua drive ekstra sebelum menjalankan "update-grub".

Lihat juga https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/797544

Bryce
sumber
6

Saya menemukan pengawasan desain yang sangat tidak menyenangkan ini dengan Ubuntu Server 9.10. Perbaikan Anda telah sangat membantu saya. Saya hanya ingin menunjukkan bahwa perbaikan yang diperlukan untuk 9.10 berbeda karena tidak ada fungsi "make_timeout ()" dalam file yang sama.

Untuk Ubuntu 9.10, pergi ke akhir file yang sama (00_header) dan ubah yang berikut:

jika [\ $ {recordfail} = 1]; kemudian
  atur batas waktu = -1
lain
  set timeout = $ {GRUB_TIMEOUT}
fi
EOF

untuk

jika [\ $ {recordfail} = 1]; kemudian
  set timeout = $ {GRUB_TIMEOUT}
lain
  set timeout = $ {GRUB_TIMEOUT}
fi
EOF

Seperti sebelumnya, kemudian jalankan:

sudo perbarui-grub2
GNTC
sumber
Solusi brilian, telah bertanya-tanya bagaimana melakukan ini, bekerja dengan sempurna! Catatan: Ketika Anda memperbarui grub, Anda hanya perlu menjalankan: "sudo perbarui grub" terlepas dari versi grub apa pun yang Anda jalankan.
Ini baru saja menyelamatkan daging saya - server saya sudah duduk di menu grub pada setiap reboot selama seminggu - tidak tahu apa yang salah dan telah mencoba segalanya. Ini dan tip dalam pertanyaan berhasil. Terima kasih banyak.
Darren Greaves
1

Konfigurasikan GRUB untuk akses serial (dan bootloader Anda, saat Anda berada di sana) dan simpan port serial terbuka, kabel null-modem, dan konverter USB-ke-RS232 berguna untuk instance ini. Saya menjalankan server tanpa kepala dan Guruplug dan tidak akan melakukannya dengan cara lain.

LawrenceC
sumber
1

Saya baru saja menetapkan batas waktu lama untuk kegagalan rekaman:

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

Berarti Anda mendapatkan batas waktu 30 detik saat boot, jika boot sebelumnya gagal. (Tidak seperti bagaimana OS lain melakukannya ...)

Ini bisa (dan IMHO seharusnya) bahkan menjadi pengaturan di / etc / default / grub.

Gaute Lund
sumber
1

Saya benar-benar tidak tahu mengapa ini adalah tindakan default, terutama untuk server, tetapi ini adalah apa yang telah saya terapkan dalam skrip pengaturan server saya.

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

Pendekatan ini sedikit lebih bersih - cukup modifikasi /etc/default/grubuntuk menambahkan baris:

GRUB_RECORDFAIL_TIMEOUT=2

... yang mana dapat dilakukan secara otomatis dengan sesuatu seperti ini dalam penyediaan:

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

Ini harus layak jika variabel GRUB_RECORDFAIL_TIMEOUT disebutkan dalam /etc/grub.d/00_header(seperti yang saya lihat di 12,04 LTS) di:

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

Saya agak penasaran tentang apakah menggali bagaimana kegagalan dicatat dapat menghasilkan jawaban yang lebih baik.

Alex North-Keys
sumber
Parameter GRUB_RECORDFAIL_TIMEOUT telah ditambahkan sejak pertanyaan ini awalnya dibahas. Saat ini, ya, ini adalah metode yang lebih baik.
mikepurvis