HWCLOCK(8) Administracja systemem HWCLOCK(8)

hwclock - narzędzie do obsługi zegarów

hwclock [funkcja] [opcja...]

hwclock jest narzędziem administracyjnym do obsługi zegarów. Może: wyświetlać czas zegara sprzętowego; ustawiać zegar sprzętowy na określony czas; ustawiać zegar sprzętowy z zegara systemowego; ustawiać zegar systemowy z zegara sprzętowego; kompensować dryf zegara sprzętowego; korygować skalę czasu zegara systemowego; ustawiać: strefę czasową jądra, skalę czasową NTP i epokę (tylko na Alpha); przewidywać przyszłe wartości zegara sprzętowego na podstawie jego poziomu dryfu.

Od v2.26 dokonano istotnych zmian w funkcji --hctosys i opcji --directisa, a także dodano nową opcję --update-drift. Zob. opisy odpowiednich opcji poniżej.

Poniższe funkcje wzajemnie się wykluczają; jednocześnie można podać tylko jedną z nich. Jeśli nie poda się funkcji, domyślną będzie --show.

-a, --adjust

Dodaje lub odejmuje czas z zegara sprzętowego, aby uwzględnić systematyczny dryf zegara od momentu jego ostatniego ustawienia lub skorygowania. Zob. poniżej rozdział Funkcja korekcji.

--getepoch; --setepoch

Funkcje przeznaczone tylko do komputerów Alpha, dostępne wyłącznie poprzez sterownik czasu rzeczywistego (RTC) jądra Linux.

Służą do odczytu i ustawienia w jądrze wartości epoki zegara sprzętowego. Epoka jest liczbą lat od początku naszej ery, do której odnosi się wartość zera lat w zegarze sprzętowym. Przykładowo, jeśli licznik lat w BIOS-ie komputera jest ustawiony tak, aby zawierać liczbę pełnych lat od roku 1952, to wartość epoki zegara sprzętowego w jądrze musi wynosić 1952.

Funkcja --setepoch wymaga używania opcji --epoch do podania roku. Przykładowo:

hwclock --setepoch --epoch=1952

Sterownik RTC stara się odgadnąć prawidłową wartość epoki, więc ustawianie jej może nie być konieczne.

Omawiana wartość epoki jest wykorzystywana, gdy hwclock odczytuje lub ustawia zegar sprzętowy na komputerze Alpha. Na komputerach ISA jądro stosuje stałą wartość epoki zegara sprzętowego, wynoszącą 1900.

--param-get=parametr; --param-set=parametr=wartość

Odczytuje i ustawia parametr zegara czasu rzeczywistego (RTC). Przydatne na przykład, do pobrania funkcji RTC lub ustawienia trybu przełączania RTC na zasilanie zapasowe.

Parametr jest albo numeryczną wartością parametru RTC (zob. plik include/uapi/linux/rtc.h jądra) albo aliasem. Opcja --help wyświetli listę prawidłowych aliasów. Parametr i wartość, jeśli są poprzedzone przedrostkiem 0x, są interpretowane jako liczby szesnastkowe, a w przeciwnym przypadku jako liczby dziesiętne.

--param-index numer

Wybiera wystąpienie tego samego parametru RTC, tyle że z indeksem numer. Domyślną wartością numeru jest 0.

--predict

Przewiduje wartość, jaką zegar sprzętowy wskaże w przyszłości, na podstawie czasu podanego opcją --date oraz informacji w /etc/adjtime. Przydatne na przykład do uwzględnienia dryfu zegara przy ustawianiu wybudzenia zegarem sprzętowym (alarmu). Zob. rtcwake(8).

Nie należy stosować tej funkcji, jeśli zegar sprzętowy jest modyfikowany przez cokolwiek poza poleceniem hwclock bieżącego systemu operacyjnego, na przykład przez "tryb 11-minutowy" lub ze względu na podwójny rozruch z innym systemem operacyjnym.

-r, --show; --get

Odczytuje zegar sprzętowy i wypisuje jego czas na standardowe wyjście w formacie ISO 8601. Pokazywany czas jest zawsze czasem lokalnym nawet, gdy utrzymuje się swój zegar sprzętowy w UTC. Zob. opcja --localtime.

Pokazywanie czasu zegara sprzętowego jest zachowaniem domyślnym, gdy nie poda się żadnej funkcji.

Funkcja --get do odczytywanego czasu stosuje również korektę ze względu na dryf zegara, na podstawie informacji w /etc/adjtime. Nie należy stosować tej funkcji, jeśli zegar sprzętowy jest modyfikowany przez cokolwiek poza poleceniem hwclock bieżącego systemu operacyjnego, na przykład przez "tryb 11-minutowy" lub ze względu na podwójny rozruch z innym systemem operacyjnym.

-s, --hctosys

Ustawia zegar systemowy z zegara sprzętowego. Czas odczytywany z zegara sprzętowego jest kompensowany ze względu na dryf systematyczny, przed zastosowaniem go do ustawienia zegara systemowego. Zob. opis w rozdziale Funkcja korekcji.

Zegar systemowy musi być utrzymywany w skali czasowej UTC, aby aplikacje związane z datą i czasem pracowały poprawnie razem ze strefą czasową skonfigurowaną w systemie. Jeśli czas zegara sprzętowego jest utrzymywany jako czas lokalny, to odczyt czasu z niego musi być przeniesiony do strefy czasowej UTC, przed użyciem go do ustawienia zegara systemowego. Funkcja --hctosys robi to na podstawie informacji z pliku /etc/adjtime oraz argumentów --localtime i --utc wiersza poleceń. Proszę zauważyć, że nie są stosowane poprawki ze względu na czas letni. Zob. poniżej rozdział Czas lokalny (LOCAL) czy UTC.

