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