Antworten:
Führen grep -E '(menuentry |submenu )' /boot/grub/grub.cfg
Sie 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 datehook
stellt 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 ]; then
als 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 default
Variable mit dem Windows 7-Menüeintragsnamen aus dem grep
obigen Befehl festlegt.
Der letzte if
Block 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" 0
und das Untermenü "Erweiterte Optionen für Ubuntu". 1
Deshalb 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.
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" - 1
usw.). Sie werden diese Zahlen verwenden, um den Standardeintrag im Grub-Menü festzulegen.
Als nächstes und als letztes sollten Sie die /boot/grub/grub.cfg
Datei 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 default
Variable 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-grub
im Terminal aus. Tatsächlich generiert und ersetzt dieser Befehl automatisch/boot/grub/grub.cfg
Dateien mithilfe von Vorlagen/etc/grub.d
und Einstellungen von/etc/default/grub
. Daher ist es besser, den obigen Code in einer Vorlage im/etc/grub.d
Verzeichnis abzulegen .
Inspirationsquelle: Skripting einer einfachen Startzeit-Zustandsmaschine in GRUB2 .
Andere Quellen:
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.
/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.