Linux i Windows na jednym dysku – problem z zegarem systemowym

Mam na laptopie Windows 10 i Linux Mint. Przy uruchamianiu, z menu gruba mogę wybrać, który OS ma się załadować. Systemy koegzystują obok siebie zgodnie, prócz problemu z czasem, a konkretnie z zegarem systemowym. W czasie zimowym, zegar w Windowsie późnił się o godzinę, w czasie letnim o dwie. W linuksie problem nie występował. Poświęciłem ostatnio kilka minut, by zgłębić problem, poniżej można znaleźć jego rozwiązanie.

Windows, Linux, strefa czasowa i RTC

Od dawna, być może od zawsze, komputery wyposażone były w RTC, czyli Real Time Clock (inaczej jest w Raspberry czy Banana Pi o czym pisałem tutaj: Obsługa zewnętrznego RTC w Banana Pi). Jest to układ, który jest po prostu zegarem. Bateria w komputerze (często CR2032) służy nie tylko do podtrzymania ustawień Biosu, czy teraz bardziej UEFI, ale też do zasilania tego zegara. Stąd już w UEFI/BIOS mamy aktualną godzinę. Później ten czas jest odczytywany przez system operacyjny i od ery internetu, korygowany na podstawie zegara wzorcowego, odczytywanego z sieci po protokole NTP (network time protocol). Dlatego komputery podłączone do internetu mają bardzo dokładny zegarek, system operacyjny koryguje czas u siebie oraz w RTC. Windows, podczas uruchamiania, wprost przepisuje czas z RTC, czyli godzina w Windowsie jest identyczna z tą w UEFI/BIOS. Można powiedzieć, że zegar sprzętowy odmierza czas naszej strefy czasowej.

W linuksach jest to zrobione inaczej, być może dla przeciętnego użytkownika komputera nie lepiej ani gorzej, ale na pewno profesjonalniej. Otóż Linux zakłada, że RTC odmierza wzorcowy czas uniwersalany, skrótowo opisany UTC (Universal Time Coordinated). Do strefy czasu UTC należy czas zachodnioeuropejski WET (Western European Time) i czas Greenwich – GMT (Greenwich Mean Time).

Polska znajduje się w strefie CET (Central European Time), nasz czas jest przesunięty o godzinę w przód, względem UTC, czyli UTC+1:00. I teraz zaczyna się problem. Linux podczas uruchamiania, gdy ma dostęp do sieci, odpytuje zdefiniowany serwer NTP, zapisuje czas UTC do sprzętowego zegara RTC, a sam wyświetla czas skonfigurowanej strefy czasowej, czyli dodaje lub odejmuje odpowiednie przesunięcie. Dla przykładu – jest godzina 20:54 – taką pokaże Linux, ale w RTC będzie (zależnie czy czas letni/zimowy) 18:54 lub 19:54. Później uruchamiamy Windows, który odczytuje czas z RTC i wyświetla go wprost, bez korekty dla strefy, czyli mamy opóźnienie godziny lub dwóch, zamiast czasu CET, mamy pokazywany czas UTC. Przestawimy zegar ręcznie na właściwy i jest ok, do czasu uruchomienia linuksa, który przy ładowaniu odpyta czas z internetu i zapisze go do RTC.

Zmiana ustawień w linuksie, czyli timedatectl

Za kontrolę czasu i daty w Linuksie Mint i nie tylko, odpowiada usługa timedatectl. Po wpisaniu jej nazwy w terminalu, otrzymamy kilka przydatnych informacji:

Linux - timedatectl

Widzimy tu nasz aktualny czas, czas UTC, czas RTC identyczny z UTC, ustawioną strefę czasową. Jest też informacja, że zegar jest synchronizowany z wzorcem w sieci (Network time on: yes), że jeszcze nie został zsynchronizowany (NTP synchronized: no) i że zegar RTC nie pracuje w naszej strefie czasowe (RTC in local TZ: no), czyli RTC pokazuje czas UTC, Jeśli by zmienić tą ostatnią opcję, to zniknie problem z czasem w Windows, bo Linux będzie traktował czas w RTC jak nasz aktualny. Jedna komenda w terminalu:

timedatectl set-local-rtc 1 --adjust-system-clock

Ustawienie RTC in local TZ

i teraz dla porównania timedatectl

timedatectl rtc in local tz

Od teraz Linux w kwestii czasu jest tak samo upośledzony jak Windows, czyli wprost przepisuje czas z RTC, jako czas bieżący. Pojawiło się też ostrzeżenie,  że takie ustawienie nie jest najlepsze, że generuje rozmaite problemy, choćby ze zmianą czasu letni/zimowy, nas to jednak nie dotyczy. I co najważniejsze, rozwiązuje nam to definitywnie problem z godzinnym/dwugodzinnym opóźnieniem zegara w Windows.

Możesz również polubić…

12 komentarzy

  1. pm pisze:

    “choćby ze zmianą czasu letni/zimowy, nas to jednak nie dotyczy”
    Czemu nie? Jeszcze nie odwołali zmiany czasy co pół roku 🙁

    Windows ma trochę głupie założenie, że jest jedynym systemem zainstalowanym na danym komputerze. Dostosowując Linuksa do tego powodujemy, że po zmianie czasu musimy uruchomić najpierw Windows (inaczej Linuks będzie wyświetlał nieprawidłowy czas). Według mnie, sensowniej jest dostosować Windows. Ponoć to kwestia jednego wpisu w rejestrze, żeby używał używał czasu z RTC jako UTC.

    A najlepsze i tak jest synchronizowanie czasu po NTP 🙂

    • Wojtek pisze:

      Problem ze zmianą czasu na letni/zimowy nas nie dotyczy, bo założyłem że zostanie uruchomiony Windows i to załatwi temat, z drugiej też strony nie jestem pewny, czy przypadkiem u mnie linux nie zmienilł czasu na letni. No i tak jak piszesz, jest NTP – w linuksie odpytywany przy każdym bootowaniu, a w windowsie co pewien okres.
      Nie udało mi się znaleźć triku z rejestrem w Windows, stąd opis obejścia z drugiej strony.

  2. SpeX pisze:

    Czytając artykuł, pierwsze co mi przyszło do głowy. To właśnie to czy nie da się tego zrobić od drugiej strony. Czyli by zmusić Windowsła by działał jak Linux.

    Ale tu jest ważniejsze pytanie, a nie czy wersja Linuxowa jest faktycznie lepsza. Jak na oba warianty wpływają na czas UEFI/BIOS? Bo ich nie zmusisz zmusisz do zmiany sposobu działania.

    A prawda jest taka, iż najlepsza wersja to taka, gdzie RTC oprócz czasu, przechowywał by informacja o jakiej strefie czasowej mówimy.

  3. Lenka pisze:

    U mnie nie ma takiego problemu, mąż korzysta z Linuksa ja z Windowsa i wszystko jest ok.

  4. Encelados pisze:

    Gwoli ścisłości: nie chodzi tu o Windows i Linux na jednym dysku (który przecież może być przenośny) – co o Windows i Linux na jednym komputerze (płycie głównej) 😉

    Gdyby teraz i w przyszłości ktokolwiek szukając rozwiązania trafił tutaj – to podpowiadam:
    Od drugiej strony też się da. Można zmusić Windowsa by używał czasu UTC tak jak Linux.

    Ale nie jest to najlepszą opcją – bo Windows zmuszony do używania czasu UTC potencjalnie będzie powodował więcej problemów niż Linux zmuszony do używania czasu lokalnego.
    Czyli innymi słowy: przy uruchamianiu na jednym komputerze na przemian Windowsa i Linuxa mniej problemów przysporzy nam zmuszenie Linuxa aby traktował czas RTC tak jak Windows – niż odwrotnie.

    Windowsa (od 7 do 10) da się zmusić aby traktował czas RTC tak jak Linux poprzez edycję rejestru (regedit.exe). Oczywiście tylko na własną odpowiedzialność!

    Jak to zrobić? Opis na stronie, do której link poniżej:

    https://pl.if-koubou.com/articles/how-to/how-to-fix-windows-and-linux-showing-different-times-when-dual-booting.htm

  5. Encelados pisze:

    Lenka 12.10.2018 o 10:08 napisała:
    U mnie nie ma takiego problemu, mąż korzysta z Linuksa ja z Windowsa i wszystko jest ok.

    Bo pewnie mąż na jednym kompie a Ty na drugim. I wszystko jest O.K

    ;D

  6. SebeX pisze:

    Dzięki za wyjaśnienie i receptę 🙂 Sprawdzę.

  7. dzejkobsen pisze:

    To windows ma dobre założenie, a linux zmiesza zakładając MYLNIE, że nasz RTC to jest UTC. Linux ingeruje w RTC i go zmienia i z tego względu jak uruchamiamy Windowsa, to mamy zły czas. Proponuję jeszcze wydać taką komendę:
    sudo systemctl disable ntp –> dzięki niej czas w systemie linux nie będzie się aktualizował z zegarem serverowym i nasz komp nie będzie generował niepotrzebnie ruchu na łączy przez protokół NTP.

  8. KorkoranDC pisze:

    to jest niezrozumienie tego, że zegar sprzętowy nie pokazuje czasu, tylko oprogramowanie, system Windows i Linux. Obecnie system sam pobiera z internetu czas, i problem może być przy braku internetu, nie ustawieniu poprawnie strefy(jeżeli jest wymagana). Czas należy synchronizować zawsze z internetu, aby był poprawny i dokładny, w tym ntp. Zegar sprzętowy nas nie obchodzi. W Linuksie typowe ustawienia, to A)ustaw czas i datę automatycznie, B) strefa czasowa Europe/Warsaw kraj Poland i prawidłowo ustawione 3 opcje w zależności od tego, czy jest to czas letni, czy jest zmiana czasu. Jeżeli są problemy, to proste przepisanie instrukcji z sieci internet. Na przykład ntp można doinstalować.

  9. fedar pisze:

    Trochę odgrzewany kotlet, ale:
    Windows ma założenia windowsowe, linux – uniwersalne. 😉
    W win aby uzyskać poprawną synchronizację czasu z RTC ustawionego na UTC trzeba stosować tricky w rejestrze (mam tak zrobione u siebie).
    W linuksie możemy zarówno RTC jak i synchronizację czasu systemu z RTC konfigurować dowolnie (UTC/czas lokalny). Więcej, z systemu można równocześnie odczytywać czas UTC i lokalny. Jeśli jest to komputer do przeglądania internetu czy grania – nie ma znaczenia wybór sposobu synchronzacji czasu. Ale jeśli jest to np. system na jakimś sterowniku będącym elementem systemu rozproszonego (ale nie tylko), to na pewno wygodniej mieć RTC ustawiony na UTC (jednakowo w różnych strefach czasowych), a czas lokalny definiować w konfiguracji systemu operacyjnego. W swojej pracy doświadczyłem już kłopotów związanych z automatycznym przestawianiem RTC między czasem letnim/zimowym i dlatego preferuję ustawienie RTC na UTC.
    Wyłączanie klienta NTP, jeśli jest dostęp do internetu, nie jest dobrym pomysłem. Dobrze ustawiona synchronizacja NTP praktycznie nie generuje ruchu w sieci.

  10. KL pisze:

    Najlepiej było by zmusić windowsa aby odpytywał NTP przy każdym starcie tak jak linux, a nie tylko na polecenie. Niesyty nie wiem jak to zrobić. (Może jakiś skrypt w autostarcie?) Wtedy oba systemy miały by dobry czas po swojemu. Przestawianie zegara płyty głównej tam i z powrotem nie powinno być problemem. (Moim zdaniem to linux wpisuje do UEFI zły czas. Jak uruchomisz UEFI na komputerze linuxowym to wyswietlany będzie UTC a nie prawidłowy czas lokalny, w którym żyjemy. UEFI nie używa stref.)

Leave a Reply

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.