HWCLOCK(8) Administracja systemem HWCLOCK(8) NAZWA hwclock - narzedzie do obslugi zegarow SKLADNIA hwclock [funkcja] [opcja...] OPIS hwclock jest narzedziem administracyjnym do obslugi zegarow. Moze: wyswietlac czas zegara sprzetowego; ustawiac zegar sprzetowy na okreslony czas; ustawiac zegar sprzetowy z zegara systemowego; ustawiac zegar systemowy z zegara sprzetowego; kompensowac dryf zegara sprzetowego; korygowac skale czasu zegara systemowego; ustawiac: strefe czasowa jadra, skale czasowa NTP i epoke (tylko na Alpha); przewidywac przyszle wartosci zegara sprzetowego na podstawie jego poziomu dryfu. Od v2.26 dokonano istotnych zmian w funkcji --hctosys i opcji --directisa, a takze dodano nowa opcje --update-drift. Zob. opisy odpowiednich opcji ponizej. FUNKCJE Ponizsze funkcje wzajemnie sie wykluczaja; jednoczesnie mozna podac tylko jedna z nich. Jesli nie poda sie funkcji, domyslna bedzie --show. -a, --adjust Dodaje lub odejmuje czas z zegara sprzetowego, aby uwzglednic systematyczny dryf zegara od momentu jego ostatniego ustawienia lub skorygowania. Zob. ponizej rozdzial Funkcja korekcji. --getepoch; --setepoch Funkcje przeznaczone tylko do komputerow Alpha, dostepne wylacznie poprzez sterownik czasu rzeczywistego (RTC) jadra Linux. Sluza do odczytu i ustawienia w jadrze wartosci epoki zegara sprzetowego. Epoka jest liczba lat od poczatku naszej ery, do ktorej odnosi sie wartosc zera lat w zegarze sprzetowym. Przykladowo, jesli licznik lat w BIOS-ie komputera jest ustawiony tak, aby zawierac liczbe pelnych lat od roku 1952, to wartosc epoki zegara sprzetowego w jadrze musi wynosic 1952. Funkcja --setepoch wymaga uzywania opcji --epoch do podania roku. Przykladowo: hwclock --setepoch --epoch=1952 Sterownik RTC stara sie odgadnac prawidlowa wartosc epoki, wiec ustawianie jej moze nie byc konieczne. Omawiana wartosc epoki jest wykorzystywana, gdy hwclock odczytuje lub ustawia zegar sprzetowy na komputerze Alpha. Na komputerach ISA jadro stosuje stala wartosc epoki zegara sprzetowego, wynoszaca 1900. --param-get=parametr; --param-set=parametr=wartosc Odczytuje i ustawia parametr zegara czasu rzeczywistego (RTC). Przydatne na przyklad, do pobrania funkcji RTC lub ustawienia trybu przelaczania RTC na zasilanie zapasowe. Parametr jest albo numeryczna wartoscia parametru RTC (zob. plik include/uapi/linux/rtc.h jadra) albo aliasem. Opcja --help wyswietli liste prawidlowych aliasow. Parametr i wartosc, jesli sa poprzedzone przedrostkiem 0x, sa interpretowane jako liczby szesnastkowe, a w przeciwnym przypadku jako liczby dziesietne. --param-index numer Wybiera wystapienie tego samego parametru RTC, tyle ze z indeksem numer. Domyslna wartoscia numeru jest 0. --predict Przewiduje wartosc, jaka zegar sprzetowy wskaze w przyszlosci, na podstawie czasu podanego opcja --date oraz informacji w /etc/adjtime. Przydatne na przyklad do uwzglednienia dryfu zegara przy ustawianiu wybudzenia zegarem sprzetowym (alarmu). Zob. rtcwake(8). Nie nalezy stosowac tej funkcji, jesli zegar sprzetowy jest modyfikowany przez cokolwiek poza poleceniem hwclock biezacego systemu operacyjnego, na przyklad przez "tryb 11-minutowy" lub ze wzgledu na podwojny rozruch z innym systemem operacyjnym. -r, --show; --get Odczytuje zegar sprzetowy i wypisuje jego czas na standardowe wyjscie w formacie ISO 8601. Pokazywany czas jest zawsze czasem lokalnym nawet, gdy utrzymuje sie swoj zegar sprzetowy w UTC. Zob. opcja --localtime. Pokazywanie czasu zegara sprzetowego jest zachowaniem domyslnym, gdy nie poda sie zadnej funkcji. Funkcja --get do odczytywanego czasu stosuje rowniez korekte ze wzgledu na dryf zegara, na podstawie informacji w /etc/adjtime. Nie nalezy stosowac tej funkcji, jesli zegar sprzetowy jest modyfikowany przez cokolwiek poza poleceniem hwclock biezacego systemu operacyjnego, na przyklad przez "tryb 11-minutowy" lub ze wzgledu na podwojny rozruch z innym systemem operacyjnym. -s, --hctosys Ustawia zegar systemowy z zegara sprzetowego. Czas odczytywany z zegara sprzetowego jest kompensowany ze wzgledu na dryf systematyczny, przed zastosowaniem go do ustawienia zegara systemowego. Zob. opis w rozdziale Funkcja korekcji. Zegar systemowy musi byc utrzymywany w skali czasowej UTC, aby aplikacje zwiazane z data i czasem pracowaly poprawnie razem ze strefa czasowa skonfigurowana w systemie. Jesli czas zegara sprzetowego jest utrzymywany jako czas lokalny, to odczyt czasu z niego musi byc przeniesiony do strefy czasowej UTC, przed uzyciem go do ustawienia zegara systemowego. Funkcja --hctosys robi to na podstawie informacji z pliku /etc/adjtime oraz argumentow --localtime i --utc wiersza polecen. Prosze zauwazyc, ze nie sa stosowane poprawki ze wzgledu na czas letni. Zob. ponizej rozdzial Czas lokalny (LOCAL) czy UTC. Jadro utrzymuje rowniez wartosc strefy czasowej, funkcja --hctosys ustawia ja na strefe czasowa skonfigurowana w systemie. Systemowa strefa czasowa jest konfigurowana przez zmienna srodowiskowa TZ lub plik /etc/localtime, w formie interpretowanej przez tzset(3). Przestarzale pole tz_dsttime wartosci strefy czasowej jadra jest ustawione na zero (szczegoly na temat znaczenia tego pola w przeszlosci opisano w podreczniku settimeofday(2)). Gdy zastosowana w skrypcie startowym, co czyni funkcje --hctosys pierwszym wywolujacym settimeofday(2) przy rozruchu, ustawia skale czasowa "trybu 11-minutowego" NTP, za pomoca zmiennej jadra persistent_clock_is_local. Gdy zmienia sie konfiguracja skali czasowej zegara sprzetowego, do poinformowania o tym jadra, konieczne jest ponowne uruchomienie komputera. Zob. opis w rozdziale Automatyczna synchronizacja zegara sprzetowego przez jadro ponizej. Jest to prawidlowa funkcja do stosowania w jednym z systemowych skryptow startowych, przed zamontowaniem systemow plikow do odczytu i zapisu. Funkcji tej nie mozna uzywac w dzialajacym systemie. Zmiana czasu systemowego spowoduje problemy, takie jak nieprawidlowe znaczniki czasu w systemie plikow. Ponadto, jesli cos zmienilo zegar sprzetowy np. "tryb 11-minutowy" NTP, --hctosys ustawi czas nieprawidlowo, poprzez niepotrzebne uwzglednienie korekty ze wzgledu na dryf zegara. Korekte ze wzgledu na dryf zegara mozna powstrzymac, ustawiajac czynnik korekty dryfu w /etc/adjtime na zero. Ustawienie to bedzie trwale do momentu, gdy nie uzyje sie opcji --update-drift wraz z --systohc przy wylaczeniu komputera (lub w innym momencie). Innym sposobem na powstrzymanie korekty jest uzycie opcji --noadjfile przy wywolywaniu funkcji --hctosys. Trzecia metoda jest usuniecie pliku /etc/adjtime. Hwclock zastosuje wtedy domyslna skale czasowa UTC wobec zegara sprzetowego. Jesli zegar sprzetowy dziala w oparciu o czas lokalny, konieczne jest zdefiniowanie tego w ww. pliku. Mozna to zrobic wywolujac hwclock --localtime --adjust; gdy wspomniany plik jest nieobecny, polecenie faktycznie nie dostosuje zegara, lecz utworzy plik z konfiguracja wskazujaca na czas lokalny oraz czynnikiem korekty dryfu wynoszacym zero. Przypadkiem, w ktorym wskazane moze byc powstrzymanie uwzglednianie korekcji dryfu programu hwclock, jest podwojny rozruch z innym systemem operacyjnym. Jesli na przyklad zatrzyma sie te instancje Linuksa, nastepnie inny system operacyjny zmieni wartosc zegara sprzetowego, pozniej uruchomi sie ponownie te instancje, to zastosowana korekta dryfu bedzie nieprawidlowa. Do prawidlowego stosowania korekty dryfu programu hwclock bezwzglednie konieczne jest, aby zegar sprzetowy nie ulegal zmianie, gdy dana instancja Linuksa nie jest uruchomiona. --set Ustawia zegar sprzetowy na czas podany opcja --date oraz aktualizuje znaczniki czasu w /etc/adjtime. Wraz z opcja --update-drift dokonuje takze (re)kalkulacji czynnika korekty dryfu. Jesli --set zawiedzie, prosze sprobowac uzyc go bez ww. opcji. Zob. --update-drift ponizej. --systz Jest to alternatywa wobec funkcji --hctosys, ktora nie odczytuje zegara sprzetowego ani nie ustawia zegara systemowego; zatem nie stosuje tez zadnej korekty dryfu. Przeznaczona do stosowania w skryptach startowych w systemach z jadrami w wersji wyzszej niz 2.6, gdy wiadomo, ze zegar systemowy zostal ustawiony z zegara sprzetowego przez jadro, w trakcie rozruchu. Wykonuje nastepujace czynnosci, opisane szczegolowo wyzej, przy funkcji --hctosys: o Koryguje skale czasowa zegara systemowego na UTC, w razie takiej potrzeby. Z ta roznica, ze zamiast dokonywania tego przez zmiane zegara systemowego, hwclock jedynie informuje o tym jadro, ktore samo zajmuje sie zmiana. o Ustawia skale czasowa "trybu 11-minutowego" NTP jadra. o Ustawia strefe czasowa jadra. Pierwsze dwie czynnosci sa dostepne tylko w pierwszym wywolaniu do settimeofday(2), po rozruchu. Opcja ta ma zatem sens jedynie, gdy jest stosowana w skrypcie startowym. Gdy zmienia sie konfiguracja skali czasowej zegara sprzetowego, do poinformowania o tym jadra, konieczne jest ponowne uruchomienie komputera. -w, --systohc Ustawia zegar sprzetowy z zegara systemowego oraz aktualizuje znaczniki czasu w /etc/adjtime. Wraz z opcja --update-drift dokonuje takze (ponownego) przeliczenia czynnika korekty dryfu. Jesli --systohc zawiedzie, prosze sprobowac uzyc go bez ww. opcji. Zob. --update-drift ponizej. --vl-read, --vl-clear Niektore urzadzenia zegara czasu rzeczywistego (RTC) moga monitorowac napiecie baterii, pozwalajac uzytkownikowi na sprawdzenie, czy nie nalezy jej wymienic. Funkcja --vl-read pobiera informacje o niskim napieciu i dekoduje wynik do czytelnej postaci. Funkcja --vl-clear resetuje informacje o niskim napieciu, co jest konieczne w niektorych urzadzeniach RTC po wymianie baterii. W pliku include/uapi/linux/rtc.h jadra mozna sprawdzic, ktore informacje moga byc zwrocone. Prosze zauwazyc, ze nie wszystkie urzadzenia RTC maja opisywana mozliwosc monitorowania, ani nie wszystkie sterowniki musza obslugiwac jej odczytywanie. -h, --help Wyswietla ten tekst i wychodzi. -V, --version Wyswietla wersje i wychodzi. OPCJE --adjfile=nazwa-pliku Przeslania domyslna sciezke pliku /etc/adjtime. --date=lancuch-daty Opcja musi byc 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 byc podany w czasie lokalnym, nawet jesli utrzymuje sie swoj zegar sprzetowy w UTC. Zob. opcja --localtime. Z tego wzgledu, argument nie powinien zawierac informacji o strefie czasowej. Czasu nie powinno sie tez podawac jako czas wzgledny typu "+5 minutes", poniewaz precyzja hwclock zalezy od korelacji pomiedzy wartoscia argumentu i momentu wcisniecia klawisza enter. Ulamkowe wartosci sekundy sa po cichu pomijane. Opcja przyjmuje wiele formatow daty i czasu, ale ww. parametry sa dobrym przykladem. --delay=sekundy Opcja przeslania domyslne opoznienie stosowane przy ustawianiu czasu zegara. Domyslnie wynosi 0.5 (500 ms) w przypadku rtc_cmos; przy innych typach zegarow czasu rzeczywistego (RTC) opoznienie wynosi 0. Jesli nie da sie okreslic typu RTC (na podstawie sysfs), to opoznienie domyslnie wynosi rowniez 0.5, ze wzgledu na kompatybilnosc wsteczna. Wartosc domyslna 500 ms wybrano ze wzgledu na czesto stosowany zegar sprzetowy kompatybilny z MC146818A (na x86). Ten zegar sprzetowy mozna ustawic jedynie na wartosc calkowita plus pol sekundy. Wartosc calkowita jest wymagana ze wzgledu na brak interfejsu do pobrania lub ustawienia czesci sekundy po przecinku. Dodatkowe pol sekundy wynika ze sposobu aktualizacji zegara sprzetowego, ktora zachodzi do nastepnej sekundy, dokladnie 500 ms po ustawieniu nowego czasu. Niestety zachowanie to zalezy od sprzetu i w niektorym przypadkach wymagane jest inne opoznienie. -D, --debug Prosze stosowac --verbose. Opcja --debug jest przestarzala i moze byc wykorzystana w inny sposob albo usunieta w kolejnym wydaniu. --directisa Opcja ma znaczenie w przypadku komputerow kompatybilnych z ISA z rodziny x86 i x86_64. Nie odnosi skutku na innych komputerach. Opcja nakazuje hwclock stosowanie bezposrednich instrukcji wejscia/wyjscia w celu dostepu do zegara sprzetowego. Bez tej opcji, hwclock uzyje pliku urzadzenia rtc przyjmujac, ze zastosuje go linuksowy sterownik urzadzenia RTC. Wedle stanu na v2.26, program nie bedzie juz automatycznie stosowal directisa, gdy sterownik rtc jest niedostepny; powodowalo to niebezpieczna sytuacje, pozwalajaca na rownoczesny dostep do zegara sprzetowego przez dwa procesy. Bezposredni dostep sprzetowy z przestrzeni uzytkownika powinno sie stosowac tylko do testowania, diagnozowania problemow oraz jako ostatecznosc, gdy wszystkie inne sposoby zawioda. Zob. opcja --rtc. --epoch=rok Opcja wymagana przy stosowaniu funkcji --setepoch. Minimalna wartoscia roku jest 1900. Maksymalna zalezy od systemu (ULONG_MAX - 1). -f, --rtc=nazwa-pliku Przeslania domyslna nazwe pliku urzadzenia rtc hwclock. W innym przypadku uzyje pierwszego odnalezionego, w tej kolejnosci: /dev/rtc, /dev/rtc0, /dev/misc/rtc. W przypadku IA-64: /dev/efirtc /dev/misc/efirtc -l, --localtime; -u, --utc Wskazuje skale czasowa, na ktora ustawiony jest zegar sprzetowy. Zegar sprzetowy mozna skonfigurowac do stosowania skali czasowej UTC lub lokalnej, jednak nic w samym zegarze nie wskazuje, na ktora skale go ustawiono. Opcja --localtime lub --utc przekazuje te informacje poleceniu hwclock. Jesli poda sie nieprawidlowa skale (lub nie poda zadnej, powodujac wybor nieprawidlowej wartosci domyslnej) zarowno ustawianie jak i odczyt z zegara sprzetowego beda nieprawidlowe. Jesli nie poda sie --utc ani --localtime , to stosowana bedzie ostatnia podana przy funkcji ustawiajacej czas (--set, --systohc lub --adjust), tak jak zapisano ja w /etc/adjtime. Jesli plik adjtime nie istnieje, domyslnie stosowane jest UTC. Uwaga: zmiany czasu letniego moga byc niespojne, gdy zegar sprzetowy utrzymywany jest wedlug czasu lokalnego. Zob. opis w rozdziale Czas lokalny (LOCAL) czy UTC ponizej. --noadjfile Wylacza 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 zegarow lub /etc/adjtime (przy tej opcji wlaczone jest tez --verbose). --update-drift Aktualizuje czynnik korekty dryfu zegara sprzetowego w /etc/adjtime. Opcje mozna stosowac tylko lacznie z --set lub --systohc. Pomiedzy aktualizacjami wymagane jest zachowanie co najmniej czterech godzin odstepu. Ma to na celu unikniecie nieprawidlowych obliczen. Im dluzszy okres odstepu, tym dokladniejszy bedzie obliczony czynnik korekty. Opcje dodano w v2.26, poniewaz systemy typowo wywoluja hwclock --systohc przy wylaczaniu; przy stosowaniu starego zachowania powodowaloby to automatycznie (ponowne) przeliczenie czynnika korekty dryfu, co skutkowaloby wieloma problemami: o Przy uzywaniu NTP z trybem "11-minutowym jadra", czynnik korekty dryfu zostalby niemal wyzerowany. o Niemozliwa bylaby korekta "zimnego" dryfu. W wiekszosci konfiguracji odnoszenie sie do "zimnego" dryfu daje lepsze wyniki. Przez "zimno" rozumiemy tu sytuacje, gdy komputer jest wylaczany, co ma znaczacy wplyw na czynnik korekty dryfu. o (Ponowne) obliczanie czynnika korekty dryfu przy kazdym wylaczaniu daje nieoptymalne wyniki. Na przyklad, gdy chwilowe warunki powoduja nietypowe nagrzanie komputera, obliczony czynnik korekty bedzie przeszacowany. o Znaczaco wydluzaloby to czas wylaczenia systemu (wedlug stanu na v2.31, jesli nie stosuje sie --update-drift, zegar czasu rzeczywistego nie jest odczytywany). Obliczenie przez hwclock czynnika korekty dryfu jest dobre na poczatek, ale do uzyskania optymalnych wynikow konieczne byloby prawdopodobnie dostosowanie przez bezposrednia edycje pliku /etc/adjtime. W przypadku wiekszosci konfiguracji, po tym jak obliczony zostanie optymalny czynnik korekty dryfu, nie powinno byc potrzeby zmieniania go. Dlatego stare podejscie, automatycznie (ponownie) obliczajace dryf uleglo zmianie i obecnie wymaga podania tej opcji, aby je zastosowac. Zob. opis w rozdziale Funkcja korekty. Niniejsza opcja wymaga odczytu zegara sprzetowego przed ustawieniem go. Jesli nie da sie go odczytac, opcja spowoduje niepowodzenie funkcji ustawienia. Moze sie tak stac np. gdy zawartosc zegara sprzetowego zostanie uszkodzona przez awarie zasilania. W takim przypadku, konieczne jest uprzednie ustawienie zegara bez tej opcji. Pomimo braku dzialania, wynikowy czynnik korekty dryfu i tak bylby nieprawidlowy. -v, --verbose Wyswietla wiecej szczegolow o wewnetrznym dzialaniu hwclock. UWAGI Zegary w systemie Linux Istnieja dwa typy zegarow daty i czasu: Zegar sprzetowy: zegar bedacy niezaleznym urzadzeniem sprzetowym, ze swoim wlasnym zasilaniem (bateria, kondensatorem itp.), ktory dziala gdy komputer jest wylaczony, a nawet gdy jest odlaczony od zasilania. W przypadku systemow kompatybilnych z ISA, zegar jest czescia standardu ISA. Program kontrolujacy moze go odczytac lub ustawic jedynie do pelnej sekundy, ale moze wykryc moment przeskoczenia sekundy, wiec zegar ten ma praktycznie nieskonczona precyzje. Zegar ten jest czesto nazywany: zegarem sprzetowym, zegarem czasu rzeczywistego, RTC (od ang. "real time clock"), zegarem BIOS lub zegarem CMOS. Jadro Linux nazywa go tez zegarem trwalym ("persistent clock"). Niektore systemy inne niz ISA moga miec kilka zegarow czasu rzeczywistego, z ktorych tylko jeden ma wlasne zasilanie. Zewnetrzne uklady zegara I2C lub SPI o bardzo niewielkim poborze pradu moga byc stosowane wraz ze swa bateria jako zegar sprzetowy do inicjowania funkcjonalniejszego, wbudowanego zegara czasu rzeczywistego, sluzacego wiekszosci innych celow. Zegar systemowy: zegar bedacy czescia jadra Linux, sterowany przerwaniem czasomierza (na komputerze ISA, przerwanie czasomierza jest czescia standardu ISA). Ma znaczenie tylko w trakcie dzialania systemu Linux na komputerze. Czas systemowy jest liczba sekund od 00:00:00 1 stycznia 1970 UTC (zwiezlej: liczba sekund od 1969 UTC). Czas systemowy nie jest jednak liczba calkowita. Ma praktycznie nieskonczona precyzje. To czas systemowy jest czasem istotnym. Podstawowym przeznaczeniem zegara sprzetowego jest utrzymywanie czasu, gdy nie dziala Linux, dzieki czemu przy rozruchu mozna z niego zainicjowac zegar systemowy. Prosze zauwazyc, ze w DOS-ie, dla ktorego zaprojektowano standard ISA, zegar sprzetowy byl jedynym zegarem czasu rzeczywistego. Wazne jest, aby czas systemowy nie mial luk, ktore moglyby nastapic po ustawieniu go w trakcie dzialania systemu za pomoca programu date(1). W trakcie dzialania systemu, mozna jednak zrobic co tylko sie chce z zegarem sprzetowym, a przy nastepnym uruchomieniu Linuksa, system wlaczy sie z czasem dostosowanym z zegara sprzetowego. Uwaga: obecnie nie jest to mozliwe na wiekszosci systemow, ze wzgledu na wywolywanie hwclock --systohc przy zamykaniu systemu. Strefa czasowa jadra Linux jest ustawiana przez hwclock. Nie nalezy jednac dac sie zwiesc - niemal nic nie zwraca uwagi na strefe czasowa jadra. Programy, ktore wymagaja wiedzy o strefie czasowej (moze np. chca wyswietlic czas lokalny uzytkownikowi) niemal zawsze korzystaja z tradycyjniejszej metody okreslenia strefy czasowej: uzywaja zmiennej srodowiskowej TZ lub pliku /etc/localtime, zgodnie z wytlumaczeniem w podreczniku systemowym tzset(3). Jednakze niektore programy i peryferyjne czesci jadra Linux, takie jak systemy plikow, mimo to korzystaja z wartosci strefy czasowej jadra. Przykladem jest system plikow vfat. Jesli wartosc strefy czasowej jadra jest nieprawidlowa, system plikow vfat zglosi i ustawi nieprawidlowe znaczniki czasu w plikach. Innym przykladem jest "tryb 11-minutowy" NTP jadra. Jesli wartosc strefy czasowej jadra i/lub zmienna persistent_clock_is_local sa nieprawidlowe, zegar sprzetowy zostanie ustawiony nieprawidlowo przez "tryb 11-minutowy". Zob. opis w rozdziale Automatyczna synchronizacja zegara sprzetowego przez jadro ponizej. hwclock ustawi wartosc strefy czasowej jadra wskazana przez TZ lub /etc/localtime przy uzyciu opcji --hctosys lub --systz. Wartosc strefy czasowej jadra sklada sie tak naprawde z dwoch czesci: 1) pola tz_minuteswest wskazujacego o jak wiele minut czasu lokalnego (bez uwzglednienia czasu letniego) czas lokalny jest pozniejszy od czasu UTC oraz 2) pola tz_dsttime wskazujacego stosowany obecnie, lokalnie typ konwencji czasu letniego (DST). To drugie pole nie jest stosowane w Linuksie i zawsze wynosi zero. Zob. tez settimeofday(2). Metody dostepu do zegara sprzetowego hwclock stosuje rozne metody pobierania i ustawiania wartosci zegara sprzetowego. Najzwyklejsza jest wykonanie wejscia/wyjscia do pliku specjalnego urzadzenia rtc, ktory powinien byc sterowany przez sterownik urzadzenia rtc. Ponadto systemy linuksowe korzystajace ze szkieletu rtc z udev, moga obslugiwac wiele zegarow sprzetowych. Moze to spowodowac koniecznosc przesloniecia domyslnego urzadzenia rtc, podajac inne opcja --rtc. Ta metoda nie jest jednak zawsze dostepna, poniewaz starsze systemy nie posiadaja sterownika rtc. Na tych systemach metoda dostepu do zegara sprzetowego zalezy od sprzetu systemowego. W systemach kompatybilnych z ISA, hwclock moze uzyskac bezposredni dostep do rejestrow "pamieci CMOS" skladajacych sie na zegar, dokonujac wejscia/wyjscia na portach 0x70 i 0x71. Dokonuje tego za pomoca faktycznych instrukcji wejscia/wyjscia, zatem wymaga efektywnego identyfikatora superuzytkownika. Metode te mozna zastosowac podajac opcje --directisa. Jest to kiepski sposob na dostep do zegara, z tych wszystkich powodow, dla ktorych programy z przestrzeni uzytkownika nie sa generalnie dopuszczane do wykonywania bezposredniego wejscia/wyjscia i wylaczania przerwan. hwclock udostepnia go do testowania, rozwiazywania problemow oraz poniewaz moze byc to jedyna metoda dostepna na systemach ISA nieposiadajacych dzialajacego sterownika urzadzenia rtc. Funkcja korekcji Zegar sprzetowy nie jest zwykle zbyt dokladny. Jednak wiele z tej niedokladnosci jest calkowicie przewidywalna - zyskuje on lub traci te sama liczbe sekund kazdego dnia. Nazywa sie to dryfem systematycznym. Funkcja --adjust programu hwclock pozwala stosowac korekcje dryfu systematycznego do zegara sprzetowego. Dziala to tak: hwclock utrzymuje plik, /etc/adjtime, zawierajacy pewne informacje historyczne. Jest on nazywany plikiem adjtime. Zalozmy, ze zaczynamy bez pliku adjtime. Wydajemy polecenie hwclock --set, aby ustawic zegar sprzetowy na faktyczny czas aktualny. hwclock tworzy plik adjtime zapisujac w nim czas biezacy, jako ostatni moment kalibracji zegara. Piec dni pozniej, zegar zyskal 10 sekund, wiec wydajemy polecenie hwclock --set --update-drift, aby ustawic go na 10 sekund wstecz. hwclock aktualizuje plik adjtime, wskazujac czas biezacy, jako ostatni moment kalibracji zegara i zapisujac 2 sekundy na dzien jako dryf systematyczny zegara. Po 24 godzinach wydajemy polecenie hwclock --adjust. hwclock sprawdza plik adjtime i widzi, ze zegar zyskuje 2 sekundy na dzien, przy braku korekty oraz ze nie byl korygowany dokladnie przez dzien. Odejmuje zatem 2 sekundy od zegara sprzetowego. Nastepnie zapisuje czas biezacy, 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 biezacym, jako ostatnim momentem kalibracji zegara. Po zastosowaniu opcji --update-drift wraz z --set lub --systohc, dryf systematyczny jest (ponownie) obliczany poprzez porownanie w pelni wyrownanego pod katem dryfu czasu zegara sprzetowego 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 nastepnie zapisywany w /etc/adjtime. Ustawianie zegara sprzetowego jest obarczone niewielkim bledem, wiec --adjust nie dokonuje poprawek, ktore sa mniejsze od 1 sekundy. Pozniej, gdy zazada sie ponownego wprowadzenia poprawki, a nagromadzony dryf osiagnie ponad 1 sekunde, --adjust dokona korekty uwzgledniajacej rowniez wartosci sekundy po przecinku. hwclock --hctosys rowniez stosuje plik danych adjtime do skompensowania wartosci odczytanej z zegara sprzetowego, przed zastosowaniem jej do ustawienia zegara systemowego. Nie posiada 1-sekundowego ograniczenia --adjust i od razu skoryguje wartosci dryfu ponizej jednej sekundy. Nie zmienia czasu zegara sprzetowego ani pliku adjtime. Moze to wyeliminowac potrzebe stosowania --adjust, chyba ze inny element w systemie wymaga kompensacji zegara sprzetowego. Plik Adjtime Choc ze wzgledow historycznych nazwa pliku wskazuje jedynie na kontrole stosowanych poprawek czasu, plik zawiera rowniez inne informacje uzywane przez hwclock pomiedzy wywolaniami programu. Zawartosc pliku adjtime, w ASCII, jest nastepujaca: Wiersz 1: Trzy liczby oddzielone odstepami: 1) dryf systematyczny w sekundach na dzien, dziesietna liczba zmiennoprzecinkowa; 2) Wynikowa liczba sekund od 1969 UTC ostatniej korekty lub kalibracji, dziesietna liczba calkowita; 3) zero (ze wzgledu na kompatybilnosc z clock(8)) jako dziesietna liczba zmiennoprzecinkowa. Wiersz 2: Jedna liczba: wynikowa liczba sekund od 1969 UTC ostatniej kalibracji. Zero, jesli nie zaszla jeszcze kalibracja, albo wiadomo, ze poprzednia kalibracja jest nieprzydatna (na przyklad, poniewaz od czasu tamtej kalibracji jest jasne, ze zegar sprzetowy nie zawiera prawidlowego czasu). Dziesietna liczba calkowita. Wiersz 3: "UTC" lub "LOCAL". Wskazuje, czy zegar sprzetowy jest ustawiony na czas uniwersalny (Coordinated Universal Time) czy lokalny. Wartosc te mozna zawsze przeslonic opcjami wiersza polecen hwclock. Plik adjtime uzywany wczesniej przez clock(8) mozna stosowac z programem hwclock. Automatyczna synchronizacja zegara sprzetowego przez jadro Trzeba wiedziec, ze istnieje inny sposob synchronizacji zegara sprzetowego stosowany w niektorych systemach. Jadro Linux posiada tryb, w ktorym kopiuje czas systemowy do zegara sprzetowego co 11 minut. Tryb ten jest opcja z czasu kompilacji, wiec nie wszystkie jadra posiadaja te mozliwosc. Jest to dobry sposob stosowany, gdy zegar systemowy jest synchronizowany przez zaawansowany mechanizm, taki jak NTP (NTP to sposob synchronizacji czasu systemowego poprzez sieciowy serwer czasu lub zegar radiowy podlaczony do systemu. Zob. RFC 1305). Jesli jadro skompilowano z opcja "trybu 11-minutowego", to bedzie on aktywny gdy dyscyplina zegara jadra jest w stanie zsynchronizowanym. Wowczas bit 6 (bit ustawiany maska 0x0040) zmiennej jadra time_status jest usuwany. Ta wartosc jest widoczna jako wiersz "statusu" polecen adjtimex --print lub ntptime. Do uzyskania stanu synchronizacji dyscypliny zegara jadra, a wiec wlaczenia "trybu 11-minutowego" wymagany jest wplyw zewnetrzny, taki jak demon NTP. Jego wylaczenie nastapi poprzez uruchomienie czegokolwiek ustawiajacego zegar systemowy w sposob tradycyjny, w tym hwclock --hctosys. Jednak jesli demon NTP wciaz dziala, wlaczy on "tryb 11-minutowy" przy nastepnej synchronizacji zegara systemowego. Gdy dany system dziala z wlaczonym "trybem 11-minutowym", moze zajsc potrzeba umieszczenia --hctosys lub --systz w skrypcie startowym, szczegolnie jesli zegar sprzetowy skonfigurowano do dzialania w lokalnej skali czasowej. O ile jadro nie zostanie poinformowane o stosowanej skali czasowej zegara sprzetowego, moze go zasmiecic nieprawidlowa. Jadro domyslnie stosuje UTC. Aplikowane jest pierwsze polecenie z przestrzeni uzytkownika informujace jadro o stosowanej skali czasowej zegara sprzetowego. Dzieje sie to poprzez zmienna jadra persistent_clock_is_local. Jesli --hctosys lub --systz beda pierwsze, ustawia te zmienna zgodnie z plikiem adjtime lub odpowiednim argumentem z wiersza polecen. Prosze zauwazyc, ze gdy przy stosowaniu tej funkcji skala czasowa zegara sprzetowego ulegnie zmianie, do poinformowania o tym jadra konieczne jest ponowne uruchomienie komputera. W "trybie 11-minutowym" NTP nie nalezy stosowac hwclock --adjust. Wartosc stulecia zegara sprzetowego ISA Istnieje pewnego typu standard, definiujacy bajt 50 pamieci CMOS na komputerze ISA jako wskazujacy na stulecie. hwclock nie stosuje, ani nie ustawia tego bajtu, poniewaz niektore komputery nie definiuja go w ten sposob, a nie jest to tak naprawde konieczne, jako ze same lata stulecia powinny wystarczyc do okreslenia biezacego stulecia. Jesli istnieje dobre zastosowanie bajtu stulecia CMOS, opiekun hwclock prosi o kontakt; wowczas moze pojawic sie odpowiednia opcja. Prosze zauwazyc, ze ten rozdzial ma znaczenie tylko przy metodzie bezposredniego dostepu do zegara sprzetowego przez ISA ("direct ISA"). ACPI zapewnia standardowy sposob na dostep do wartosci stulecia, gdy jest to obslugiwane przez sprzet. KONFIGURACJA DATY I CZASU Utrzymywanie czasu bez zewnetrznej synchronizacji Niniejszy opis ma zastosowanie przy spelnieniu nastepujacych warunkow: o Nie dziala nic, co zmienialoby zegary daty i czasu, takiego jak demon NTP lub zadanie crona. o Systemowa strefe czasowa skonfigurowano pod czas lokalny. Zob. nizej rozdzial POSIX czy "poprawnosc". o Podczas wczesnego rozruchu wywolywane sa, w tej kolejnosci: adjtimex --tick wartosc --frequency wartosc hwclock --hctosys o Podczas zamykania systemu wywolywane jest: hwclock --systohc o Systemy bez adjtimex moga stosowac ntptime. Niezaleznie od tego, czy zapewniany jest dokladny czas dzieki demonowi NTP, sensowne jest, aby sam system utrzymywal w miare dokladny czas wraz z data. Pierwszym krokiem jest zrozumienie calosci zagadnienia. Istnieja dwa zupelnie oddzielne urzadzenia sprzetowe dzialajace w swoim wlasnym tempie i dryfujace od "prawidlowego" czasu w rozny sposob. Metody oraz oprogramowanie do korekty dryfu sa oddzielnego do kazdego z nich. Jednak wiekszosc systemow jest skonfigurowana tak, aby wymieniac wartosci pomiedzy tymi dwoma zegarami przy uruchamianiu i zamykaniu systemu. W ten sposob odchylki czasowe kazdego urzadzenia sa transferowane tam i z powrotem pomiedzy nimi. Jesli sprobuje sie skonfigurowac korekcje dryfu tylko jednego z zegarow, dryf drugiego zostanie naddany na drugi. Problemu przy konfiguracji korekty dryfu zegara systemowego mozna uniknac po prostu nie wylaczajac komputera. To oraz fakt ze cala precyzja hwclock (w tym obliczanie czynnikow korekty dryfu) opiera sie na poprawnosci chodu zegara systemowego, oznacza ze najpierw nalezy skonfigurowac zegar systemowy. Dryf zegara systemowego koryguje sie opcjami --tick i --frequency polecenia adjtimex(8). Opcje te dzialaja lacznie: tick jest zgrubna korekta, a frequency zapewnia dokladne dopasowanie (systemy nieposiadajace pakietu adjtimex moga w zamian stosowac ntptime -f cz-na-mln). Niektore dystrybucje Linuksa probuja automatycznie obliczyc dryf zegara systemowego stosujac operacje compare (porownania) adjtimex. Proba korekty jednego dryfujacego zegara, korzystajac z drugiego dryfujacego zegara jako punktu odniesienia, przypomina psa probujacego zlapac swoj ogon. Moze sie co prawda skonczyc sukcesem, ale bedzie to poprzedzone duzym nakladem pracy i wieloma frustracjami. Taka automatyzacja moze dac pewna poprawe wzgledem braku konfiguracji, lecz nie nalezy spodziewac sie optymalnych wynikow. Lepszym sposobem recznej konfiguracji bylaby opcja --log programu adjtimex. Bardziej efektywne moze byc proste sledzenie dryfu zegara systemowego za pomoca sntp lub date -Ins i precyzyjnego zegarka, a nastepnie reczne obliczenie poprawki. Po ustawieniu wartosci tick i frequency, nalezy testowac i poprawiac korekty, do momentu osiagniecia dobrego chodu zegara systemowego. Wiecej informacji i przykladow ilustrujacych reczne obliczanie dryfu znajduje sie w podreczniku adjtimex(2). Po poprawnym skonfigurowania zegara systemowego nalezy przejsc do zegara sprzetowego. Jako regula, zimny dryf bedzie zwykle dzialal najlepiej. Powinno miec to do zastosowanie w przypadku komputerow dzialajacych 24/7, ktorych czas wylaczenia zwykle ogranicza sie do ponownego uruchomienia komputera. W takim przypadku czynnik korekty dryfu nie robi duzej roznicy. Jednak w rzadkich sytuacjach, gdy taki komputer jest wylaczany na dluzszy czas, zimny dryf powinien dac lepsze efekty. Kroki sluzace do obliczenia zimnego dryfu: 1 Upewnienie sie, ze demon NTP nie bedzie uruchamiany przy rozruchu komputera. 2 Czas zegara systemowego musi byc prawidlowy przy wylaczeniu! 3 Wylaczenie systemu. 4 Odczekanie dluzszego czasu bez zmieniania zegara sprzetowego. 5 Uruchomienie systemu. 6 Natychmiastowe zastosowanie hwclock do ustawienia prawidlowego czasu, z dodaniem opcji --update-drift. Uwaga: jesli krok 6 uzywa --systohc, to tuz wczesniej konieczne jest ustawienie prawidlowego czasu zegara systemowego (krok 6a). Kalkulacja czynnika korekty dryfu przez hwclock jest zwykle dobrym poczatkiem, lecz uzyskanie optymalnych wynikow zwykle bedzie wymagalo dostosowania, przez bezposrednia edycje pliku /etc/adjtime. Nalezy kontynuowac sprawdzanie i poprawianie czynnika korekty do momentu, gdy zegar sprzetowy bedzie poprawnie skorygowany przy uruchomienia komputera. Aby to sprawdzic, nalezy najpierw upewnic sie, ze czas systemowy jest poprawny przed wylaczeniem, a nastepnie uzyc sntp lub date -Ins wraz z precyzyjnym zegarkiem, natychmiast po rozruchu. Czas lokalny (LOCAL) czy UTC Utrzymywanie zegara sprzetowego w lokalnej skali czasu powoduje niespojnosci zwiazane z czasem letnim: o Jesli Linux dziala w trakcie zmiany czasu letniego, czas zapisany do zegara sprzetowego bedzie uwzglednial te zmiane. o Jesli Linux NIE dziala w trakcie zmiany czasu letniego, czas odczytany z zegara sprzetowego nie bedzie uwzglednial tej zmiany. Zegar sprzetowy w systemach kompatybilnych z ISA utrzymuje jedynie date i czas, nie posiada pojecia strefy czasowej ani czasu letniego. Z tego wzgledu, gdy przekaze sie hwclock, ze dziala on w czasie lokalnym, przyjmuje ze jest to "poprawny" czas lokalny i nie stosuje dostosowan wobec odczytywanego z niego czasu. Linux obsluguje zmiany czasu letniego w sposob przezroczysty tylko, gdy zegar sprzetowy jest utrzymywany w skali czasowej UTC. Jest to latwe dla administratorow systemu, poniewaz hwclock i tak uzywa czasu lokalnego w swoim wyjsciu oraz jako argumentu do opcji --date. Systemy POSIX, takie jak Linux, zaprojektowano do dzialania z zegarem sprzetowym utrzymywanym w skali czasowej UTC. Celem zegara sprzetowego jest inicjowanie zegara systemowego, wiec utrzymywanie tego pierwszego w UTC ma sens. Linux stara sie jednak radzic sobie z sytuacja, gdy zegar sprzetowy jest utrzymywany w lokalnej skali czasowej. Taki przypadek wystepuje glownie przy rownoleglym rozruchu ze starszymi wersjami MS Windows. Od Windowsa 7, klucz rejestru RealTimeIsUniversal ma dzialac prawidlowo, dzieki czemu zegar sprzetowy moze byc utrzymywany w UTC. POSIX czy poprawnosc"" Dyskusja o konfiguracji daty i czasu bylaby niekompletna bez wspomnienia o strefach czasowych, opisanych glownie w podreczniku tzset(3). Obszarem, ktory wyglada na nieudokumentowany jest "poprawny" katalog bazy danych stref czasowych, czasem zwany tz lub zoneinfo. Wystepuja dwie oddzielne bazy danych w systemie zoneinfo: posix i "poprawna". "Poprawna" ("right", obecnie nazywana zoneinfo-leaps) uwzglednia sekundy przestepne, natomiast baza posix - nie. Aby uzywac "poprawnej" bazy danych, zegar systemowy musi byc ustawiony na (UTC + sekundy przestepne), co jest odpowiednikiem (TAI - 10). Pozwala to na obliczanie dokladnej liczby sekund pomiedzy dwoma datami, ktore przechodza przez epoke sekundy przestepnej. Zegar systemowy jest nastepnie konwertowany na prawidlowy czas cywilny, w tym UTC, poprzez stosowanie "poprawnych" plikow stref czasowych, odejmujac sekundy przestepne. Uwaga: ta konfiguracja jest uwazana za eksperymentalna i znane sa pewne problemy. Do skonfigurowania systemu w celu stosowania wybranej bazy danych, wszystkie pliki zlokalizowane z jej katalogu nalezy skopiowac do katalogu /usr/share/zoneinfo. Pliki nie sa nigdy stosowane bezposrednio z podkatalogow posix lub "right" np. TZ='right/Europe/Dublin'. Bylo to niegdys tak czesto praktykowane, ze projekt macierzysty przebudowal systemowe drzewo plikow, przesuwajac podkatalogi posix i "right" poza katalog zoneinfo, do katalogow rownoleglych: /usr/share/zoneinfo, /usr/share/zoneinfo-posix, /usr/share/zoneinfo-leaps Niestety, niektore dystrybucje Linuksa stosuja na nowo stary uklad plikow w swych pakietach. Problem administratorow systemu w sieganiu do "poprawnego" podkatalogu wciaz zatem istnieje. W ten sposob systemowa strefa czasowa jest konfigurowana z uwzglednieniem sekund przestepnych, podczas gdy baza danych zoneinfo wciaz je wylacza. Nastepnie gdy zegar swiatowy potrzebuje pliku strefy czasowej South_Pole albo agent poczty elektronicznej lub hwclock wymaga pliku strefy czasowej UTC, pobieraja ja z katalogu /usr/share/zoneinfo , tak jak powinno sie to odbywac. Pliki te jednak nie uwzgledniaja sekund przestepnych, ale zegar systemowy je uwzglednia, co powoduje nieprawidlowe przeliczanie czasu. Proba mieszania i dopasowywania plikow z tych oddzielnych baz danych nie powiedzie sie, poniewaz kazda wymaga, aby zegar systemowy korzystal z odmiennej skali czasowej. Baza danych zoneinfo musi byc skonfigurowana, aby korzystac albo z bazy posix albo z "poprawnej" bazy, zgodnie z powyzszym opisem, albo poprzez przypisanie sciezki do bazy danych do zmiennej srodowiskowej TZDIR. STATUS ZAKONCZENIA Zwrocona bedzie jedna z nastepujacych wartosci zakonczenia: EXIT_SUCCESS ('0' w systemach POSIX) Poprawne wykonanie programu. EXIT_FAILURE ('1' w systemach POSIX) Operacja nie powiodla sie lub skladnia polecenia byla nieprawidlowa. SRODOWISKO TZ Jesli zmienna jest ustawiona, jej wartosc ma pierwszenstwo nad strefa czasowa skonfigurowana systemowo. TZDIR Jesli zmienna jest ustawiona, jej wartosc ma pierwszenstwo nad sciezka do katalogu bazy danych stref czasowych skonfigurowanego systemowego. PLIKI /etc/adjtime Konfiguracja i plik stanu hwclock. Zob. tez adjtime_config(5). /etc/localtime Systemowy plik strefy czasowej. /usr/share/zoneinfo/ Systemowy katalog bazy danych stref czasowych. Pliki urzadzen, ktore hwclock moze wyprobowac w celu uzyskania dostepu do zegara sprzetowego: /dev/rtc /dev/rtc0 /dev/misc/rtc /dev/efirtc /dev/misc/efirtc ZOBACZ TAKZE date(1), adjtime_config(5), adjtimex(8), gettimeofday(2), settimeofday(2), crontab(1p), tzset(3) AUTORZY Napisane przez Bryana Hendersona we wrzesniu 1996 r. na podstawie programu clock(8) autorstwa Charlesa Hedricka, Roba Hoofta i Haralda Koeniga. Pelna historia i autorstwo sa widoczne w kodzie zrodlowym. ZGLASZANIE BLEDOW Problemy nalezy zglaszac w systemie sledzenia bledow . DOSTEPNOSC Polecenie hwclock jest czescia pakietu util-linux, ktory mozna pobrac ze strony Archiwum jadra Linux . util-linux 2.42.3 2026-09-02 HWCLOCK(8)