7) hwclock – czyli praca ze sprzętowym zegarem RTC
Zanim przystąpimy do bardzo skrótowego przedstawienia narzędzia hwclock, warto przypomnieć, że w systemie Linux posługujemy się dwoma rodzajami czasu – czasem systemowym oraz czasem sprzętowym. Czas sprzętowy to czas, który „liczy” niezależne od całego systemu operacyjnego (jest niezależny od wszystkich aplikacji), a jego wartość, dzięki podtrzymaniu bateryjnemu jest nieulotna po wyłączeniu komputera. Czas sprzętowy jest liczony przez dedykowany układ umieszczony na płycie głównej komputera, lub tak jak w naszym przypadku, przez zewnętrzny układ zegara RTC. Drugim rodzajem czasu jest czas systemowy, czyli zegar „zarządzany” przez system operacyjny (to on odpowiada za jego aktualizację). To właśnie z czasu systemowego korzystają wszystkie aplikacje oraz system plików. Skoro mamy dostępny zegar sprzętowy, po co więc wprowadzamy dodatkowy „twór programowy” w postaci zegara systemowego? Odpowiedź jest dość prosta – czas dostępu. Każdy odczyt zegara sprzętowego wymaga odpowiedniego wykonania szeregu operacji na magistrali, przez jaką dany układ został dołączony (I2C, SPI, itd.). Powoduje to wydłużenie czasu dostępu, co jest dość nieefektywne, i z tego też względu wprowadzono czas systemowy. Podsumowując – zadaniem zegara sprzętowego jest poprawne ustawienie zegara systemowego przy starcie systemu (co własnoręcznie skonfigurowaliśmy na etapie kompilacji jądra, ustawiając opcję „Set system time from RTC on startup and resume”).
Podstawowe operacje związane z czasem systemowym możemy wykonać za pomocą polecenia date:
-
- odczyt czasu systemowego:
1 2 |
pi@raspberrypi ~ $ date Sat Mar 1 14:00:17 UTC 2014 |
-
- ustawienie czasu systemowego (zmiana ta nie wpływa na wartość czasu sprzętowego):
1 2 |
pi@raspberrypi ~ $ sudo date -s "8 MAR 2014 14:00:00" Sat Mar 8 14:00:00 UTC 2014 |
1 |
date --help |
-
-
- odczyt czasu sprzętowego:
-
1 2 |
pi@raspberrypi ~ $ sudo hwclock -r Sun 16 Mar 2014 21:52:41 UTC -0.819382 seconds |
-
-
- zapis czasu sprzętowego:
-
1 |
pi@raspberrypi ~ $ sudo hwclock --set --date="2014-08-14 16:45:05" |
-
-
- ustawienie czasu sprzętowego na podstawie aktualnego czasu systemowego:
-
1 |
pi@raspberrypi ~ $ sudo hwclock -w |
-
-
- ustawienie czasu systemowego na podstawie aktualnego czasu sprzętowego:
-
1 |
pi@raspberrypi ~ $ sudo hwclock -s |
z czasem sprzętowym uzyskamy wydając polecenie:
1 |
man hwclock |
8) Podsumowanie
Jak można zauważyć po lekturze niniejszego artykułu, implementacja sprzętowo-programowa zegara RTC w minikomputerze Raspberry Pi jest operacją dość prostą. Po prawidłowym wykonaniu wszystkich operacji, użytkownik zapewnia prawidłowe ustawienie czasu systemowego w warunkach braku dostępu do sieci. Dodatkowo korzystając z zestawu gotowych rozwiązań programowych w postaci poleceń date, ntpd oraz hwclock, uzyskuje on możliwość przygotowania dostosowanych do własnych wymagań sposobów synchronizacji i zapewnienia dokładności zegara. Jednym z popularniejszych rozwiązań jest trwałe wyłączenie serwisu ntpd, ustawienie zegara systemowego na podstawie zegara sprzętowego i okresowe synchronizowanie zegara RTC z systemami NTP, jeżeli na urządzeniu dostępne jest połączenie sieciowe. Aby zestawić taki prosty system synchronizacji wystarczy jedynie:
-
-
- wyłączyć daemon ntpd:
-
1 |
/etc/init.d $ sudo update-rc.d ntp disable |
-
-
- zapewnić ustawianie czasu systemowego na podstawie zegara RTC – poprzez odpowiednią konfigurację jądra systemu („Set system time from RTC on startup and resume”):
-
1 2 3 4 |
pi@raspberrypi ~ $ dmesg | grep rtc [1.967314]rtc-ds1307 1-0068: rtc core: registered ds1307 as rtc0 [1.974820]rtc-ds1307 1-0068: 56 bytes nvram [2.288089]rtc-ds1307 1-0068: setting system clock to 2011-08-14 23:11:28 UTC |
-
-
- okresowo (w warunkach dostępności sieci) zapewniać synchronizację z serwerem NTP, np. manualnie lub poprzez dodanie poniższego wpisu do cron.weekly:
-
1 |
ntpd -q ; hwclock -w |