Jak możemy automatycznie ustawić domyślną strefę czasową systemu w systemie Linux za pomocą Internetu? Widzę, że serwery NTP mogą aktualizować tylko czas, ale nie strefę czasową. Czy jest jakiś serwer, który może zmienić strefę czasową?
Jak możemy automatycznie ustawić domyślną strefę czasową systemu w systemie Linux za pomocą Internetu? Widzę, że serwery NTP mogą aktualizować tylko czas, ale nie strefę czasową. Czy jest jakiś serwer, który może zmienić strefę czasową?
Odpowiedzi:
Jakiś czas temu napisałem program, który to robi: tzupdate .
Możesz zobaczyć, co ustawiłoby twoją strefę czasową (bez ustawiania jej), uruchamiając tzupdate -p
:
$ tzupdate -p
Europe/Malta
Możesz ustawić to naprawdę, uruchamiając tzupdate
jako root.
$ sudo tzupdate
Europe/Malta
$ date
Thu 12 Sep 05:52:22 CEST 2013
Działa to przez:
/etc/localtime
celu wskazania pliku zoneinfo dla tej strefy czasowejJest to stary wątek, ale nadal istotny dla kubuntu 1710, który nie zmienia automatycznie strefy czasowej. Korzystam z rozwiązania Chrisa Downa dla tzupdate, ale zapewniam również, że zostanie on uruchomiony, gdy system spróbuje połączyć się z siecią (Wi-Fi lub inną). Zakłada się, że używasz Network Managera.
Najpierw otwórz terminal.
Zainstaluj tzupdate
sudo apt install python-pip
pip install -U tzupdate
Następnie upewnij się, że jest dostępny dla wszystkich użytkowników
sudo cp -R ~/.local/lib/python2.7/site-packages/. /usr/lib/python2.7/.
sudo cp /home/marta_riba/.local/bin/tzupdate /usr/local/bin/tzupdate
Sprawdź, czy to działa
sudo tzupdate
Następnie musimy upewnić się, że jest to dostępne dla wszystkich użytkowników
sudo su -
tzupdate
który wpuszcza Cię jako root, a następnie sprawdza, czy polecenie zmienia strefę czasową. Następnie upewnij się, że wyjdziesz, aby powrócić jako zwykły użytkownik
exit
Upewnij się, że tzupdate można uruchomić z sudo bez hasła. Jest to potrzebne na późniejszym etapie, gdy uruchomimy to z menedżera sieci, który uruchamia to w tle. Wpisz to w terminalu, aby edytować plik sudoers
sudo visudo
Dodaj ten wiersz na końcu pliku
ALL ALL=(root) NOPASSWD: /usr/local/bin/tzupdate
Naciśnij CTRL-X, a następnie naciśnij Y, a następnie ENTER, aby zapisać zmiany
Następnie zapewniamy, że NetworkManager zawsze wywołuje to po wywołaniu zmiany połączenia sieciowego (np. Podczas łączenia z Wi-Fi). W tym celu tworzymy plik o nazwie tzupdate w folderze dispatcher.d, który po prostu wywołuje sudo tzupdate. Plik wymaga uprawnień wykonywalnych do uruchomienia
echo 'sudo tzupdate'| sudo tee /etc/NetworkManager/dispatcher.d/99-tzupdate
sudo chmod +x /etc/NetworkManager/dispatcher.d/99-tzupdate
Zauważ, że NetworkManager wywoła polecenie wykonania sudo (tj. Sudo tzupdate), które zwykle monituje o podanie hasła.
Może być lepszy sposób, aby to zrobić, to znaczy, aby NetworkManager wywoływał to tylko wtedy, gdy podnosi połączenie, a nie również w dół (tak jak powyżej) - Próbowałem umieścić skrypt w / etc / network / if-up .d, ale to nie zadziałało dla mnie
Aby przetestować to w Kubuntu - zmień lokalną strefę czasową na coś innego (przejdź do plazmy Data na pasku zadań i kliknij prawym przyciskiem myszy i wybierz „Dostosuj datę / godzinę”, a następnie „Strefa czasowa” na karcie)
Wyłącz Wi-Fi i włącz ponownie - zobaczysz, że po połączeniu z Wi-Fi zdaje się czekać około 30 sekund, a następnie powinien pomyślnie zmienić strefę czasową.
Pamiętaj, że nie zostało to przetestowane z Wi-Fi, w którym należy wprowadzić hasło na stronie internetowej. Mam nadzieję, że fakt, że działa to na samym końcu połączenia sieciowego, powinien zapewnić użytkownikowi wystarczającą ilość czasu na wprowadzenie poświadczeń - w przeciwnym razie może to wymagać dalszych poprawek (sprawdź, czy połączenie istnieje, sprawdź, czy możesz połączyć się z Internetem, poczekaj przez X sekund, jeśli nie można połączyć się z Internetem, a następnie spróbuj ponownie razy Y.
Nie jest jasne, co rozumiesz przez „aktualizację strefy czasowej”.
Unix i Linux zachowują czas jako liczbę sekund od 1 stycznia 1970 roku, 00:00 UTC. Zegar systemu Unix jest zatem niezależny od strefy czasowej. Strefy czasowe nie istnieją w jądrze Linuksa; tylko wtedy, gdy aplikacja przestrzeni użytkownika wyświetla czas, liczba sekund od 1970 roku jest interpretowana przy użyciu strefy czasowej. Zwykle interpretacja ta odbywa się za pomocą funkcji biblioteki C. Strefa czasowa jest wybierana przez TZ
zmienną środowiskową. Definicje stref czasowych (które składają się z nazwy strefy czasowej, przesunięcia w stosunku do UTC, dat, kiedy obowiązuje czas letni i przesunięcia w czasie DST) są częścią GNU libc i zwykle są zawarte w dystrybucjach Linuksa jako pakiet „tzdata”. Dlatego aktualizacja definicji strefy czasowej jest kwestią uruchomiony apt-get upgrade
, yum update
lub jakiegoś podobnego działania.
Należy pamiętać, że niektóre programy, takie jak Java, mają własne pliki definicji stref czasowych, które należy osobno aktualizować.
NTP śledzi liczbę sekund od 1 stycznia 1900 roku UTC . Dlatego NTP, podobnie jak jądro Uniksa, nie ma pojęcia stref czasowych.