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แต่ฉันคิดว่าวันที่ / เวลาก่อนที่จะโหลดด้วงจะไม่เป็นแหล่งที่สอบเทียบแล้ว (เช่น NTP เป็นต้น) ดังนั้นจะทำให้คุณมีนาฬิกาภายในเครื่อง PC
edwin

คำตอบ:


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 การทดสอบหน่วยความจำและที่ล่าสุดWindows 7

หากเราสร้างไฟล์ชื่อไฟล์/boot/grub/custom.cfgนั้นจะถูกโหลดหลังจาก/boot/grub/grub.cfgนั้นเราจึงสามารถเปลี่ยนการตั้งค่าเริ่มต้นของ GRUB ได้อย่างง่ายดาย

ฉันใช้โมดูลของ GRUB datehookเพื่อรับเวลาปัจจุบัน

/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ทำให้ตัวแปรพร้อมใช้งาน: วัน, ชั่วโมง, นาที, เดือน, วินาที, วันธรรมดาและปีซึ่งส่งกลับค่าวันที่ / เวลาที่แท้จริงขึ้นอยู่กับนาฬิกาฮาร์ดแวร์

ลองมาif [ $TIME -ge 600 -a $TIME -lt 1659 ]; thenเป็นตัวอย่าง หมายความว่า: หากเวลาปัจจุบันมากกว่าหรือเท่ากับ 6AM และน้อยกว่า 4:59 PM (16:59) ให้ดำเนินการคำสั่งถัดไป ( set default="Windows 7 (loader) (on /dev/sda2)") ซึ่งตั้งค่าdefaultตัวแปรด้วยชื่อรายการเมนู Windows 7 ที่นำมาจากgrepคำสั่งข้างต้น

ifบล็อกสุดท้ายเป็นตัวอย่างการเลือกของรายการเมนูย่อย ในกรณีนั้น "Ubuntu, กับ Linux 3.16.0-25-generic" อยู่ในเมนูย่อยที่เป็นรายการที่สองในเมนูหลัก ในฐานะที่เป็นตำแหน่งรายการในเมนูเริ่มต้นที่ 0 รายการเมนูชื่อ "อูบุนตู" เป็น0และ "ตัวเลือกขั้นสูงสำหรับอูบุนตู" เมนูย่อยคือ1ว่าทำไมผมต้องเพิ่มก่อนรายการชื่อ:1>set default="1>Ubuntu, with Linux 3.16.0-25-generic"

update-grubไม่มีความจำเป็นที่จะเรียกใช้

นาฬิกาฮาร์ดแวร์อาจจะไม่น่าเชื่อถือพิเศษถ้าแบตเตอรี่ตาย นอกจากนี้ให้เข้าสู่การตั้งค่า BIOS และตรวจสอบเวลา หากเป็น UTC คุณจะต้องเปลี่ยนช่วงเวลาในสคริปต์


อาจเป็นการดีกว่าที่จะทำผ่าน /etc/grub.d/00_header เนื่องจากการอัพเดตเคอร์เนล (หรือผู้ใช้) อาจเรียก update-grub เมื่อเพิ่มรายการใหม่ 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 (สำหรับ "Slitaz" - 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ไดเรกทอรี

แหล่งที่มาของแรงบันดาลใจ: การเขียนสคริปต์ง่าย Boot Time Machine ของรัฐใน GRUB2

แหล่งอื่น ๆ :


0

คุณมี 2 ความเป็นไปได้ ก่อนอื่นคุณสามารถเพิ่มสคริปต์ cron ทุก OS ที่เปลี่ยนการตั้งค่าตามนาฬิกา อย่างไรก็ตามคุณจะไม่ชอบสิ่งที่จะเกิดขึ้นหากสคริปต์นี้เริ่มทำงานในขณะที่ระบบปฏิบัติการปิดตัวลงดังนั้นควรระวัง ความคิดที่ดีกว่าคือการซื้อมาเธอร์บอร์ด UEFI สำหรับพีซีของคุณ คุณสามารถติดตั้ง Shellx86 ซึ่งเป็นคอนโซลสคริปต์ pre-bootloader การสร้างสคริปต์สำหรับสิ่งที่คุณต้องการใน Shellx64 นั้นไม่ใช่เรื่องยากกว่าการเขียนสคริปต์ในการทุบตี ฉันใช้มันเพื่อบูตระบบปฏิบัติการที่แตกต่างกันขึ้นอยู่กับว่าคุณมีการเชื่อมต่ออินเทอร์เน็ตหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.