Czy GRUB można zaplanować? Oznacza to: automatyczną zmianę domyślnego „wpisu” (automatyczne logowanie) w określonych odstępach czasu?

10

Na przykład:

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

Czy grub może automatycznie zmienić domyślny „wpis”?

mini
źródło
1
Teoretycznie, jeśli możesz używać poleceń związanych z datą i godziną /boot/grub/grub.cfg, wybranie wpisu grub dla danej godziny powinno być możliwe po prostu poprzez edycję plików /etc/grub.d. Ale myślę, że data / czas przed załadowaniem gruba nie byłyby nawet skalibrowanym źródłem (na przykład NTP). Dzięki temu będziesz mieć wewnętrzny zegar komputera.
edwin

Odpowiedzi:

5

Najpierw uruchom, grep -E '(menuentry |submenu )' /boot/grub/grub.cfgaby uzyskać listę pozycji menu grub. Powinieneś zobaczyć coś takiego:

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

Tutaj możesz zobaczyć moją pierwszą pozycję menu: Ubuntu , następnie Zaawansowane opcje podmenu Ubuntu (z czterema innymi wpisami), 2 testy pamięci i wreszcie Windows 7 .

Jeśli utworzymy plik o nazwie /boot/grub/custom.cfg, zostanie on później załadowany /boot/grub/grub.cfg, abyśmy mogli łatwo zmienić domyślną konfigurację GRUB-a.

Użyłem modułu GRUBA, datehookaby uzyskać aktualny czas.

/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

Moduł datehookudostępnia zmienne: DZIEŃ, GODZINA, MINUTA, MIESIĄC, DRUGI, WEEKDAY i ROK, które zwracają rzeczywiste wartości daty / godziny na podstawie zegara sprzętowego.

Weźmy if [ $TIME -ge 600 -a $TIME -lt 1659 ]; thenjako przykład. Oznacza to: jeśli bieżący czas jest większy lub równy 6 rano i mniejszy niż 16:59 (16:59), to wykonaj następną komendę ( set default="Windows 7 (loader) (on /dev/sda2)"), która ustawia defaultzmienną z nazwą pozycji menu systemu Windows 7 wziętą z greppowyższej komendy.

Ostatni ifblok pokazuje wybór pozycji podmenu. W takim przypadku „Ubuntu z systemem Linux 3.16.0-25-generic” znajduje się w podmenu, które jest drugą pozycją w menu głównym. Jako pozycji wpisu w menu rozpoczyna się od 0, pozycji menu o nazwie „Ubuntu” to 0i „opcje zaawansowane dla Ubuntu” podmenu 1, dlatego musiałem dodać 1>przed nazwą wpisu: set default="1>Ubuntu, with Linux 3.16.0-25-generic".

Nie musisz biegać update-grub.

Zegar sprzętowy może być zawodne, zwłaszcza wtedy, gdy bateria jest wyczerpana. Wejdź także do konfiguracji systemu BIOS i sprawdź godzinę. Jeśli jest to UTC, musisz zmienić zakres czasu w skrypcie.

Eric Carvalho
źródło
Lepiej jest to zrobić za pomocą /etc/grub.d/00_header, ponieważ aktualizacje jądra (lub użytkownika) mogą wywoływać update-grub podczas dodawania nowych wpisów. cf: linuxquestions.org/questions/linux-desktop-74/…
KIAaze
2

Na początek uruchom następującą komendę w terminalu :

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

Spowoduje to zwrócenie listy pozycji menu grub. Zakładam, że w twoim przypadku ta lista jest mniej więcej taka:

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

Teraz dla każdego z tych wpisów należy przypisać numer w porządku rosnącym, zaczynając od 0 (dla „Slitaz” - 0, dla „Opcje zaawansowane” - 1i tak dalej). Użyjesz tych liczb, aby ustawić domyślny wpis w menu grub.

Następnie, i ostatnią rzeczą, powinieneś edytować /boot/grub/grub.cfgplik w następujący sposób:

  • Z terminalu otwórz w gedicie plik używając:

    sudo -H gedit /boot/grub/grub.cfg
    
  • Znajdź linię, w której defaultustawiono zmienną; powinien wyglądać podobnie z:

    set default="..."
    
  • Zamień powyższą linię na następny kod:

    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
    
  • Zapisz plik i zamknij go.

To wszystko! Uruchom ponownie komputer i sprawdź, czy działa.

Uwaga: aby przywrócić te ustawienia, wystarczy uruchomić sudo update-grubterminal. W rzeczywistości to polecenie automatycznie wygeneruje i zastąpi /boot/grub/grub.cfgplik przy użyciu szablonów zi /etc/grub.dustawień z /etc/default/grub. Lepiej więc umieścić powyższy kod w jednym szablonie w /etc/grub.dkatalogu.

Źródło inspiracji: skryptowanie prostej maszyny stanu czasu rozruchu w GRUB2 .

Innych źródeł:

Radu Rădeanu
źródło
0

Masz 2 możliwości. Po pierwsze, możesz dodać do każdego systemu operacyjnego skrypt cron, który zmienia konfigurację według zegara. Jednak nie spodoba ci się to, co się stanie, jeśli ten skrypt uruchomi się, gdy system operacyjny zostanie zamknięty, więc uważaj. Lepszym pomysłem byłoby zakupienie płyty głównej UEFI na komputer. Tam możesz zainstalować Shellx86, który jest konsolą skryptową przed bootloaderem. Tworzenie skryptu dla tego, co chcesz w Shellx64, nie jest trudniejsze niż tworzenie skryptów w bash. Użyłem go do uruchomienia różnych systemów operacyjnych w zależności od tego, czy masz połączenie z Internetem.

Barafu Albino
źródło