GRUB peut-il être programmé? Cela signifie: changer automatiquement «l'entrée» par défaut (connexion automatique) à des périodes définies automatiquement?

10

Par exemple:

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 peut-il changer automatiquement l'entrée par défaut?

mini
la source
1
En théorie, si vous pouvez utiliser des commandes liées à la date et à l'heure /boot/grub/grub.cfg, le choix d'une entrée grub pour une heure donnée devrait être possible simplement en éditant les fichiers sur /etc/grub.d. Mais je pense que la date / heure avant les charges de grub ne serait même pas une source calibrée (comme NTP, par exemple). Donc, cela vous laisserait avec l'horloge interne du PC.
edwin

Réponses:

5

Tout d'abord, exécutez grep -E '(menuentry |submenu )' /boot/grub/grub.cfgpour obtenir une liste de vos entrées de menu grub. Vous devriez voir quelque chose comme:

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

Ici, vous pouvez voir ma première entrée de menu est Ubuntu , suivie d'un sous-menu Options avancées pour Ubuntu (avec quatre autres entrées), 2 tests de mémoire et, enfin, Windows 7 .

Si nous créons un fichier nommé /boot/grub/custom.cfg, il sera chargé après /boot/grub/grub.cfg, afin que nous puissions facilement changer la configuration par défaut de GRUB.

J'ai utilisé le module de GRUB datehookpour obtenir l'heure actuelle.

/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

Le module datehookmet à disposition les variables: DAY, HOUR, MINUTE, MONTH, SECOND, WEEKDAY et YEAR, qui renvoient les valeurs réelles de date / heure en fonction de l'horloge matérielle.

Prenons if [ $TIME -ge 600 -a $TIME -lt 1659 ]; thenun exemple. Cela signifie: si l'heure actuelle est supérieure ou égale à 6 h et inférieure à 16 h 59 (16 h 59), exécutez la commande suivante ( set default="Windows 7 (loader) (on /dev/sda2)"), qui définit la defaultvariable avec le nom d'entrée de menu Windows 7 tiré de cette grepcommande ci-dessus.

Le dernier ifbloc illustre la sélection d'une entrée de sous-menu. Dans ce cas, "Ubuntu, avec Linux 3.16.0-25-generic" se trouve dans un sous-menu qui est la deuxième entrée du menu principal. Comme une position d'entrée dans un menu commence à 0, l'entrée de menu nommé « Ubuntu » est 0et les « Options avancées pour Ubuntu » sous - menu est 1, ce qui est la raison pour laquelle je devais ajouter 1>avant le nom d'entrée: set default="1>Ubuntu, with Linux 3.16.0-25-generic".

Il n'y a pas besoin de courir update-grub.

L' horloge matérielle peut ne pas être fiable, surtout si la batterie est morte. Entrez également dans la configuration du BIOS et vérifiez l'heure. Si c'est UTC, vous devrez changer la plage de temps dans le script.

Eric Carvalho
la source
Il peut être préférable de le faire via /etc/grub.d/00_header, car les mises à jour du noyau (ou l'utilisateur) peuvent appeler update-grub lors de l'ajout de nouvelles entrées. cf: linuxquestions.org/questions/linux-desktop-74/…
KIAaze
2

Pour commencer, exécutez la commande suivante dans le terminal :

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

Cela renverra une liste de vos entrées de menu grub. Je suppose que dans votre cas, cette liste ressemble à ceci:

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

Maintenant, pour chacune de ces entrées, vous devez attribuer un numéro dans l'ordre croissant commençant par 0 (pour "Slitaz" - 0, pour "Options avancées" - 1et ainsi de suite). Vous utiliserez ces chiffres pour définir l'entrée par défaut dans le menu grub.

Ensuite, et la dernière chose, vous devez modifier le /boot/grub/grub.cfgfichier comme suit:

  • Depuis le terminal, ouvrez dans gedit le fichier en utilisant:

    sudo -H gedit /boot/grub/grub.cfg
    
  • Trouvez la ligne où la defaultvariable est définie; il devrait ressembler à quelque chose de similaire avec:

    set default="..."
    
  • Remplacez la ligne ci-dessus par le code suivant:

    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
    
  • Enregistrez le fichier et fermez-le.

C'est tout! Redémarrez votre PC et vérifiez s'il fonctionne.

Remarque: pour rétablir ces paramètres, exécutez simplement sudo update-grubdans le terminal. En fait, cette commande générera et remplacera automatiquement le /boot/grub/grub.cfgfichier en utilisant les modèles /etc/grub.det les paramètres de /etc/default/grub. Il sera donc préférable de mettre le code ci-dessus dans un modèle à l'intérieur du /etc/grub.drépertoire.

Source d'inspiration: Scripting a Simple Boot Time State Machine in GRUB2 .

Autres sources:

Radu Rădeanu
la source
0

Vous avez 2 possibilités. Tout d'abord, vous pouvez ajouter à chaque système d'exploitation un script cron qui modifie la configuration par horloge. Cependant, vous n'aimerez pas ce qui se passera si ce script se déclenche pendant la fermeture du système d'exploitation, alors méfiez-vous. Une meilleure idée serait d'acquérir une carte mère UEFI pour votre PC. Vous pouvez y installer Shellx86 qui est une console de script de pré-démarrage. Créer un script pour ce que vous voulez dans Shellx64 n'est pas plus difficile que de créer un script en bash. Je l'ai utilisé pour démarrer différents systèmes d'exploitation selon que vous disposez d'une connexion Internet.

Barafu Albino
la source