¿Se puede programar GRUB? Esto significa: ¿cambiar automáticamente la 'entrada' predeterminada (inicio de sesión automático) en períodos de tiempo definidos?

10

Por ejemplo:

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

¿Puede grub cambiar la 'entrada' predeterminada automáticamente?

mini
fuente
1
En teoría, si puede usar comandos relacionados con la fecha y la hora /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.
edwin

Respuestas:

5

Primero, ejecute grep -E '(menuentry |submenu )' /boot/grub/grub.cfgpara 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 datehookpara 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 datehookpone 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 ]; thencomo 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 defaultvariable con el nombre de entrada de menú de Windows 7 tomado de ese grepcomando anterior.

El último ifbloque 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 0y 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.

Eric Carvalho
fuente
Puede ser mejor hacerlo a través de /etc/grub.d/00_header, porque las actualizaciones del kernel (o el usuario) pueden llamar a update-grub al agregar nuevas entradas. cf: linuxquestions.org/questions/linux-desktop-74/…
KIAaze
2

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" - 1y 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.cfgarchivo 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 defaultse 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-gruben la terminal. De hecho, este comando generará y reemplazará automáticamente /boot/grub/grub.cfgarchivos usando plantillas /etc/grub.dy configuraciones desde /etc/default/grub. Por lo tanto, será mejor poner el código anterior en una plantilla dentro del /etc/grub.ddirectorio.

Fuente de inspiración: crear una secuencia de comandos de una máquina de estado de tiempo de arranque simple en GRUB2 .

Otras fuentes:

Radu Rădeanu
fuente
0

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.

Barafu Albino
fuente