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

мини
источник
1
Теоретически, если вы можете использовать команды, связанные с датой и временем /boot/grub/grub.cfg, выбор записи grub для данного часа должен быть возможен только путем редактирования файлов /etc/grub.d. Но я думаю, что дата / время до загрузок не будет даже откалиброванным источником (например, NTP). Так что это оставит вас с внутренними часами ПК.
Эдвин

Ответы:

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в качестве примера. Это означает: если текущее время больше или равно 6:00 и меньше 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 (для «Slitaz» - 0, для «Advanced options» - 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, не сложнее, чем создание сценариев в bash. Я использовал его для загрузки разных ОС в зависимости от того, есть ли у вас подключение к Интернету.

Барафу Альбинос
источник