बिना सिर के उबंटू सर्वर मशीन कभी-कभी GRUB मेनू पर अटक जाती है


54

मेरे पास उबंटू 10.10 सर्वर एक अर्ध-एम्बेडेड वातावरण में एकल-बोर्ड मशीन पर स्थापित है; कोई कीबोर्ड या स्क्रीन नहीं है, बस SSH की पहुंच है।

तो यह वास्तव में निराशा होती है जब यह कभी-कभी बूट होता है और GRUB मेनू पर अटक जाता है, पहले विकल्प का चयन करने के लिए कीस्ट्रोक की प्रतीक्षा करता है।

मैं किसी भी परिस्थिति में GRUB को कैसे कॉन्फ़िगर करूं किस्ट्रोके का इंतजार करूं?

# 1 अद्यतन करें: कोई मेनू नहीं है। क्योंकि यह GRUB 2 है। लेकिन मेरे पास एक / etc / डिफ़ॉल्ट / ग्रब है जो इस प्रकार है:

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 ()
{
    echo "set timeout=0"
}

अब ग्रब कॉन्फ़िगरेशन अपडेटर स्क्रिप्ट से बाहर निकलें और फिर से चलाएँ:

sudo update-grub2

मुझे इससे कोई मतलब नहीं है कि यह व्यवहार उबंटू सर्वर के लिए डिफ़ॉल्ट होगा, जो कंसोल द्वारा एक्सेस की गई मशीनों के लिए एक उत्पाद है।


1
आपका /boot/grub/menu.lstलुक कैसा है?
शेन झुंझलाना

7
आप अपने निष्कर्षों को एक प्रश्न के उत्तर के रूप में संपादित करने के बजाय, अपने निष्कर्षों को पोस्ट करने के लिए स्वागत करते हैं। इस तरह, हमें आपके जवाब को पसंद करने का अवसर मिलता है यदि हम इसे पसंद करते हैं।
21:39 पर स्काईवॉक

जवाबों:


41

Ubuntu 12.04 LTS के लिए एक विशिष्ट विकल्प है जिसे अंदर सेट किया जा सकता है /etc/default/grub

उदाहरण के लिए, यदि आप 2 सेकंड का समय समाप्त करना चाहते हैं (इस प्रकार बिना छूट वाले रिबूट के लिए हैंग होने से बचें) बस निम्नलिखित पंक्ति जोड़ें /etc/default/grub:

GRUB_RECORDFAIL_TIMEOUT=2

update-grubउसके बाद दौड़ना याद रखें ...


इसने मेरी जन्मजात समस्या को ठीक कर दिया, जो ओपी के समान ही थी, लेकिन अब मैंने देखा कि जब मैं अपने सर्वर को मॉनिटर से जोड़ता हूं तो मुझे कुछ भी दिखाई नहीं देता है। मॉनिटर को एक कनेक्शन भी नहीं मिलता है, लेकिन SSH अभी भी ठीक काम करता है। क्या यह अपेक्षित है?
डॉवल्स

18

यहां उबंटू 10.10 के निर्देश दिए गए हैं, जो पूर्व संस्करणों से थोड़े अलग हैं। फ़ाइल में /etc/grub.d/00_header टिप्पणी को एक पूर्व बूट विफलता के लिए बेवकूफ जांच करें:

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

फिर अपडेट करें:

sudo update-grub

ध्यान रखें कि यदि लिनक्स के साथ एक दूसरी ड्राइव जुड़ी हुई है, तो grub2 इसे खोज लेगा, और आपसे बूट के बारे में पूछेगा, जिसे आप चाहते हैं। "अपडेट-ग्रब" चलाने से पहले सभी अतिरिक्त ड्राइव निकालें।

Https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/797544 भी देखें


6

मैं उबंटू सर्वर 9.10 के साथ इस गहन अप्रिय डिजाइन निरीक्षण पर आया था। आपके फिक्स ने मुझे बहुत मदद की है। मैं केवल यह बताना चाहता था कि 9.10 के लिए आवश्यक फिक्स अलग है क्योंकि एक ही फाइल में कोई "make_timeout ()" फ़ंक्शन नहीं है।

उबंटू 9.10 के लिए, उसी फ़ाइल (00_header) के अंत में जाएं और निम्नलिखित बदलें:

अगर [\ $ {recordfail} = 1]; फिर
  निर्धारित समय सीमा = -1
अन्य
  समय समाप्त करना = $ {GRUB_TIMEOUT}
फाई
EOF

सेवा

अगर [\ $ {recordfail} = 1]; फिर
  समय समाप्त करना = $ {GRUB_TIMEOUT}
अन्य
  समय समाप्त करना = $ {GRUB_TIMEOUT}
फाई
EOF

पहले की तरह, फिर दौड़ें:

सुडो अपडेट- grub2

शानदार समाधान, यह सोच रहा है कि यह कैसे करना है, पूरी तरह से काम करता है! नोट: जब आप ग्रब अपडेट करते हैं, तो आपको केवल चलाने की आवश्यकता होती है: आप जो भी ग्रब चला रहे हैं, उसकी परवाह किए बिना "सुडो अपडेट ग्रब"।

इसने मेरे बेकन को बचा लिया है - मेरे सर्वर को एक हफ्ते के लिए हर रिबूट पर ग्रब मेनू पर बैठा दिया गया है - पता नहीं क्या गलत था और सब कुछ करने की कोशिश की थी। यह और प्रश्न में टिप ने किया। बहुत बहुत धन्यवाद।
डैरेन ग्रीव्स

1

सीरियल एक्सेस के लिए GRUB कॉन्फ़िगर करें (और आपके बूटलोडर, जबकि आप उस पर हैं) और इन उदाहरणों के लिए एक खुला सीरियल पोर्ट, नल-मॉडेम केबल, और USB-to-RS232 कनवर्टर काम रखें। मैं एक हेडलेस सर्वर और एक गुरुप्लग चलाता हूं और इसका कोई अन्य तरीका नहीं होगा।


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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.