Jądro utrzymuje również wartość strefy czasowej, funkcja --hctosys ustawia ją na strefę czasową skonfigurowaną w systemie. Systemowa strefa czasowa jest konfigurowana przez zmienną środowiskową TZ lub plik /etc/localtime, w formie interpretowanej przez tzset(3). Przestarzałe pole tz_dsttime wartości strefy czasowej jądra jest ustawione na zero (szczegóły na temat znaczenia tego pola w przeszłości opisano w podręczniku settimeofday(2)).

Gdy zastosowana w skrypcie startowym, co czyni funkcję --hctosys pierwszym wywołującym settimeofday(2) przy rozruchu, ustawia skalę czasową "trybu 11-minutowego" NTP, za pomocą zmiennej jądra persistent_clock_is_local. Gdy zmienia się konfiguracja skali czasowej zegara sprzętowego, do poinformowania o tym jądra, konieczne jest ponowne uruchomienie komputera. Zob. opis w rozdziale Automatyczna synchronizacja zegara sprzętowego przez jądro poniżej.

Jest to prawidłowa funkcja do stosowania w jednym z systemowych skryptów startowych, przed zamontowaniem systemów plików do odczytu i zapisu.

Funkcji tej nie można używać w działającym systemie. Zmiana czasu systemowego spowoduje problemy, takie jak nieprawidłowe znaczniki czasu w systemie plików. Ponadto, jeśli coś zmieniło zegar sprzętowy np. "tryb 11-minutowy" NTP, --hctosys ustawi czas nieprawidłowo, poprzez niepotrzebne uwzględnienie korekty ze względu na dryf zegara.

Korektę ze względu na dryf zegara można powstrzymać, ustawiając czynnik korekty dryfu w /etc/adjtime na zero. Ustawienie to będzie trwałe do momentu, gdy nie użyje się opcji --update-drift wraz z --systohc przy wyłączeniu komputera (lub w innym momencie). Innym sposobem na powstrzymanie korekty jest użycie opcji --noadjfile przy wywoływaniu funkcji --hctosys. Trzecią metodą jest usunięcie pliku /etc/adjtime. Hwclock zastosuje wtedy domyślną skalę czasową UTC wobec zegara sprzętowego. Jeśli zegar sprzętowy działa w oparciu o czas lokalny, konieczne jest zdefiniowanie tego w ww. pliku. Można to zrobić wywołując hwclock --localtime --adjust; gdy wspomniany plik jest nieobecny, polecenie faktycznie nie dostosuje zegara, lecz utworzy plik z konfiguracją wskazującą na czas lokalny oraz czynnikiem korekty dryfu wynoszącym zero.

Przypadkiem, w którym wskazane może być powstrzymanie uwzględnianie korekcji dryfu programu hwclock, jest podwójny rozruch z innym systemem operacyjnym. Jeśli na przykład zatrzyma się tę instancję Linuksa, następnie inny system operacyjny zmieni wartość zegara sprzętowego, później uruchomi się ponownie tę instancję, to zastosowana korekta dryfu będzie nieprawidłowa.

Do prawidłowego stosowania korekty dryfu programu hwclock bezwzględnie konieczne jest, aby zegar sprzętowy nie ulegał zmianie, gdy dana instancja Linuksa nie jest uruchomiona.

--set

Ustawia zegar sprzętowy na czas podany opcją --date oraz aktualizuje znaczniki czasu w /etc/adjtime. Wraz z opcją --update-drift dokonuje także (re)kalkulacji czynnika korekty dryfu. Jeśli --set zawiedzie, proszę spróbować użyć go bez ww. opcji. Zob. --update-drift poniżej.

--systz

Jest to alternatywa wobec funkcji --hctosys, która nie odczytuje zegara sprzętowego ani nie ustawia zegara systemowego; zatem nie stosuje też żadnej korekty dryfu. Przeznaczona do stosowania w skryptach startowych w systemach z jądrami w wersji wyższej niż 2.6, gdy wiadomo, że zegar systemowy został ustawiony z zegara sprzętowego przez jądro, w trakcie rozruchu.

Wykonuje następujące czynności, opisane szczegółowo wyżej, przy funkcji --hctosys:

•Koryguje skalę czasową zegara systemowego na UTC, w razie takiej potrzeby. Z tą różnicą, że zamiast dokonywania tego przez zmianę zegara systemowego, hwclock jedynie informuje o tym jądro, które samo zajmuje się zmianą.
•Ustawia skalę czasową "trybu 11-minutowego" NTP jądra.
•Ustawia strefę czasową jądra.

Pierwsze dwie czynności są dostępne tylko w pierwszym wywołaniu do settimeofday(2), po rozruchu. Opcja ta ma zatem sens jedynie, gdy jest stosowana w skrypcie startowym. Gdy zmienia się konfiguracja skali czasowej zegara sprzętowego, do poinformowania o tym jądra, konieczne jest ponowne uruchomienie komputera.

-w, --systohc

Ustawia zegar sprzętowy z zegara systemowego oraz aktualizuje znaczniki czasu w /etc/adjtime. Wraz z opcją --update-drift dokonuje także (ponownego) przeliczenia czynnika korekty dryfu. Jeśli --systohc zawiedzie, proszę spróbować użyć go bez ww. opcji. Zob. --update-drift poniżej.

--vl-read, --vl-clear

Niektóre urządzenia zegara czasu rzeczywistego (RTC) mogą monitorować napięcie baterii, pozwalając użytkownikowi na sprawdzenie, czy nie należy jej wymienić. Funkcja --vl-read pobiera informację o niskim napięciu i dekoduje wynik do czytelnej postaci. Funkcja --vl-clear resetuje informację o niskim napięciu, co jest konieczne w niektórych urządzeniach RTC po wymianie baterii.

