Máy chủ Ubuntu không đầu đôi khi bị kẹt trong menu GRUB


54

Tôi đã cài đặt Ubuntu 10.10 Server trên một máy tính bảng trong môi trường bán nhúng; không có bàn phím hoặc màn hình, chỉ cần truy cập SSH vào nó.

Vì vậy, nó thực sự gây phiền toái khi thỉnh thoảng khởi động và bị kẹt trên menu GRUB, chờ nhấn phím để chọn tùy chọn đầu tiên.

Làm cách nào để định cấu hình GRUB trong mọi trường hợp chờ đợi tổ hợp phím?

Cập nhật # 1: Không có menu.lst, vì đây là GRUB 2. Nhưng tôi có / etc / default / grub giống như vậy:

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

Cập nhật # 2: Tôi đã tìm ra nó. Trên những đôi giày đi theo những đôi giày không thành công, GRUB sẽ vô hiệu hóa thời gian chờ của chính nó. Vì việc hiển thị menu làm cho một khởi động không thành công, đây là một vòng lặp không thể vượt qua. Hành vi này có thể bị vô hiệu hóa bằng cách chỉnh sửa tệp /etc/grub.d/00_header và thay đổi chức năng make_timeout:

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

Bây giờ thoát và chạy lại tập lệnh cập nhật cấu hình grub:

sudo update-grub2

Thật vô nghĩa với tôi rằng hành vi này sẽ là mặc định cho Ubuntu Server, một sản phẩm dành cho các máy được truy cập bởi bàn điều khiển.


1
Bạn /boot/grub/menu.lsttrông như thế nào?
Shane Madden

7
Bạn được chào đón để đăng những phát hiện của bạn như là một câu trả lời cho câu hỏi của riêng bạn, thay vì là một chỉnh sửa. Bằng cách đó, chúng tôi có cơ hội nâng cao câu trả lời của bạn nếu chúng tôi thích nó.
Skyhawk

Câu trả lời:


41

Đối với Ubuntu 12.04 LTS, có một tùy chọn cụ thể có thể được đặt trong /etc/default/grub.

Ví dụ: nếu bạn muốn có thời gian chờ 2 giây (do đó tránh bị treo khi khởi động lại không giám sát), chỉ cần thêm dòng sau vào /etc/default/grub:

GRUB_RECORDFAIL_TIMEOUT=2

Nhớ chạy update-grubtheo sau ...


Điều này đã khắc phục sự cố bẩm sinh của tôi, giống như OP nhưng bây giờ tôi nhận thấy rằng trong một dịp hiếm hoi khi tôi kết nối máy chủ của mình với màn hình, tôi không thấy gì cả. Màn hình thậm chí không nhận được kết nối, nhưng SSH vẫn hoạt động tốt. Đây có phải là mong đợi?
Hạ xuống

18

Dưới đây là hướng dẫn cho Ubuntu 10.10, hơi khác so với các phiên bản trước. Trong tệp /etc/grub.d/00_header nhận xét kiểm tra ngu ngốc cho lỗi khởi động trước:

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

Sau đó cập nhật:

sudo update-grub

Xin lưu ý rằng nếu có ổ đĩa thứ hai có Linux, grub2 sẽ tìm thấy nó và hỏi bạn lúc khởi động cái nào bạn muốn. Hủy bỏ tất cả các ổ đĩa bổ sung trước khi chạy "update-grub".

Xem thêm https://bugs.launchpad.net/ubfox/+source/grub2/+orms/797544


6

Tôi đã bắt gặp sự giám sát thiết kế cực kỳ khó chịu này với Ubuntu Server 9.10. Sửa chữa của bạn đã giúp tôi rất nhiều. Tôi chỉ muốn chỉ ra rằng bản sửa lỗi cần thiết cho 9.10 là khác nhau vì không có chức năng "make_timeout ()" trong cùng một tệp.

Đối với Ubuntu 9.10, đi đến cuối cùng của tệp (00_header) và thay đổi như sau:

if [\ $ {recordfail} = 1]; sau đó
  đặt thời gian chờ = -1
khác
  đặt thời gian chờ = $ {GRUB_TIMEOUT}
fi
EOF

đến

if [\ $ {recordfail} = 1]; sau đó
  đặt thời gian chờ = $ {GRUB_TIMEOUT}
khác
  đặt thời gian chờ = $ {GRUB_TIMEOUT}
fi
EOF

Như trước, sau đó chạy:

sudo update-grub2

Giải pháp tuyệt vời, đã được tự hỏi làm thế nào để làm điều này, hoạt động hoàn hảo! Lưu ý: Khi bạn cập nhật grub, bạn chỉ cần chạy: "sudo update grub" bất kể phiên bản grub nào bạn đang chạy.

Điều này vừa lưu lại thịt xông khói của tôi - máy chủ của tôi đã được đặt ở menu grub trên mỗi lần khởi động lại trong một tuần - không biết điều gì sai và đã thử mọi cách. Điều này và mẹo trong câu hỏi đã làm điều đó. Cám ơn rất nhiều.
Darren Greaves

1

Định cấu hình GRUB để truy cập nối tiếp (và bộ tải khởi động của bạn, trong khi bạn đang ở đó) và giữ một cổng nối tiếp mở, cáp null-modem và bộ chuyển đổi USB sang RS232 tiện dụng cho các trường hợp này. Tôi điều hành một máy chủ không đầu và một Guruplug và sẽ không có cách nào khác.


1

Tôi vừa thiết lập thời gian chờ dài cho bản ghi:

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

Có nghĩa là bạn nhận được thời gian chờ 30 giây khi bạn khởi động, nếu lần khởi động trước không thành công. (Không giống như cách mà hệ điều hành khác làm điều đó ...)

Điều này có thể (và IMHO nên) thậm chí là một cài đặt ngay trong / etc / default / grub.


1

Tôi thực sự không biết tại sao đây là hành động mặc định, đặc biệt là đối với máy chủ, nhưng đây là những gì tôi đã thực hiện trong các tập lệnh thiết lập máy chủ của mình.

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

1

Cách tiếp cận này sạch hơn một chút - chỉ cần sửa đổi /etc/default/grubđể thêm dòng:

GRUB_RECORDFAIL_TIMEOUT=2

... mà người ta có thể tự động làm với một cái gì đó như thế này trong việc cung cấp:

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

Điều này sẽ khả thi nếu biến GRUB_RECORDFAIL_TIMEOUT được đề cập trong /etc/grub.d/00_header(như tôi thấy trong 12.04 LTS) trong:

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

Tôi hơi tò mò về việc đào sâu vào cách ghi lại những thất bại có thể mang lại câu trả lời thậm chí tốt hơn.


Tham số GRUB_RECORDFAIL_TIMEOUT đã được thêm vào do câu hỏi này ban đầu được thảo luận. Ngày nay, vâng, đây là phương pháp tốt hơn.
mikepurvis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.