purpura, woda uspokaja

purpura, woda uspokaja
fot. Salman Arif Khan

piątek, 21 lutego 2014

Czas

Czy ktoś się zastanawiał jak nasz komputer lub też system operacyjny odmierza czas? Problem jest niebanalny, jakkolwiek niezauważalny, jeżeli korzysta się z jednego systemu. W przypadku wielu systemów na jednym komputerze jest to zawsze pewien zgrzyt.
Ale od początku. Zacznijmy od czasu sprzętowego. Z angielska Real Time Clock lub CMOS clock. Jest on ustawiony w naszym biosie. Czas ten ustawiamy z palca lub też system operacyjny stosownie go modyfikuje zapisując "właściwy".  Oznacza to, że czas sprzętowy i czas systemowy, czyli ten odmierzany przez nasz software, mogą być różne. Czasami jest to źródłem nieporozumień. Jeżeli jest jeden system on zawsze wie jaki ustawić czas systemowy względem czasu sprzętowego. W przypadku wielu systemów może się okazać, że procedury ustawiania czasu są różne.
Przyjęła się taka umowa, że niezmienny jest czas uniwersalny UTC. Pozostałe czasy, mowa o czasach lokalnych, wyznaczane są w relacji do UTC z uwzględnieniem offsetu wynikającego z oddalenia od położenia zerowego. Tą samą konwencję stosują systemy unixowe - w tym (Mac) OS X, Linuksy i BSD. Czas sprzętowy z założenia jest czasem UTC. Czas systemowy jest czasem UTC z uwzględnieniem offsetu.
Do tej zasady nie stosują się windowsy. Czas jest zawsze czasem lokalnym. Przyjmijmy, że warszawskim. Warszawa jest w strefie czasowej UTC +1.
Co to oznacza w konsekwencji? Odpalamy windowsa mamy właściwy czas. Odpalamy na tym samym sprzęcie inny system unixowy - czas jest inny z dokładnością do godziny, dwóch w zależności od pory roku (a zmiana czasu ze względu na porę roku, to kolejna frustracja).
W linuksach zmiana standardu, czyli założenie, że czas sprzętowy jest czasem lokalnym, jest rzeczą bardzo prostą. Wystarczy w zbiorze (tekstowym) /etc/default/rcS dopisać linijkę

UTC=no

System startując traktuje czas sprzętowy jako czas lokalny. Zegar pokazuje właściwą godzinę. Uruchamiając i pracując z windowsami i Linuksem (Debianem, Ubuntu, Fedorą itp) w obu systemach mamy właściwy czas.

W przypadku Linuksów niewłaściwy czas nie jest problemem, o ile włączona jest usługa NTP (Network Time Protocol) automatycznego ustawiania czasu. Jest ona aktywna niezwłocznie po uzyskaniu połączenia z Internetem. Nawet jeżeli wystartujemy z niewłaściwym czasem, za chwilę zegarek zostanie skorygowany. Z windowsami gorzej. Harmonogram usługi NTP ustawiony jest inaczej. Windowsy z definicji korygują czas raz na tydzień.
Jak można zauważyć, przestawienie Linuksa na czas sprzętowy lokalny jest banalnie proste. Czy równie proste jest przestawienie windowsów na czas sprzętowy uniwersalny UTC? Tak na prawdę sprawa została zauważona i skorygowana dopiero w siódemce. Trzeba odpowiednio zmodyfikować rejestr. służy do tego polecenie regedit. Definiujemy rejestr

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\RealTimeIsUniversal

typu DWORD o wartości (hex) równej 1.To samo możemy uzyskać definiując plik tekstowy *.reg (wpisujemy cokolwiek zamiast *) zawierający następujący tekst

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation] "RealTimeIsUniversal"=dword:00000001


Podwójne kliknięcie na ten zbiór spowoduje dopisanie wskazanego wyżej rejestru.

Funkcjonalność ta działa także w XP, jakkolwiek nie jest udokumentowana.

klucz RealTimeIsUniversal w rejestrze windows xp

Co więcej znany jest błąd ustawiania złej wartości czasu po hibernacji. Z mojego doświadczenia wynika, że ustawienie to działa dobrze, chociaż czasami fiksuje pokazując czas niewłaściwy. Mnie to nie przeszkadza, bo korzystam sporadycznie z windowsów. Ale raczej nie należy ufać na 100% podawanemu czasowi (oczywiście chodzi tylko i wyłącznie o przypadek stosowania windowsów wraz z innym systemem unixowym na tym samym komputerze).