Respuestas:
Primero, ejecute grep -E '(menuentry |submenu )' /boot/grub/grub.cfg
para obtener una lista de sus entradas de menú de grub. Deberías 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' {
Aquí puede ver que mi primera entrada de menú es Ubuntu , seguida de Opciones avanzadas para el submenú Ubuntu (con otras cuatro entradas), 2 pruebas de memoria y, por fin, Windows 7 .
Si creamos un archivo llamado /boot/grub/custom.cfg
, se cargará después /boot/grub/grub.cfg
, para que podamos cambiar fácilmente la configuración predeterminada de GRUB.
Usé el módulo de GRUB datehook
para obtener la hora actual.
/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
El módulo datehook
pone a disposición las variables: DÍA, HORA, MINUTO, MES, SEGUNDO, DÍA DE LA SEMANA y AÑO, que devuelven los valores reales de fecha / hora según el reloj del hardware.
Tomemos if [ $TIME -ge 600 -a $TIME -lt 1659 ]; then
como ejemplo. Significa: si la hora actual es mayor o igual que 6AM y menor que 4:59 PM (16:59), ejecute el siguiente comando ( set default="Windows 7 (loader) (on /dev/sda2)"
), que establece la default
variable con el nombre de entrada de menú de Windows 7 tomado de ese grep
comando anterior.
El último if
bloque ejemplifica la selección de una entrada de submenú. En ese caso, "Ubuntu, con Linux 3.16.0-25-generic" se encuentra dentro de un submenú que es la segunda entrada en el menú principal. Como una posición de entrada en un menú comienza en 0, la entrada del menú llamado "Ubuntu" es 0
y las "Opciones avanzadas para Ubuntu" submenú es 1
, por eso he tenido que añadir 1>
antes de que el nombre de la entrada: set default="1>Ubuntu, with Linux 3.16.0-25-generic"
.
No hay necesidad de correr update-grub
.
El reloj de hardware puede no ser confiable, especialmente si la batería está agotada. Además, ingrese a la configuración del BIOS y verifique la hora. Si es UTC, tendrá que cambiar el rango de tiempo en el script.
Para comenzar, ejecute el siguiente comando en la terminal :
grep -E '^menuentry|^submenu' /boot/grub/grub.cfg | cut -d '"' -f2 | cut -d "'" -f2
Esto devolverá una lista de sus entradas de menú de grub. Supongo que en su caso esta lista es algo como esto:
Slitaz
Advanced options
Memory test (memtest86+)
Memory test (memtest86+, serial console 115200)
Ubuntu
Fedora
openSUSE
Ahora, para cada una de estas entradas, debe asignar un número en orden ascendente comenzando con 0 (para "Slitaz" - 0
, para "Opciones avanzadas" - 1
y así sucesivamente). Utilizará estos números para establecer la entrada predeterminada en el menú de grub.
A continuación, y lo último, debe editar el /boot/grub/grub.cfg
archivo de la siguiente manera:
Desde la terminal abierta en gedit el archivo usando:
sudo -H gedit /boot/grub/grub.cfg
Encuentre la línea donde default
se establece la variable; debería verse algo similar con:
set default="..."
Reemplace la línea anterior con el siguiente 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
Guarde el archivo y ciérrelo.
¡Eso es todo! Reinicie su PC y verifique si está funcionando.
Nota: para revertir esta configuración, simplemente ejecute
sudo update-grub
en la terminal. De hecho, este comando generará y reemplazará automáticamente/boot/grub/grub.cfg
archivos usando plantillas/etc/grub.d
y configuraciones desde/etc/default/grub
. Por lo tanto, será mejor poner el código anterior en una plantilla dentro del/etc/grub.d
directorio.
Fuente de inspiración: crear una secuencia de comandos de una máquina de estado de tiempo de arranque simple en GRUB2 .
Otras fuentes:
Tienes 2 posibilidades. Primero, puede agregar a cada sistema operativo un script cron que cambia la configuración por reloj. Sin embargo, no le gustará lo que sucederá si este script se activa mientras el sistema operativo se está cerrando, así que tenga cuidado. Una mejor idea sería adquirir una placa base UEFI para su PC. Allí puede instalar Shellx86, que es una consola de secuencias de comandos previa al cargador de arranque. Crear secuencias de comandos para lo que desea en Shellx64 no es más difícil que crear secuencias de comandos en bash. Lo usé para arrancar diferentes sistemas operativos dependiendo de si tienes conexión a Internet.
/boot/grub/grub.cfg
, la elección de una entrada grub para una hora determinada debería ser posible simplemente editando los archivos/etc/grub.d
. Pero creo que la fecha / hora antes de las cargas de grub ni siquiera sería una fuente calibrada (como NTP, por ejemplo). Eso te dejaría con el reloj interno de la PC.