क्या GRUB को निर्धारित किया जा सकता है? इसका अर्थ है: डिफ़ॉल्ट 'प्रविष्टि' (ऑटो लॉगिन) को समय की स्वचालित रूप से परिभाषित अवधि में बदलना?


10

उदाहरण के लिए:

00:00:00 to 06:00:00 -> Slitaz
06:00:01 to 13:00:00 -> Ubuntu
13:00:01 to 19:00:00 -> Fedora
19:00:01 to 23:59:59 -> openSUSE

क्या डिफ़ॉल्ट 'प्रविष्टि' को स्वचालित रूप से बदल सकता है?


1
सिद्धांत रूप में, यदि आप दिनांक और समय से संबंधित आदेशों का उपयोग कर सकते हैं, तो /boot/grub/grub.cfgदिए गए घंटे के लिए एक ग्रब प्रविष्टि का चयन केवल फाइलों को संपादित करके संभव हो सकता है /etc/grub.d। लेकिन मुझे लगता है कि ग्रब लोड से पहले की तारीख / समय भी एक कैलिब्रेटेड स्रोत नहीं होगा (जैसे एनटीपी, उदाहरण के लिए)। ताकि आप पीसी आंतरिक घड़ी के साथ छोड़ देंगे।
एडविन

जवाबों:


5

