Можно ли планировать 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

Может ли grub автоматически изменить «запись» по умолчанию?

    
задан mini 07.07.2013 в 09:32
источник

3 ответа

5

Сначала запустите grep -E '(menuentry |submenu )' /boot/grub/grub.cfg , чтобы получить список записей меню grub. Вы должны увидеть что-то вроде:

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 . Это означает: если текущее время больше или равно 6AM и меньше 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, вам придется изменить временной диапазон в скрипте.

    
ответ дан Eric Carvalho 23.07.2013 в 16:49
источник
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 (для «Slitaz» - 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 .

Другие источники:

ответ дан Radu Rădeanu 23.07.2013 в 18:02
0

У вас есть 2 возможности. Во-первых, вы можете добавить к каждой ОС скрипт cron, который изменяет конфигурацию по часам. Однако вам не понравится, что произойдет, если этот сценарий начнет работать, пока ОС закрывается, поэтому будьте осторожны. Лучше всего было бы приобрести материнскую плату UEFI для вашего ПК. Там вы можете установить Shellx86, который является консолью сценариев предварительной загрузки. Создание скрипта для того, что вы хотите в Shellx64, не сложнее, чем скрипты в bash. Я использовал его для загрузки различных ОС в зависимости от того, есть ли у вас подключение к Интернету.     

ответ дан Barafu Albino 23.07.2013 в 13:06