W pliku include/uapi/linux/rtc.h jądra można sprawdzić, które informacje mogą być zwrócone. Proszę zauważyć, że nie wszystkie urządzenia RTC mają opisywaną możliwość monitorowania, ani nie wszystkie sterowniki muszą obsługiwać jej odczytywanie.

-h, --help

Wyświetla ten tekst i wychodzi.

-V, --version

Wyświetla wersję i wychodzi.

--adjfile=nazwa-pliku

Przesłania domyślną ścieżkę pliku /etc/adjtime.

--date=łańcuch-daty

Opcja musi być stosowana z funkcjami --set lub --predict, w innym przypadku jest ignorowana.

hwclock --set --date='16:45'

hwclock --predict --date='2525-08-14 07:11:05'

Argument musi być podany w czasie lokalnym, nawet jeśli utrzymuje się swój zegar sprzętowy w UTC. Zob. opcja --localtime. Z tego względu, argument nie powinien zawierać informacji o strefie czasowej. Czasu nie powinno się też podawać jako czas względny typu "+5 minutes", ponieważ precyzja hwclock zależy od korelacji pomiędzy wartością argumentu i momentu wciśnięcia klawisza enter. Ułamkowe wartości sekundy są po cichu pomijane. Opcja przyjmuje wiele formatów daty i czasu, ale ww. parametry są dobrym przykładem.

--delay=sekundy

Opcja przesłania domyślne opóźnienie stosowane przy ustawianiu czasu zegara. Domyślnie wynosi 0.5 (500 ms) w przypadku rtc_cmos; przy innych typach zegarów czasu rzeczywistego (RTC) opóźnienie wynosi 0. Jeśli nie da się określić typu RTC (na podstawie sysfs), to opóźnienie domyślnie wynosi również 0.5, ze względu na kompatybilność wsteczną.

Wartość domyślną 500 ms wybrano ze względu na często stosowany zegar sprzętowy kompatybilny z MC146818A (na x86). Ten zegar sprzętowy można ustawić jedynie na wartość całkowitą plus pół sekundy. Wartość całkowita jest wymagana ze względu na brak interfejsu do pobrania lub ustawienia części sekundy po przecinku. Dodatkowe pół sekundy wynika ze sposobu aktualizacji zegara sprzętowego, która zachodzi do następnej sekundy, dokładnie 500 ms po ustawieniu nowego czasu. Niestety zachowanie to zależy od sprzętu i w niektórym przypadkach wymagane jest inne opóźnienie.

-D, --debug

Proszę stosować --verbose. Opcja --debug jest przestarzała i może być wykorzystana w inny sposób albo usunięta w kolejnym wydaniu.

--directisa

Opcja ma znaczenie w przypadku komputerów kompatybilnych z ISA z rodziny x86 i x86_64. Nie odnosi skutku na innych komputerach. Opcja nakazuje hwclock stosowanie bezpośrednich instrukcji wejścia/wyjścia w celu dostępu do zegara sprzętowego. Bez tej opcji, hwclock użyje pliku urządzenia rtc przyjmując, że zastosuje go linuksowy sterownik urządzenia RTC. Wedle stanu na v2.26, program nie będzie już automatycznie stosował directisa, gdy sterownik rtc jest niedostępny; powodowało to niebezpieczną sytuację, pozwalającą na równoczesny dostęp do zegara sprzętowego przez dwa procesy. Bezpośredni dostęp sprzętowy z przestrzeni użytkownika powinno się stosować tylko do testowania, diagnozowania problemów oraz jako ostateczność, gdy wszystkie inne sposoby zawiodą. Zob. opcja --rtc.

--epoch=rok

Opcja wymagana przy stosowaniu funkcji --setepoch. Minimalną wartością roku jest 1900. Maksymalna zależy od systemu (ULONG_MAX - 1).

-f, --rtc=nazwa-pliku

Przesłania domyślną nazwę pliku urządzenia rtc hwclock. W innym przypadku użyje pierwszego odnalezionego, w tej kolejności: /dev/rtc, /dev/rtc0, /dev/misc/rtc. W przypadku IA-64: /dev/efirtc /dev/misc/efirtc

-l, --localtime; -u, --utc

Wskazuje skalę czasową, na którą ustawiony jest zegar sprzętowy.

Zegar sprzętowy można skonfigurować do stosowania skali czasowej UTC lub lokalnej, jednak nic w samym zegarze nie wskazuje, na którą skalę go ustawiono. Opcja --localtime lub --utc przekazuje tę informację poleceniu hwclock. Jeśli poda się nieprawidłową skalę (lub nie poda żadnej, powodując wybór nieprawidłowej wartości domyślnej) zarówno ustawianie jak i odczyt z zegara sprzętowego będą nieprawidłowe.

Jeśli nie poda się --utc ani --localtime , to stosowana będzie ostatnia podana przy funkcji ustawiającej czas (--set, --systohc lub --adjust), tak jak zapisano ją w /etc/adjtime. Jeśli plik adjtime nie istnieje, domyślnie stosowane jest UTC.

Uwaga: zmiany czasu letniego mogą być niespójne, gdy zegar sprzętowy utrzymywany jest według czasu lokalnego. Zob. opis w rozdziale Czas lokalny (LOCAL) czy UTC poniżej.

--noadjfile

Wyłącza funkcje zapewniane przez /etc/adjtime. Po podaniu tej opcji, hwclock nie odczytuje ani nie zapisuje do tego pliku. Przy stosowaniu tej opcji konieczne jest podanie --utc albo --localtime.

--test

Nie dokonuje faktycznych zmian w systemie tj. zmian zegarów lub /etc/adjtime (przy tej opcji włączone jest też --verbose).

--update-drift

Aktualizuje czynnik korekty dryfu zegara sprzętowego w /etc/adjtime. Opcję można stosować tylko łącznie z --set lub --systohc.

