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.
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 :
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.
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.
/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.Respostas:
Primeiro, execute
grep -E '(menuentry |submenu )' /boot/grub/grub.cfg
para obter uma lista das entradas do menu grub. Você deve ver algo como: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
datehook
para obter a hora atual./boot/grub/custom.cfg
:O módulo
datehook
disponibiliza 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 ]; then
como 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 adefault
variável com o nome da entrada de menu do Windows 7, extraído dessegrep
comando acima.O último
if
bloco 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" é0
e as "Opções avançadas para Ubuntu" submenu é1
, é por isso que eu tive que adicionar1>
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.
fonte
Para o início, execute o seguinte comando no terminal :
Isso retornará uma lista de suas entradas do menu grub. Presumo que, no seu caso, esta lista seja algo assim:
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 grub.Em seguida, e a última coisa, você deve editar o
/boot/grub/grub.cfg
arquivo da seguinte maneira:No terminal, abra no gedit o arquivo usando:
Encontre a linha onde a
default
variável está definida; deve parecer algo semelhante com:Substitua a linha acima pelo próximo código:
Salve o arquivo e feche-o.
Isso é tudo! Reinicie o seu PC e verifique se está funcionando.
Fonte de inspiração: Criando scripts em uma máquina de estado de tempo de inicialização simples no GRUB2 .
Outras fontes:
fonte
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.
fonte