บางครั้งเครื่องเซิร์ฟเวอร์ Ubuntu ที่ไม่มีส่วนหัวติดค้างอยู่ที่เมนู GRUB


54

ฉันติดตั้ง Ubuntu 10.10 Server บนเครื่องบอร์ดเดียวในสภาพแวดล้อมแบบกึ่งฝังตัว ไม่มีแป้นพิมพ์หรือหน้าจอเพียงแค่เข้าถึง SSH

ดังนั้นมันน่าผิดหวังจริง ๆเมื่อมันบูทขึ้นมาและติดค้างอยู่บนเมนู GRUB รอการกดแป้นเพื่อเลือกตัวเลือกแรก

ฉันจะกำหนดค่า GRUB ให้อยู่ในสถานการณ์ที่ไม่รอการกดแป้นพิมพ์ได้อย่างไร

อัปเดต # 1: ไม่มี menu.lst เนื่องจากนี่คือด้วง 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"
}

ตอนนี้ออกและเรียกใช้สคริปต์ตัวอัปเดตการกำหนดค่าด้วงอีกครั้ง:

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หลังจากนั้น ...


นี่เป็นการแก้ไขปัญหา inital ของฉันซึ่งเหมือนกับ OPs แต่ตอนนี้ฉันสังเกตเห็นว่าในโอกาสที่หายากเมื่อฉันเชื่อมต่อเซิร์ฟเวอร์ของฉันกับจอภาพฉันไม่เห็นอะไรเลย จอภาพไม่ได้รับการเชื่อมต่อ แต่ SSH ยังใช้งานได้ดี คาดหวังหรือไม่
Dowler

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}
Fi
EOF

ไปยัง

ถ้า [\ $ {recordfail} = 1]; แล้วก็
  กำหนดหมดเวลา = $ {GRUB_TIMEOUT}
อื่น
  กำหนดหมดเวลา = $ {GRUB_TIMEOUT}
Fi
EOF

เหมือนเมื่อก่อนจากนั้นเรียกใช้:

sudo update-grub2

วิธีการแก้ปัญหาที่ยอดเยี่ยมได้รับการสงสัยว่าจะทำเช่นนี้ทำงานได้อย่างสมบูรณ์แบบ! หมายเหตุ: เมื่อคุณอัปเดตด้วงคุณจะต้องรัน: "sudo update grub" ไม่ว่าคุณจะรันด้วงรุ่นใดก็ตาม

นี่เพิ่งบันทึกเบคอนของฉัน - เซิร์ฟเวอร์ของฉันนั่งอยู่ที่เมนูด้วงทุกครั้งที่รีบูทหนึ่งสัปดาห์ - ไม่รู้เลยว่าเกิดอะไรผิดและลองทุกอย่างแล้ว นี่และเคล็ดลับในคำถามที่ทำมัน ขอบคุณมาก.
Darren Greaves

1

กำหนดค่า GRUB สำหรับการเข้าถึงแบบอนุกรม (และ bootloader ของคุณในขณะที่คุณอยู่) และเก็บพอร์ตอนุกรมเปิดสายเคเบิลโมเด็ม null และตัวแปลง 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.