Pomiędzy aktualizacjami wymagane jest zachowanie co najmniej czterech godzin odstępu. Ma to na celu uniknięcie nieprawidłowych obliczeń. Im dłuższy okres odstępu, tym dokładniejszy będzie obliczony czynnik korekty.

Opcję dodano w v2.26, ponieważ systemy typowo wywołują hwclock --systohc przy wyłączaniu; przy stosowaniu starego zachowania powodowałoby to automatycznie (ponowne) przeliczenie czynnika korekty dryfu, co skutkowałoby wieloma problemami:

•Przy używaniu NTP z trybem "11-minutowym jądra", czynnik korekty dryfu zostałby niemal wyzerowany.
•Niemożliwa byłaby korekta "zimnego" dryfu. W większości konfiguracji odnoszenie się do "zimnego" dryfu daje lepsze wyniki. Przez "zimno" rozumiemy tu sytuację, gdy komputer jest wyłączany, co ma znaczący wpływ na czynnik korekty dryfu.
•(Ponowne) obliczanie czynnika korekty dryfu przy każdym wyłączaniu daje nieoptymalne wyniki. Na przykład, gdy chwilowe warunki powodują nietypowe nagrzanie komputera, obliczony czynnik korekty będzie przeszacowany.
•Znacząco wydłużałoby to czas wyłączenia systemu (według stanu na v2.31, jeśli nie stosuje się --update-drift, zegar czasu rzeczywistego nie jest odczytywany).

Obliczenie przez hwclock czynnika korekty dryfu jest dobre na początek, ale do uzyskania optymalnych wyników konieczne byłoby prawdopodobnie dostosowanie przez bezpośrednią edycję pliku /etc/adjtime. W przypadku większości konfiguracji, po tym jak obliczony zostanie optymalny czynnik korekty dryfu, nie powinno być potrzeby zmieniania go. Dlatego stare podejście, automatycznie (ponownie) obliczające dryf uległo zmianie i obecnie wymaga podania tej opcji, aby je zastosować. Zob. opis w rozdziale Funkcja korekty.
Niniejsza opcja wymaga odczytu zegara sprzętowego przed ustawieniem go. Jeśli nie da się go odczytać, opcja spowoduje niepowodzenie funkcji ustawienia. Może się tak stać np. gdy zawartość zegara sprzętowego zostanie uszkodzona przez awarię zasilania. W takim przypadku, konieczne jest uprzednie ustawienie zegara bez tej opcji. Pomimo braku działania, wynikowy czynnik korekty dryfu i tak byłby nieprawidłowy.

-v, --verbose

Wyświetla więcej szczegółów o wewnętrznym działaniu hwclock.

Istnieją dwa typy zegarów daty i czasu:

Zegar sprzętowy: zegar będący niezależnym urządzeniem sprzętowym, ze swoim własnym zasilaniem (baterią, kondensatorem itp.), który działa gdy komputer jest wyłączony, a nawet gdy jest odłączony od zasilania.

W przypadku systemów kompatybilnych z ISA, zegar jest częścią standardu ISA. Program kontrolujący może go odczytać lub ustawić jedynie do pełnej sekundy, ale może wykryć moment przeskoczenia sekundy, więc zegar ten ma praktycznie nieskończoną precyzję.

Zegar ten jest często nazywany: zegarem sprzętowym, zegarem czasu rzeczywistego, RTC (od ang. "real time clock"), zegarem BIOS lub zegarem CMOS. Jądro Linux nazywa go też zegarem trwałym ("persistent clock").

Niektóre systemy inne niż ISA mogą mieć kilka zegarów czasu rzeczywistego, z których tylko jeden ma własne zasilanie. Zewnętrzne układy zegara I2C lub SPI o bardzo niewielkim poborze prądu mogą być stosowane wraz ze swą baterią jako zegar sprzętowy do inicjowania funkcjonalniejszego, wbudowanego zegara czasu rzeczywistego, służącego większości innych celów.

Zegar systemowy: zegar będący częścią jądra Linux, sterowany przerwaniem czasomierza (na komputerze ISA, przerwanie czasomierza jest częścią standardu ISA). Ma znaczenie tylko w trakcie działania systemu Linux na komputerze. Czas systemowy jest liczbą sekund od 00:00:00 1 stycznia 1970 UTC (zwięźlej: liczba sekund od 1969 UTC). Czas systemowy nie jest jednak liczbą całkowitą. Ma praktycznie nieskończoną precyzję.

To czas systemowy jest czasem istotnym. Podstawowym przeznaczeniem zegara sprzętowego jest utrzymywanie czasu, gdy nie działa Linux, dzięki czemu przy rozruchu można z niego zainicjować zegar systemowy. Proszę zauważyć, że w DOS-ie, dla którego zaprojektowano standard ISA, zegar sprzętowy był jedynym zegarem czasu rzeczywistego.

Ważne jest, aby czas systemowy nie miał luk, które mogłyby nastąpić po ustawieniu go w trakcie działania systemu za pomocą programu date(1). W trakcie działania systemu, można jednak zrobić co tylko się chce z zegarem sprzętowym, a przy następnym uruchomieniu Linuksa, system włączy się z czasem dostosowanym z zegara sprzętowego. Uwaga: obecnie nie jest to możliwe na większości systemów, ze względu na wywoływanie hwclock --systohc przy zamykaniu systemu.

