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.