Kann GRUB geplant werden? Dies bedeutet: Ändern des Standardeintrags (automatische Anmeldung) zu definierten Zeiträumen automatisch?


10

Beispielsweise:

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

Kann grub den Standardeintrag automatisch ändern?


1
Wenn Sie datums- und zeitbezogene Befehle verwenden können /boot/grub/grub.cfg, sollte die Auswahl eines Grub-Eintrags für eine bestimmte Stunde theoretisch nur durch Bearbeiten der Dateien möglich sein /etc/grub.d. Aber ich denke, das Datum / die Uhrzeit vor dem Laden der Maden wäre nicht einmal eine kalibrierte Quelle (wie zum Beispiel NTP). Damit hätten Sie also die PC-interne Uhr.
Edwin

Antworten:


5

Führen grep -E '(menuentry |submenu )' /boot/grub/grub.cfgSie zunächst eine Liste Ihrer Grub-Menüeinträge aus. Sie sollten etwas sehen wie:

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

Hier sehen Sie, dass mein erster Menüeintrag Ubuntu ist , gefolgt von einem erweiterten Menü für Ubuntu (mit vier weiteren Einträgen), zwei Speichertests und schließlich Windows 7 .

Wenn wir eine Datei mit dem Namen erstellen /boot/grub/custom.cfg, wird diese nachher geladen /boot/grub/grub.cfg, sodass wir die Standardkonfiguration von GRUB problemlos ändern können.

Ich habe das GRUB-Modul verwendet datehook, um die aktuelle Uhrzeit abzurufen .

/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

Das Modul datehookstellt die Variablen DAY, HOUR, MINUTE, MONTH, SECOND, WEEKDAY und YEAR zur Verfügung, die die tatsächlichen Datums- / Zeitwerte basierend auf der Hardware-Uhr zurückgeben.

Nehmen wir if [ $TIME -ge 600 -a $TIME -lt 1659 ]; thenals Beispiel. Dies bedeutet: Wenn die aktuelle Zeit größer oder gleich 6 Uhr morgens und kleiner als 16:59 Uhr (16:59 Uhr) ist, führen Sie den nächsten Befehl ( set default="Windows 7 (loader) (on /dev/sda2)") aus, der die defaultVariable mit dem Windows 7-Menüeintragsnamen aus dem grepobigen Befehl festlegt.

Der letzte ifBlock veranschaulicht die Auswahl eines Untermenüeintrags. In diesem Fall befindet sich "Ubuntu mit Linux 3.16.0-25-generic" in einem Untermenü, das der zweite Eintrag im Hauptmenü ist. Da eine Einstiegsposition in einem Menü bei 0 beginnt, lautet der Menüeintrag "Ubuntu" 0und das Untermenü "Erweiterte Optionen für Ubuntu". 1Deshalb musste ich 1>vor dem Eintragsnamen Folgendes hinzufügen : set default="1>Ubuntu, with Linux 3.16.0-25-generic".

Es besteht keine Notwendigkeit zu rennen update-grub.

Die Hardware-Uhr ist möglicherweise unzuverlässig, insbesondere wenn der Akku leer ist. Rufen Sie auch das BIOS-Setup auf und überprüfen Sie die Uhrzeit. Wenn es UTC ist, müssen Sie den Zeitbereich im Skript ändern.


Es ist möglicherweise besser, dies über /etc/grub.d/00_header zu tun, da Kernel-Updates (oder der Benutzer) beim Hinzufügen neuer Einträge möglicherweise update-grub aufrufen. Vgl.: linuxquestions.org/questions/linux-desktop-74/…
KIAaze

2

Führen Sie zunächst den folgenden Befehl im Terminal aus :

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

Dies gibt eine Liste Ihrer Grub-Menüeinträge zurück. Ich gehe davon aus, dass diese Liste in Ihrem Fall ungefähr so ​​lautet:

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

Jetzt sollten Sie für jeden dieser Einträge eine Nummer in aufsteigender Reihenfolge beginnend mit 0 zuweisen (für "Slitaz" - 0, für "Erweiterte Optionen" - 1usw.). Sie werden diese Zahlen verwenden, um den Standardeintrag im Grub-Menü festzulegen.

Als nächstes und als letztes sollten Sie die /boot/grub/grub.cfgDatei wie folgt bearbeiten :

  • Öffnen Sie vom Terminal in gedit die Datei mit:

    sudo -H gedit /boot/grub/grub.cfg
    
  • Suchen Sie die Zeile, in der die defaultVariable festgelegt ist. es sollte ähnlich aussehen mit:

    set default="..."
    
  • Ersetzen Sie die obige Zeile durch den nächsten Code:

    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
    
  • Speichern Sie die Datei und schließen Sie sie.

Das ist alles! Starten Sie Ihren PC neu und prüfen Sie, ob er funktioniert.

Hinweis: Um diese Einstellungen zurückzusetzen, führen Sie sie einfach sudo update-grubim Terminal aus. Tatsächlich generiert und ersetzt dieser Befehl automatisch /boot/grub/grub.cfgDateien mithilfe von Vorlagen /etc/grub.dund Einstellungen von /etc/default/grub. Daher ist es besser, den obigen Code in einer Vorlage im /etc/grub.dVerzeichnis abzulegen .

Inspirationsquelle: Skripting einer einfachen Startzeit-Zustandsmaschine in GRUB2 .

Andere Quellen:


0

Sie haben 2 Möglichkeiten. Zunächst können Sie jedem Betriebssystem ein Cron-Skript hinzufügen, das die Konfiguration nach Uhr ändert. Es wird Ihnen jedoch nicht gefallen, was passieren wird, wenn dieses Skript beim Herunterfahren des Betriebssystems aktiviert wird. Seien Sie also vorsichtig. Eine bessere Idee wäre, ein UEFI-Motherboard für Ihren PC zu erwerben. Dort können Sie Shellx86 installieren, eine Pre-Bootloader-Skriptkonsole. Das Erstellen eines Skripts für das, was Sie in Shellx64 möchten, ist nicht schwieriger als das Erstellen von Skripten in Bash. Ich habe es verwendet, um verschiedene Betriebssysteme zu starten, je nachdem, ob Sie eine Internetverbindung haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.