Strefa czasowa jądra Linux jest ustawiana przez hwclock. Nie należy jednać dać się zwieść - niemal nic nie zwraca uwagi na strefę czasową jądra. Programy, które wymagają wiedzy o strefie czasowej (może np. chcą wyświetlić czas lokalny użytkownikowi) niemal zawsze korzystają z tradycyjniejszej metody określenia strefy czasowej: używają zmiennej środowiskowej TZ lub pliku /etc/localtime, zgodnie z wytłumaczeniem w podręczniku systemowym tzset(3). Jednakże niektóre programy i peryferyjne części jądra Linux, takie jak systemy plików, mimo to korzystają z wartości strefy czasowej jądra. Przykładem jest system plików vfat. Jeśli wartość strefy czasowej jądra jest nieprawidłowa, system plików vfat zgłosi i ustawi nieprawidłowe znaczniki czasu w plikach. Innym przykładem jest "tryb 11-minutowy" NTP jądra. Jeśli wartość strefy czasowej jądra i/lub zmienna persistent_clock_is_local są nieprawidłowe, zegar sprzętowy zostanie ustawiony nieprawidłowo przez "tryb 11-minutowy". Zob. opis w rozdziale Automatyczna synchronizacja zegara sprzętowego przez jądro poniżej.

hwclock ustawi wartość strefy czasowej jądra wskazaną przez TZ lub /etc/localtime przy użyciu opcji --hctosys lub --systz.

Wartość strefy czasowej jądra składa się tak naprawdę z dwóch części: 1) pola tz_minuteswest wskazującego o jak wiele minut czasu lokalnego (bez uwzględnienia czasu letniego) czas lokalny jest późniejszy od czasu UTC oraz 2) pola tz_dsttime wskazującego stosowany obecnie, lokalnie typ konwencji czasu letniego (DST). To drugie pole nie jest stosowane w Linuksie i zawsze wynosi zero. Zob. też settimeofday(2).

hwclock stosuje różne metody pobierania i ustawiania wartości zegara sprzętowego. Najzwyklejszą jest wykonanie wejścia/wyjścia do pliku specjalnego urządzenia rtc, który powinien być sterowany przez sterownik urządzenia rtc. Ponadto systemy linuksowe korzystające ze szkieletu rtc z udev, mogą obsługiwać wiele zegarów sprzętowych. Może to spowodować konieczność przesłonięcia domyślnego urządzenia rtc, podając inne opcją --rtc.

Ta metoda nie jest jednak zawsze dostępna, ponieważ starsze systemy nie posiadają sterownika rtc. Na tych systemach metoda dostępu do zegara sprzętowego zależy od sprzętu systemowego.

W systemach kompatybilnych z ISA, hwclock może uzyskać bezpośredni dostęp do rejestrów "pamięci CMOS" składających się na zegar, dokonując wejścia/wyjścia na portach 0x70 i 0x71. Dokonuje tego za pomocą faktycznych instrukcji wejścia/wyjścia, zatem wymaga efektywnego identyfikatora superużytkownika. Metodę tę można zastosować podając opcję --directisa.

Jest to kiepski sposób na dostęp do zegara, z tych wszystkich powodów, dla których programy z przestrzeni użytkownika nie są generalnie dopuszczane do wykonywania bezpośredniego wejścia/wyjścia i wyłączania przerwań. hwclock udostępnia go do testowania, rozwiązywania problemów oraz ponieważ może być to jedyna metoda dostępna na systemach ISA nieposiadających działającego sterownika urządzenia rtc.

Zegar sprzętowy nie jest zwykle zbyt dokładny. Jednak wiele z tej niedokładności jest całkowicie przewidywalna - zyskuje on lub traci tę samą liczbę sekund każdego dnia. Nazywa się to dryfem systematycznym. Funkcja --adjust programu hwclock pozwala stosować korekcje dryfu systematycznego do zegara sprzętowego.

Działa to tak: hwclock utrzymuje plik, /etc/adjtime, zawierający pewne informacje historyczne. Jest on nazywany plikiem adjtime.

Załóżmy, że zaczynamy bez pliku adjtime. Wydajemy polecenie hwclock --set, aby ustawić zegar sprzętowy na faktyczny czas aktualny. hwclock tworzy plik adjtime zapisując w nim czas bieżący, jako ostatni moment kalibracji zegara. Pięć dni później, zegar zyskał 10 sekund, więc wydajemy polecenie hwclock --set --update-drift, aby ustawić go na 10 sekund wstecz. hwclock aktualizuje plik adjtime, wskazując czas bieżący, jako ostatni moment kalibracji zegara i zapisując 2 sekundy na dzień jako dryf systematyczny zegara. Po 24 godzinach wydajemy polecenie hwclock --adjust. hwclock sprawdza plik adjtime i widzi, że zegar zyskuje 2 sekundy na dzień, przy braku korekty oraz że nie był korygowany dokładnie przez dzień. Odejmuje zatem 2 sekundy od zegara sprzętowego. Następnie zapisuje czas bieżący, jako ostatni moment kalibracji zegara. Po kolejnych 24 wydajemy kolejne polecenie hwclock --adjust. hwclock robi to samo: odejmuje 2 sekundy i aktualizuje plik adjtime czasem bieżącym, jako ostatnim momentem kalibracji zegara.

Po zastosowaniu opcji --update-drift wraz z --set lub --systohc, dryf systematyczny jest (ponownie) obliczany poprzez porównanie w pełni wyrównanego pod kątem dryfu czasu zegara sprzętowego oraz nowo ustawianego czasu, z czego wywodzony jest dryf 24-godzinny, w oparciu o znacznik czasowy ostatniej kalibracji w pliku adjtime. Ten zaktualizowany czynnik korekty dryfu jest następnie zapisywany w /etc/adjtime.

Ustawianie zegara sprzętowego jest obarczone niewielkim błędem, więc --adjust nie dokonuje poprawek, które są mniejsze od 1 sekundy. Później, gdy zażąda się ponownego wprowadzenia poprawki, a nagromadzony dryf osiągnie ponad 1 sekundę, --adjust dokona korekty uwzględniającej również wartości sekundy po przecinku.

