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.
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 :
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.
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.
/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.Odpowiedzi:
Najpierw uruchom,
grep -E '(menuentry |submenu )' /boot/grub/grub.cfg
aby uzyskać listę pozycji menu grub. Powinieneś zobaczyć coś takiego: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,
datehook
aby uzyskać aktualny czas./boot/grub/custom.cfg
:Moduł
datehook
udostę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 ]; then
jako 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 ustawiadefault
zmienną z nazwą pozycji menu systemu Windows 7 wziętą zgrep
powyższej komendy.Ostatni
if
blok 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” to0
i „opcje zaawansowane dla Ubuntu” podmenu1
, 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.
źródło
Na początek uruchom następującą komendę w terminalu :
Spowoduje to zwrócenie listy pozycji menu grub. Zakładam, że w twoim przypadku ta lista jest mniej więcej taka:
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” -1
i tak dalej). Użyjesz tych liczb, aby ustawić domyślny wpis w menu grub.Następnie, i ostatnią rzeczą, powinieneś edytować
/boot/grub/grub.cfg
plik w następujący sposób:Z terminalu otwórz w gedicie plik używając:
Znajdź linię, w której
default
ustawiono zmienną; powinien wyglądać podobnie z:Zamień powyższą linię na następny kod:
Zapisz plik i zamknij go.
To wszystko! Uruchom ponownie komputer i sprawdź, czy działa.
Źródło inspiracji: skryptowanie prostej maszyny stanu czasu rozruchu w GRUB2 .
Innych źródeł:
źródło
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.
źródło