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:

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.

Wpis “Linux i Windows na jednym dysku – problem z zegarem systemowym” komentowano 3 razy

  1. „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 🙂

    • 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. 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.

Dodaj komentarz