hwclock --hctosys również stosuje plik danych adjtime do skompensowania wartości odczytanej z zegara sprzętowego, przed zastosowaniem jej do ustawienia zegara systemowego. Nie posiada 1-sekundowego ograniczenia --adjust i od razu skoryguje wartości dryfu poniżej jednej sekundy. Nie zmienia czasu zegara sprzętowego ani pliku adjtime. Może to wyeliminować potrzebę stosowania --adjust, chyba że inny element w systemie wymaga kompensacji zegara sprzętowego.

Choć ze względów historycznych nazwa pliku wskazuje jedynie na kontrolę stosowanych poprawek czasu, plik zawiera również inne informacje używane przez hwclock pomiędzy wywołaniami programu.

Zawartość pliku adjtime, w ASCII, jest następująca:

Wiersz 1: Trzy liczby oddzielone odstępami: 1) dryf systematyczny w sekundach na dzień, dziesiętna liczba zmiennoprzecinkowa; 2) Wynikowa liczba sekund od 1969 UTC ostatniej korekty lub kalibracji, dziesiętna liczba całkowita; 3) zero (ze względu na kompatybilność z clock(8)) jako dziesiętna liczba zmiennoprzecinkowa.

Wiersz 2: Jedna liczba: wynikowa liczba sekund od 1969 UTC ostatniej kalibracji. Zero, jeśli nie zaszła jeszcze kalibracja, albo wiadomo, że poprzednia kalibracja jest nieprzydatna (na przykład, ponieważ od czasu tamtej kalibracji jest jasne, że zegar sprzętowy nie zawiera prawidłowego czasu). Dziesiętna liczba całkowita.

Wiersz 3: "UTC" lub "LOCAL". Wskazuje, czy zegar sprzętowy jest ustawiony na czas uniwersalny (Coordinated Universal Time) czy lokalny. Wartość tę można zawsze przesłonić opcjami wiersza poleceń hwclock.

Plik adjtime używany wcześniej przez clock(8) można stosować z programem hwclock.

Trzeba wiedzieć, że istnieje inny sposób synchronizacji zegara sprzętowego stosowany w niektórych systemach. Jądro Linux posiada tryb, w którym kopiuje czas systemowy do zegara sprzętowego co 11 minut. Tryb ten jest opcją z czasu kompilacji, więc nie wszystkie jądra posiadają tę możliwość. Jest to dobry sposób stosowany, gdy zegar systemowy jest synchronizowany przez zaawansowany mechanizm, taki jak NTP (NTP to sposób synchronizacji czasu systemowego poprzez sieciowy serwer czasu lub zegar radiowy podłączony do systemu. Zob. RFC 1305).

Jeśli jądro skompilowano z opcją "trybu 11-minutowego", to będzie on aktywny gdy dyscyplina zegara jądra jest w stanie zsynchronizowanym. Wówczas bit 6 (bit ustawiany maską 0x0040) zmiennej jądra time_status jest usuwany. Ta wartość jest widoczna jako wiersz "statusu" poleceń adjtimex --print lub ntptime.

Do uzyskania stanu synchronizacji dyscypliny zegara jądra, a więc włączenia "trybu 11-minutowego" wymagany jest wpływ zewnętrzny, taki jak demon NTP. Jego wyłączenie nastąpi poprzez uruchomienie czegokolwiek ustawiającego zegar systemowy w sposób tradycyjny, w tym hwclock --hctosys. Jednak jeśli demon NTP wciąż działa, włączy on "tryb 11-minutowy" przy następnej synchronizacji zegara systemowego.

Gdy dany system działa z włączonym "trybem 11-minutowym", może zajść potrzeba umieszczenia --hctosys lub --systz w skrypcie startowym, szczególnie jeśli zegar sprzętowy skonfigurowano do działania w lokalnej skali czasowej. O ile jądro nie zostanie poinformowane o stosowanej skali czasowej zegara sprzętowego, może go zaśmiecić nieprawidłową. Jądro domyślnie stosuje UTC.

Aplikowane jest pierwsze polecenie z przestrzeni użytkownika informujące jądro o stosowanej skali czasowej zegara sprzętowego. Dzieje się to poprzez zmienną jądra persistent_clock_is_local. Jeśli --hctosys lub --systz będą pierwsze, ustawią tę zmienną zgodnie z plikiem adjtime lub odpowiednim argumentem z wiersza poleceń. Proszę zauważyć, że gdy przy stosowaniu tej funkcji skala czasowa zegara sprzętowego ulegnie zmianie, do poinformowania o tym jądra konieczne jest ponowne uruchomienie komputera.

W "trybie 11-minutowym" NTP nie należy stosować hwclock --adjust.

Istnieje pewnego typu standard, definiujący bajt 50 pamięci CMOS na komputerze ISA jako wskazujący na stulecie. hwclock nie stosuje, ani nie ustawia tego bajtu, ponieważ niektóre komputery nie definiują go w ten sposób, a nie jest to tak naprawdę konieczne, jako że same lata stulecia powinny wystarczyć do określenia bieżącego stulecia.

Jeśli istnieje dobre zastosowanie bajtu stulecia CMOS, opiekun hwclock prosi o kontakt; wówczas może pojawić się odpowiednia opcja.

Proszę zauważyć, że ten rozdział ma znaczenie tylko przy metodzie bezpośredniego dostępu do zegara sprzętowego przez ISA ("direct ISA"). ACPI zapewnia standardowy sposób na dostęp do wartości stulecia, gdy jest to obsługiwane przez sprzęt.

Niniejszy opis ma zastosowanie przy spełnieniu następujących warunków:

•Nie działa nic, co zmieniałoby zegary daty i czasu, takiego jak demon NTP lub zadanie crona.
•Systemową strefę czasową skonfigurowano pod czas lokalny. Zob. niżej rozdział POSIX czy "poprawność".
•Podczas wczesnego rozruchu wywoływane są, w tej kolejności: adjtimex --tick wartość --frequency wartość hwclock --hctosys
•Podczas zamykania systemu wywoływane jest: hwclock --systohc
•Systemy bez adjtimex mogą stosować ntptime.

