È possibile programmare GRUB? Ciò significa: modificare automaticamente la "voce" predefinita (accesso automatico) in determinati periodi di tempo?


10

Per esempio:

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

Grub può cambiare automaticamente la 'voce' di default?


1
In teoria, se puoi usare i comandi relativi a data e ora /boot/grub/grub.cfg, scegliere una voce grub per una determinata ora dovrebbe essere possibile semplicemente modificando i file /etc/grub.d. Ma penso che la data / ora prima del caricamento di grub non sia nemmeno una fonte calibrata (come ad esempio NTP). In modo che ti lascerebbe con l'orologio interno del PC.
edwin,

Risposte:


5

Innanzitutto, esegui grep -E '(menuentry |submenu )' /boot/grub/grub.cfgper ottenere un elenco delle voci del menu di grub. Dovresti vedere qualcosa del tipo:

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' {

Qui puoi vedere la mia prima voce di menu è Ubuntu , seguita da un sottomenu Opzioni avanzate per Ubuntu (con altre quattro voci), 2 test di memoria e, infine, Windows 7 .

Se creiamo un file denominato /boot/grub/custom.cfg, verrà caricato dopo /boot/grub/grub.cfg, quindi possiamo facilmente modificare la configurazione predefinita di GRUB.

Ho usato il modulo di GRUB datehookper ottenere l'ora corrente.

/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

Il modulo datehookrende disponibili le variabili: DAY, HOUR, MINUTE, MONTH, SECOND, WEEKDAY e YEAR, che restituiscono i valori di data / ora effettivi basati sull'orologio hardware.

Prendiamo if [ $TIME -ge 600 -a $TIME -lt 1659 ]; thencome esempio. Significa: se l'ora corrente è maggiore o uguale alle 6:00 e inferiore alle 16:59 (16:59), eseguire il comando successivo ( set default="Windows 7 (loader) (on /dev/sda2)"), che imposta la defaultvariabile con il nome della voce di menu di Windows 7 preso da quel grepcomando sopra.

L'ultimo ifblocco esemplifica la selezione di una voce di sottomenu. In tal caso "Ubuntu, con Linux 3.16.0-25-generico" si trova all'interno di un sottomenu che è la seconda voce nel menu principale. Come una posizione di voce di un menu inizia da 0, la voce di menu denominata "Ubuntu" è 0e le "Opzioni avanzate per Ubuntu" sottomenu è 1, è per questo che ho dovuto aggiungere 1>prima del nome della voce: set default="1>Ubuntu, with Linux 3.16.0-25-generic".

Non c'è bisogno di correre update-grub.

L' orologio hardware potrebbe non essere affidabile, specialmente se la batteria è scarica. Inoltre, accedere alla configurazione del BIOS e controllare l'ora. Se è UTC dovrai modificare l'intervallo di tempo nello script.


Potrebbe essere meglio farlo tramite /etc/grub.d/00_header, perché gli aggiornamenti del kernel (o l'utente) potrebbero chiamare update-grub quando si aggiungono nuove voci. cf: linuxquestions.org/questions/linux-desktop-74/…
KIAaze

2

Per cominciare, esegui il seguente comando nel terminale :

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

Questo restituirà un elenco delle voci del menu di grub. Presumo che nel tuo caso questo elenco sia qualcosa del genere:

Slitaz
Advanced options
Memory test (memtest86+)
Memory test (memtest86+, serial console 115200)
Ubuntu
Fedora
openSUSE

Ora, per ciascuna di queste voci è necessario assegnare un numero in ordine crescente a partire da 0 (per "Slitaz" - 0, per "Opzioni avanzate" - 1e così via). Utilizzerai questi numeri per impostare la voce predefinita nel menu di grub.

Successivamente, e l'ultima cosa, dovresti modificare il /boot/grub/grub.cfgfile come segue:

  • Dal terminale apri in gedit il file usando:

    sudo -H gedit /boot/grub/grub.cfg
    
  • Trova la riga in cui defaultè impostata la variabile; dovrebbe apparire qualcosa di simile con:

    set default="..."
    
  • Sostituisci la riga sopra con il prossimo codice:

    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
    
  • Salva il file e chiudilo.

È tutto! Riavvia il PC e controlla se funziona.

Nota: per ripristinare queste impostazioni, basta eseguire sudo update-grubnel terminale. In effetti, questo comando genererà e sostituirà automaticamente il /boot/grub/grub.cfgfile utilizzando i modelli da /etc/grub.de le impostazioni da /etc/default/grub. Quindi sarà meglio mettere il codice sopra in un modello all'interno della /etc/grub.ddirectory.

Fonte di ispirazione: Scripting di una semplice macchina a tempo di avvio in GRUB2 .

Altre fonti:


0

Hai 2 possibilità. Innanzitutto, puoi aggiungere a ogni sistema operativo uno script cron che modifica la configurazione in base all'orologio. Tuttavia, non ti piacerà cosa accadrà se questo script si attiva mentre il sistema operativo si sta spegnendo, quindi fai attenzione. Un'idea migliore sarebbe quella di acquisire una scheda madre UEFI per il tuo PC. Lì puoi installare Shellx86 che è una console di scripting pre-bootloader. Creare uno script per quello che vuoi in Shellx64 non è più difficile dello scripting in bash. L'ho usato per avviare diversi sistemi operativi a seconda se si dispone di una connessione a Internet.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.