Чи можна запланувати 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, вибір запису grub протягом заданої години повинен бути можливим лише шляхом редагування файлів на /etc/grub.d. Але я думаю, що дата / час перед завантаженням grub навіть не буде каліброваним джерелом (наприклад, NTP). Так що це дозволить вам залишити внутрішній годинник ПК.
Едвін

Відповіді:


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' {

Тут ви можете побачити мій перший запис меню - Ubuntu , а потім додаткові параметри для підменю Ubuntu (з чотирма іншими записами), 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надає доступні змінні: DAY, HOUR, MINUTE, MONTH, SECOND, WEEKDAY та YEAR, які повертають фактичні значення дати / часу на основі апаратних годин.

Візьмемо if [ $TIME -ge 600 -a $TIME -lt 1659 ]; thenдля прикладу. Це означає: якщо поточний час більший або дорівнює 6 ранку та менше 16:59 (16:59), тоді виконайте наступну команду ( set default="Windows 7 (loader) (on /dev/sda2)"), яка встановить defaultзмінну з назвою вводу меню Windows 7, взятою з цієї grepкоманди вище.

Останній ifблок ілюструє вибір запису підменю. У цьому випадку "Ubuntu з Linux 3.16.0-25-generic" лежить всередині підменю, яке є другим записом у головному меню. В якості позиції записи в меню починається з 0, пункт меню під назвою «Ubuntu» це 0і «Додаткові параметри для Ubuntu» підміню 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

Це поверне список ваших записів у меню grub. Я припускаю, що у вашому випадку цей список є приблизно таким:

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

Тепер для кожного з цих записів слід призначити число у порядку зростання, починаючи з 0 (для "Слітаз" - 0, для "Додаткові параметри" - 1і так далі). Ви будете використовувати ці цифри для встановлення за замовчуванням в меню grub.

Далі, і останнє, слід відредагувати /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 можливості. По-перше, ви можете додати до кожної ОС сценарій cron, який змінює конфігурацію за годинником. Однак вам не сподобається, що станеться, якщо цей скрипт запуститься, поки ОС закривається, тому будьте обережні. Кращою ідеєю було б придбання материнської плати UEFI для вашого ПК. Там ви можете встановити Shellx86, який є консольною скриптом перед завантажувачем. Створити сценарій для того, що ви хочете в Shellx64, не складніше, ніж сценарії в баш. Я використовував його для завантаження різних ОС, залежно від того, чи є у вас підключення до Інтернету.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.