सबसे पहले, grep -E '(menuentry |submenu )' /boot/grub/grub.cfgअपने ग्रब मेनू प्रविष्टियों की एक सूची प्राप्त करने के लिए चलाएँ । आपको कुछ इस तरह देखना चाहिए:

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-7820cc72-dac4-447f-bba0-996ed1a12fa5' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-7820cc72-dac4-447f-bba0-996ed1a12fa5' {
    menuentry 'Ubuntu, with Linux 3.16.0-28-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-28-generic-advanced-7820cc72-dac4-447f-bba0-996ed1a12fa5' {
    menuentry 'Ubuntu, with Linux 3.16.0-28-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-28-generic-recovery-7820cc72-dac4-447f-bba0-996ed1a12fa5' {
    menuentry 'Ubuntu, with Linux 3.16.0-25-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-25-generic-advanced-7820cc72-dac4-447f-bba0-996ed1a12fa5' {
    menuentry 'Ubuntu, with Linux 3.16.0-25-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-25-generic-recovery-7820cc72-dac4-447f-bba0-996ed1a12fa5' {
menuentry 'Memory test (memtest86+)' {
menuentry 'Memory test (memtest86+, serial console 115200)' {
menuentry 'Windows 7 (loader) (on /dev/sda2)' --class windows --class os $menuentry_id_option 'osprober-chain-C84087BD4087B12C' {

यहाँ आप देख सकते हैं कि मेरी पहली मेनू प्रविष्टि उबंटू है , इसके बाद उबंटू सबमेनू (चार अन्य प्रविष्टियों के साथ) के लिए एक उन्नत विकल्प , 2 मेमोरी टेस्ट और अंतिम में, विंडोज 7 है

यदि हम नाम से एक फ़ाइल बनाते हैं /boot/grub/custom.cfg, तो इसे बाद में लोड किया जाएगा /boot/grub/grub.cfg, इसलिए हम GRUB के डिफ़ॉल्ट कॉन्फ़िगरेशन को आसानी से बदल सकते हैं।

मैंने datehookवर्तमान समय प्राप्त करने के लिए GRUB के मॉड्यूल का उपयोग किया ।

/boot/grub/custom.cfg:

# This module creates special variables that return the current date/time
insmod datehook

# Add and extra 0 to minutes if it's less than 10 (force a 2-digit minute) 
if [ $MINUTE -lt 10 ]; then PADDING="0"; else PADDING=""; fi
TIME=$HOUR$PADDING$MINUTE

# Boot "Ubuntu" from midnight to 5:59AM
if [ $TIME -ge 0 -a $TIME -lt 559 ]; then
    set default="Ubuntu"
fi

# Boot "Windows 7" from 6AM to 4:59PM
if [ $TIME -ge 600 -a $TIME -lt 1659 ]; then
    set default="Windows 7 (loader) (on /dev/sda2)"
fi

# If you want to boot an entry that's inside a submenu,
# you have to prepend its name with the submenu position, starting from 0.
# Boot "Ubuntu, with kernel 3.16.0-25-generic" from 5PM to 11:59PM
if [ $TIME -ge 1700 -a $TIME -lt 2359 ]; then
    set default="1>Ubuntu, with Linux 3.16.0-25-generic"
fi

मॉड्यूल datehookचर उपलब्ध कराता है: DAY, HOUR, MINUTE, MONTH, SECOND, WEEKDAY और YEAR, जो हार्डवेयर घड़ी के आधार पर वास्तविक दिनांक / समय मान लौटाते हैं।

if [ $TIME -ge 600 -a $TIME -lt 1659 ]; thenएक उदाहरण के रूप में लेते हैं । इसका मतलब यह है: अगर वर्तमान समय से अधिक या 06:00 के बराबर है और की तुलना में 4:59 बजे (16:59) फिर अगले आदेश (निष्पादित कम set default="Windows 7 (loader) (on /dev/sda2)") है, जो सेट defaultविंडोज 7 मेनू प्रविष्टि से लिया नाम के साथ चर grepउपरोक्त आदेश।

अंतिम ifब्लॉक एक सबमेनू प्रविष्टि के चयन की मिसाल देता है। उस मामले में "उबंटू, लिनक्स 3.16.0-25-जेनेरिक" एक सबमेनू के अंदर है जो मुख्य मेनू में दूसरी प्रविष्टि है। जैसा कि एक मेनू में एक प्रविष्टि स्थिति 0 से शुरू होती है, "उबंटू" नाम का मेनू प्रविष्टि है 0और "उबंटू के लिए उन्नत विकल्प" सबमेनू है 1, यही कारण है कि मुझे 1>प्रवेश नाम से पहले जोड़ना पड़ा set default="1>Ubuntu, with Linux 3.16.0-25-generic":।

चलाने की कोई जरूरत नहीं है update-grub

हार्डवेयर घड़ी अविश्वसनीय हो सकती है, बैटरी मर चुका है विशेष रूप से अगर। इसके अलावा, BIOS सेटअप दर्ज करें और समय की जांच करें। यदि यह UTC है, तो आपको स्क्रिप्ट में समय सीमा बदलनी होगी।


इसे /etc/grub.d/00_header के माध्यम से करना बेहतर हो सकता है, क्योंकि कर्नेल अपडेट (या उपयोगकर्ता) नई प्रविष्टियों को जोड़ते समय अपडेट-ग्रब कह सकते हैं। cf: linuxquestions.org/questions/linux-desktop-74/…
KIAaze

2

शुरुआत के लिए, टर्मिनल में निम्नलिखित कमांड चलाएँ :

grep -E '^menuentry|^submenu' /boot/grub/grub.cfg | cut -d '"' -f2 | cut -d "'" -f2

यह आपके ग्रब मेनू प्रविष्टियों की सूची लौटाएगा। मुझे लगता है कि आपके मामले में यह सूची कुछ इस तरह है:

Slitaz
Advanced options
Memory test (memtest86+)
Memory test (memtest86+, serial console 115200)
Ubuntu
Fedora
openSUSE

अब, इन प्रविष्टियों में से प्रत्येक के लिए आपको 0 से शुरू होने वाले आरोही क्रम में एक संख्या निर्दिष्ट करनी चाहिए ("स्लिटज़" के लिए - 0"उन्नत विकल्प" के लिए - 1और इसी तरह)। आप इस नंबर का उपयोग ग्रब मेनू में डिफ़ॉल्ट प्रविष्टि सेट करने के लिए करेंगे।

अगली और आखिरी बात, आपको /boot/grub/grub.cfgफ़ाइल को इस प्रकार संपादित करना चाहिए :

  • टर्मिनल से gedit में खुली हुई फ़ाइल का उपयोग कर:

    sudo -H gedit /boot/grub/grub.cfg
    
  • वह रेखा ज्ञात करें जहां defaultचर सेट किया गया है; यह कुछ इसी तरह दिखना चाहिए:

    set default="..."
    
  • उपरोक्त कोड को अगले कोड से बदलें:

    insmod datehook
    
    if [ "$HOUR" -ge "0" -a "$HOUR" -lt "6" ]; then set default="0"      #Slitaz time
    
    elif [ "$HOUR" -ge "6" -a "$HOUR" -lt "13" ]; then set default="4"   #Ubuntu time
    
    elif [ "$HOUR" -ge "13" -a "$HOUR" -lt "19" ]; then set default="5"  #Fedora time     
    
    else set default="6"                                                 #openSUSE time
    
    fi
    
  • फ़ाइल को सहेजें और इसे बंद करें।

बस इतना ही! अपने पीसी को पुनरारंभ करें और जांचें कि क्या यह काम कर रहा है।

नोट: इन सेटिंग्स को वापस लाने के लिए, बस sudo update-grubटर्मिनल में दौड़ें । वास्तव में, यह कमांड स्वचालित रूप /boot/grub/grub.cfgसे से /etc/grub.dऔर सेटिंग्स से टेम्पलेट्स का उपयोग करके फ़ाइल को उत्पन्न और प्रतिस्थापित करेगी /etc/default/grub। इसलिए उपरोक्त कोड को /etc/grub.dनिर्देशिका के अंदर एक टेम्पलेट में रखना बेहतर होगा ।

प्रेरणा का स्रोत: GRUB2 में एक साधारण बूट टाइम स्टेट मशीन की स्क्रिप्टिंग

अन्य स्रोत:


0

आपके पास 2 संभावनाएं हैं। सबसे पहले, आप हर OS में एक क्रॉन स्क्रिप्ट जोड़ सकते हैं जो घड़ी से कॉन्फिग बदलता है। हालाँकि, आपको पसंद नहीं होगा कि अगर ओएस बंद हो रहा है तो यह स्क्रिप्ट क्या होगी, तो सावधान रहें। एक बेहतर विचार अपने पीसी के लिए एक यूईएफआई मदरबोर्ड का अधिग्रहण करना होगा। वहां आप Shellx86 इंस्टॉल कर सकते हैं जो एक प्री-बूटलोडर स्क्रिप्टिंग कंसोल है। Shellx64 में जो आप चाहते हैं, उसके लिए स्क्रिप्ट बनाना बश में स्क्रिप्टिंग से ज्यादा कठिन नहीं है। यदि आप इंटरनेट कनेक्शन रखते हैं तो मैंने इसका उपयोग अलग-अलग ओएस को बूट करने के लिए किया।

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