O GRUB pode ser agendado? Isso significa: alterar a 'entrada' padrão (login automático) em períodos de tempo definidos automaticamente?

10

Por exemplo:

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

O grub pode alterar a 'entrada' padrão automaticamente?

    
por mini 07.07.2013 / 09:32

3 respostas

5

Primeiro, execute grep -E '(menuentry |submenu )' /boot/grub/grub.cfg para obter uma lista das entradas do menu do grub. Você deveria ver algo como:

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

Aqui você pode ver minha primeira entrada no menu Ubuntu , seguida por um submenu Opções avançadas para Ubuntu (com quatro outras entradas), 2 testes de memória e, finalmente , Windows 7 .

Se criarmos um arquivo chamado /boot/grub/custom.cfg , ele será carregado após /boot/grub/grub.cfg , para que possamos alterar facilmente a configuração padrão do GRUB.

Eu usei o módulo datehook do GRUB para saber a hora atual.

/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

O módulo datehook disponibiliza as variáveis: DAY, HOUR, MINUTE, MONTH, SECOND, WEEKDAY e YEAR, que retornam os valores reais de data / hora com base no clock do hardware.

Vamos usar if [ $TIME -ge 600 -a $TIME -lt 1659 ]; then como exemplo. Isso significa: se a hora atual for maior ou igual a 6AM e menor que 4:59 PM (16:59), execute o próximo comando ( set default="Windows 7 (loader) (on /dev/sda2)" ), que define a variável default com o nome de entrada do menu do Windows 7 retirado do comando grep acima.

O último bloco if exemplifica a seleção de uma entrada de submenu. Nesse caso, "Ubuntu, com o Linux 3.16.0-25 genérico" está dentro de um submenu que é a segunda entrada no menu principal. Como uma posição de entrada em um menu começa em 0, a entrada de menu chamada "Ubuntu" é 0 e o submenu "Opções avançadas para Ubuntu" é 1 , é por isso que eu tive que adicionar 1> antes do nome da entrada: set default="1>Ubuntu, with Linux 3.16.0-25-generic" .

Não há necessidade de executar update-grub .

O relógio de hardware pode não ser confiável, especialmente se a bateria estiver sem carga . Além disso, entre na configuração da BIOS e verifique a hora. Se for o UTC, você terá que alterar o intervalo de tempo no script.

    
por Eric Carvalho 23.07.2013 / 16:49
2

Para o começo, execute o seguinte comando no terminal :

grep -E '^menuentry|^submenu' /boot/grub/grub.cfg | cut -d '"' -f2 | cut -d "'" -f2

Isso retornará uma lista das entradas do menu do grub. Eu assumo que no seu caso essa lista é algo assim:

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

Agora, para cada uma dessas entradas, você deve atribuir um número em ordem crescente começando com 0 (para "Slitaz" - 0 , para "Opções avançadas" - 1 e assim por diante). Você usará esses números para definir a entrada padrão no menu do grub.

Em seguida, e a última coisa, você deve editar o arquivo /boot/grub/grub.cfg da seguinte forma:

  • Do terminal aberto no gedit o arquivo usa:

    sudo -H gedit /boot/grub/grub.cfg
    
  • Encontre a linha onde a variável default está definida; deve parecer algo similar com:

    set default="..."
    
  • Substitua a linha acima pelo próximo código:

    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
    
  • Salve o arquivo e feche-o.

Isso é tudo! Reinicie o seu PC e verifique se está funcionando.

% bl0ck_qu0te%

Fonte de inspiração: Criando um script de uma máquina de estados de tempo de inicialização simples no GRUB2 .

Outras fontes:

por Radu Rădeanu 23.07.2013 / 18:02
0

Você tem 2 possibilidades. Primeiro, você pode adicionar a cada sistema operacional um script cron que altere a configuração por relógio. No entanto, você não vai gostar do que acontecerá se esse script entrar em ação enquanto o sistema operacional estiver sendo encerrado, portanto, cuidado. Uma idéia melhor seria adquirir uma placa-mãe UEFI para o seu PC. Lá você pode instalar o Shellx86, que é um console de script pré-bootloader. Criar script para o que você deseja no Shellx64 não é mais difícil do que o script no bash. Eu usei para inicializar o sistema operacional diferente, dependendo se você tem conexão com a Internet.

    
por Barafu Albino 23.07.2013 / 13:06

Tags