Niezależnie od tego, czy zapewniany jest dokładny czas dzięki demonowi NTP, sensowne jest, aby sam system utrzymywał w miarę dokładny czas wraz z datą.

Pierwszym krokiem jest zrozumienie całości zagadnienia. Istnieją dwa zupełnie oddzielne urządzenia sprzętowe działające w swoim własnym tempie i dryfujące od "prawidłowego" czasu w różny sposób. Metody oraz oprogramowanie do korekty dryfu są oddzielnego do każdego z nich. Jednak większość systemów jest skonfigurowana tak, aby wymieniać wartości pomiędzy tymi dwoma zegarami przy uruchamianiu i zamykaniu systemu. W ten sposób odchyłki czasowe każdego urządzenia są transferowane tam i z powrotem pomiędzy nimi. Jeśli spróbuje się skonfigurować korekcję dryfu tylko jednego z zegarów, dryf drugiego zostanie naddany na drugi.

Problemu przy konfiguracji korekty dryfu zegara systemowego można uniknąć po prostu nie wyłączając komputera. To oraz fakt że cała precyzja hwclock (w tym obliczanie czynników korekty dryfu) opiera się na poprawności chodu zegara systemowego, oznacza że najpierw należy skonfigurować zegar systemowy.

Dryf zegara systemowego koryguje się opcjami --tick i --frequency polecenia adjtimex(8). Opcje te działają łącznie: tick jest zgrubną korektą, a frequency zapewnia dokładne dopasowanie (systemy nieposiadające pakietu adjtimex mogą w zamian stosować ntptime -f cz-na-mln).

Niektóre dystrybucje Linuksa próbują automatycznie obliczyć dryf zegara systemowego stosując operację compare (porównania) adjtimex. Próba korekty jednego dryfującego zegara, korzystając z drugiego dryfującego zegara jako punktu odniesienia, przypomina psa próbującego złapać swój ogon. Może się co prawda skończyć sukcesem, ale będzie to poprzedzone dużym nakładem pracy i wieloma frustracjami. Taka automatyzacja może dać pewną poprawę względem braku konfiguracji, lecz nie należy spodziewać się optymalnych wyników. Lepszym sposobem ręcznej konfiguracji byłaby opcja --log programu adjtimex.

Bardziej efektywne może być proste śledzenie dryfu zegara systemowego za pomocą sntp lub date -Ins i precyzyjnego zegarka, a następnie ręczne obliczenie poprawki.

Po ustawieniu wartości tick i frequency, należy testować i poprawiać korekty, do momentu osiągnięcia dobrego chodu zegara systemowego. Więcej informacji i przykładów ilustrujących ręczne obliczanie dryfu znajduje się w podręczniku adjtimex(2).

Po poprawnym skonfigurowania zegara systemowego należy przejść do zegara sprzętowego.

Jako reguła, zimny dryf będzie zwykle działał najlepiej. Powinno mieć to do zastosowanie w przypadku komputerów działających 24/7, których czas wyłączenia zwykle ogranicza się do ponownego uruchomienia komputera. W takim przypadku czynnik korekty dryfu nie robi dużej różnicy. Jednak w rzadkich sytuacjach, gdy taki komputer jest wyłączany na dłuższy czas, zimny dryf powinien dać lepsze efekty.

Kroki służące do obliczenia zimnego dryfu:

1

Upewnienie się, że demon NTP nie będzie uruchamiany przy rozruchu komputera.

2

Czas zegara systemowego musi być prawidłowy przy wyłączeniu!

3

Wyłączenie systemu.

4

Odczekanie dłuższego czasu bez zmieniania zegara sprzętowego.

5

Uruchomienie systemu.

6

Natychmiastowe zastosowanie hwclock do ustawienia prawidłowego czasu, z dodaniem opcji --update-drift.

Uwaga: jeśli krok 6 używa --systohc, to tuż wcześniej konieczne jest ustawienie prawidłowego czasu zegara systemowego (krok 6a).

Kalkulacja czynnika korekty dryfu przez hwclock jest zwykle dobrym początkiem, lecz uzyskanie optymalnych wyników zwykle będzie wymagało dostosowania, przez bezpośrednią edycję pliku /etc/adjtime. Należy kontynuować sprawdzanie i poprawianie czynnika korekty do momentu, gdy zegar sprzętowy będzie poprawnie skorygowany przy uruchomienia komputera. Aby to sprawdzić, należy najpierw upewnić się, że czas systemowy jest poprawny przed wyłączeniem, a następnie użyć sntp lub date -Ins wraz z precyzyjnym zegarkiem, natychmiast po rozruchu.

Utrzymywanie zegara sprzętowego w lokalnej skali czasu powoduje niespójności związane z czasem letnim:

•Jeśli Linux działa w trakcie zmiany czasu letniego, czas zapisany do zegara sprzętowego będzie uwzględniał tę zmianę.
•Jeśli Linux NIE działa w trakcie zmiany czasu letniego, czas odczytany z zegara sprzętowego nie będzie uwzględniał tej zmiany.

Zegar sprzętowy w systemach kompatybilnych z ISA utrzymuje jedynie datę i czas, nie posiada pojęcia strefy czasowej ani czasu letniego. Z tego względu, gdy przekaże się hwclock, że działa on w czasie lokalnym, przyjmuje że jest to "poprawny" czas lokalny i nie stosuje dostosowań wobec odczytywanego z niego czasu.

