Можно ли запланировать GRUB? Это означает: автоматическое изменение «записи» по умолчанию (автоматический вход в систему) через определенные промежутки времени?

Например:

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 автоматически изменять «запись» по умолчанию?

10
задан 5 January 2015 в 20:56

3 ответа

Сначала запустите 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 в качестве примера. Это означает: если текущее время больше или равно 6:00 и меньше 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, пункт меню с именем «Ubuntu» имеет значение 0, а подменю «Дополнительные параметры для Ubuntu» - 1, поэтому мне пришлось добавить 1> перед именем записи: set default="1>Ubuntu, with Linux 3.16.0-25-generic".

Нет необходимости запускать update-grub.

Аппаратные часы могут быть ненадежными, особенно если батарея разряжена. Также войдите в настройки BIOS и проверьте время. Если это UTC, вам придется изменить временной интервал в сценарии.

0
ответ дан 5 January 2015 в 20:56

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

0
ответ дан 5 January 2015 в 20:56

Для начала выполните следующую команду в терминал :

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 .

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

0
ответ дан 5 January 2015 в 20:56

Другие вопросы по тегам:

Похожие вопросы: