O GRUB pode ser agendado? Isso significa: alterar a "entrada" padrão (login automático) em períodos 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?

mini
fonte
1
Em teoria, se você pode usar comandos relacionados a data e hora /boot/grub/grub.cfg, a escolha de uma entrada do grub por uma determinada hora deve ser possível apenas editando os arquivos /etc/grub.d. Mas acho que a data / hora antes do carregamento do grub nem seria uma fonte calibrada (como o NTP, por exemplo). Isso deixaria você com o relógio interno do PC.
Edwin

Respostas:

5

Primeiro, execute grep -E '(menuentry |submenu )' /boot/grub/grub.cfgpara obter uma lista das entradas do menu grub. Você deve 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 é o Ubuntu , seguida de opções avançadas para o submenu Ubuntu (com quatro outras entradas), 2 testes de memória e, finalmente, o Windows 7 .

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

Eu usei o módulo do GRUB datehookpara obter 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 datehookdisponibiliza as variáveis: DIA, HORA, MINUTO, MÊS, SEGUNDO, SEMANA E ANO, que retornam os valores reais de data / hora com base no relógio do hardware.

Vamos dar if [ $TIME -ge 600 -a $TIME -lt 1659 ]; thencomo exemplo. Significa: se o horário atual for maior ou igual a 6h e menor que 16h59 (16:59), execute o próximo comando ( set default="Windows 7 (loader) (on /dev/sda2)"), que define a defaultvariável com o nome da entrada de menu do Windows 7, extraído desse grepcomando acima.

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

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

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

Eric Carvalho
fonte
Talvez seja melhor fazê-lo via /etc/grub.d/00_header, porque as atualizações do kernel (ou o usuário) podem chamar update-grub ao adicionar novas entradas. cf: linuxquestions.org/questions/linux-desktop-74/…
KIAaze
2

Para o início, execute o seguinte comando no terminal :

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

Isso retornará uma lista de suas entradas do menu grub. Presumo que, no seu caso, esta lista seja 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" - 1e assim por diante). Você usará esses números para definir a entrada padrão no menu grub.

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

  • No terminal, abra no gedit o arquivo usando:

    sudo -H gedit /boot/grub/grub.cfg
    
  • Encontre a linha onde a defaultvariável está definida; deve parecer algo semelhante 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.

Nota: para reverter essas configurações, basta executar sudo update-grubno terminal. De fato, este comando irá gerar e substituir automaticamente o /boot/grub/grub.cfgarquivo usando modelos /etc/grub.de configurações de /etc/default/grub. Portanto, será melhor colocar o código acima em um modelo dentro do /etc/grub.ddiretório.

Fonte de inspiração: Criando scripts em uma máquina de estado de tempo de inicialização simples no GRUB2 .

Outras fontes:

Radu Rădeanu
fonte
0

Você tem 2 possibilidades. Primeiro, você pode adicionar a todo sistema operacional um script cron que altera 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 desligado, portanto, tenha 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é-carregador de inicialização. Criar script para o que você deseja no Shellx64 não é mais difícil do que scripts no bash. Usei-o para inicializar diferentes sistemas operacionais, dependendo de você ter conexão com a Internet.

Barafu Albino
fonte