Linux obsługuje zmiany czasu letniego w sposób przezroczysty tylko, gdy zegar sprzętowy jest utrzymywany w skali czasowej UTC. Jest to łatwe dla administratorów systemu, ponieważ hwclock i tak używa czasu lokalnego w swoim wyjściu oraz jako argumentu do opcji --date.

Systemy POSIX, takie jak Linux, zaprojektowano do działania z zegarem sprzętowym utrzymywanym w skali czasowej UTC. Celem zegara sprzętowego jest inicjowanie zegara systemowego, więc utrzymywanie tego pierwszego w UTC ma sens.

Linux stara się jednak radzić sobie z sytuacją, gdy zegar sprzętowy jest utrzymywany w lokalnej skali czasowej. Taki przypadek występuje głównie przy równoległym rozruchu ze starszymi wersjami MS Windows. Od Windowsa 7, klucz rejestru RealTimeIsUniversal ma działać prawidłowo, dzięki czemu zegar sprzętowy może być utrzymywany w UTC.

Dyskusja o konfiguracji daty i czasu byłaby niekompletna bez wspomnienia o strefach czasowych, opisanych głównie w podręczniku tzset(3). Obszarem, który wygląda na nieudokumentowany jest "poprawny" katalog bazy danych stref czasowych, czasem zwany tz lub zoneinfo.

Występują dwie oddzielne bazy danych w systemie zoneinfo: posix i "poprawna". "Poprawna" ("right", obecnie nazywana zoneinfo-leaps) uwzględnia sekundy przestępne, natomiast baza posix - nie. Aby używać "poprawnej" bazy danych, zegar systemowy musi być ustawiony na (UTC + sekundy przestępne), co jest odpowiednikiem (TAI - 10). Pozwala to na obliczanie dokładnej liczby sekund pomiędzy dwoma datami, które przechodzą przez epokę sekundy przestępnej. Zegar systemowy jest następnie konwertowany na prawidłowy czas cywilny, w tym UTC, poprzez stosowanie "poprawnych" plików stref czasowych, odejmując sekundy przestępne. Uwaga: ta konfiguracja jest uważana za eksperymentalną i znane są pewne problemy.

Do skonfigurowania systemu w celu stosowania wybranej bazy danych, wszystkie pliki zlokalizowane z jej katalogu należy skopiować do katalogu /usr/share/zoneinfo. Pliki nie są nigdy stosowane bezpośrednio z podkatalogów posix lub "right" np. TZ='right/Europe/Dublin'. Było to niegdyś tak często praktykowane, że projekt macierzysty przebudował systemowe drzewo plików, przesuwając podkatalogi posix i "right" poza katalog zoneinfo, do katalogów równoległych:

/usr/share/zoneinfo, /usr/share/zoneinfo-posix, /usr/share/zoneinfo-leaps

Niestety, niektóre dystrybucje Linuksa stosują na nowo stary układ plików w swych pakietach. Problem administratorów systemu w sięganiu do "poprawnego" podkatalogu wciąż zatem istnieje. W ten sposób systemowa strefa czasowa jest konfigurowana z uwzględnieniem sekund przestępnych, podczas gdy baza danych zoneinfo wciąż je wyłącza. Następnie gdy zegar światowy potrzebuje pliku strefy czasowej South_Pole albo agent poczty elektronicznej lub hwclock wymaga pliku strefy czasowej UTC, pobierają ją z katalogu /usr/share/zoneinfo , tak jak powinno się to odbywać. Pliki te jednak nie uwzględniają sekund przestępnych, ale zegar systemowy je uwzględnia, co powoduje nieprawidłowe przeliczanie czasu.

Próba mieszania i dopasowywania plików z tych oddzielnych baz danych nie powiedzie się, ponieważ każda wymaga, aby zegar systemowy korzystał z odmiennej skali czasowej. Baza danych zoneinfo musi być skonfigurowana, aby korzystać albo z bazy posix albo z "poprawnej" bazy, zgodnie z powyższym opisem, albo poprzez przypisanie ścieżki do bazy danych do zmiennej środowiskowej TZDIR.

Zwrócona będzie jedna z następujących wartości zakończenia:

EXIT_SUCCESS ('0' w systemach POSIX)

Poprawne wykonanie programu.

EXIT_FAILURE ('1' w systemach POSIX)

Operacja nie powiodła się lub składnia polecenia była nieprawidłowa.

ŚRODOWISKO

TZ

Jeśli zmienna jest ustawiona, jej wartość ma pierwszeństwo nad strefą czasową skonfigurowaną systemowo.

TZDIR

Jeśli zmienna jest ustawiona, jej wartość ma pierwszeństwo nad ścieżką do katalogu bazy danych stref czasowych skonfigurowanego systemowego.

/etc/adjtime

Konfiguracja i plik stanu hwclock. Zob. też adjtime_config(5).

/etc/localtime

Systemowy plik strefy czasowej.

/usr/share/zoneinfo/

Systemowy katalog bazy danych stref czasowych.

Pliki urządzeń, które hwclock może wypróbować w celu uzyskania dostępu do zegara sprzętowego: /dev/rtc /dev/rtc0 /dev/misc/rtc /dev/efirtc /dev/misc/efirtc

date(1), adjtime_config(5), adjtimex(8), gettimeofday(2), settimeofday(2), crontab(1p), tzset(3)

Napisane przez Bryana Hendersona <bryanh@giraffe-data.com> we wrześniu 1996 r. na podstawie programu clock(8) autorstwa Charlesa Hedricka, Roba Hoofta i Haralda Koeniga. Pełna historia i autorstwo są widoczne w kodzie źródłowym.

Problemy należy zgłaszać w systemie śledzenia błędów https://github.com/util-linux/util-linux/issues.

Polecenie hwclock jest częścią pakietu util-linux, który można pobrać ze strony Archiwum jądra Linux https://www.kernel.org/pub/linux/utils/util-linux/.

2026-09-02 util-linux 2.42.3