Trocha teorie
Na linuxu rozlišujeme tzv. hardware clock a system clock. Tedy hardwarový čas a systémový čas. Hardwarový čas je udržován na základní desce počítače a ikdyž je počítač odstavený od elektřiny, v počítači se nachází tzv. CMOS baterie (ve stolních počítačích je to baterie typu CR2032, která se dává též do různých hodinek atd…)
Systémový čas se načítá zpravidla v okamžiku bootu z hardwarového času. Čas je možný synchronizovat na linuxu pomocí NTP (Network Time protocol) většinou pomocí daemona NTPD. Čas se synchronizuje oproti časovým serverům. V ČR nejznámější tik.cesnet.cz či tak.cesnet.cz. Na Windows známe profláklý název time.windows.com.
Hardwarové hodiny (rtc = real time clock) mají své zařízení v /dev/rtc. Mnohé systémy mají více hodin:
uzivatel@server:~# ls /dev/rtc*
/dev/rtc /dev/rtc0
V souboru /etc/adjtime vidíme výsledek posledního použití příkazu hwclock. Ukazuje nám skluz (anglicky clock drift), tedy zpoždění, nebo naopak předcházení hardwarových hodin a o kolik.
uzivatel@server:~# cat /etc/adjtime 0.048326 1500445272 0.000000 1500445272 UTC
Příkazy:
uzivatel@server:~# date St čec 19 08:07:56 CEST 2017 uzivatel@server:~# hwclock -r St 19. červenec 2017, 08:08:45 CEST -0.151119 sekundy uzivatel@server:~# hwclock -r && date St 19. červenec 2017, 08:9:18 CEST -0.594535 sekundy St čec 19 08:9:18 CEST 2017
Mělo by to být v podstatě jedno jestli tam dáte && nebo ;.
uzivatel@server:~# hwclock -r; date St 19. červenec 2017, 08:10:56 CEST -0.860130 sekundy St čec 19 08:10:56 CEST 2017 Hardwarový čas počítače (tzv. hardware clock), který se drží v biosu i po vypnutí počítače nastavíme příkazem:
uzivatel@server:~# hwclock --set --date "7/19/2017 8:12" Pokud plánujete psát nějaké bash skripty, tak se Vám bude hodit tento příkaz:
uzivatel@server:~# date "+%d.%m.%Y %T" 19.07.2017 08:19:34 příkaz hwclock -w přepíše hardwarový čas systémovým časem:
uzivatel@server:~# date; hwclock -r; hwclock -w;echo "po nastaveni:" ;hwclock -r;date St čec 19 08:21:11 CEST 2017 St 19. červenec 2017, 08:21:33 CEST -0.375769 sekundy po nastaveni: St 19. červenec 2017, 08:21:13 CEST -0.501059 sekundy St čec 19 08:21:13 CEST 2017
Příkaz hwclock -s přepíše systémový čas hardwarovým časem:
uzivatel@server:~# hwclock -r; date; hwclock -s; echo "po nastaveni systemoveho casu podle hardwaroveho casu"; hwclock -r; date; St 19. červenec 2017, 08:23:27 CEST -0.703940 sekundy St čec 19 08:23:27 CEST 2017 po nastaveni systemoveho casu podle hardwaroveho casu St 19. červenec 2017, 08:23:29 CEST -1.000766 sekundy St čec 19 08:23:29 CEST 2017
NTP (Network Time Protocol)
Ve zkratce Network Time protocol slouží k synchronizaci času po síti. Více Vám řekne třeba wikipedie nebo googlení. NTP umí používat jak Windows, tak Linux, tak MacOS i další operační systémy. Je to naprosto základní služba. Referenční čas používaný NTP je UTC, tedy Coordinated Universal Time.
Příkazy na Linuxu:
Ubuntu/Debian:
apt-get install ntpdate -y
ntpdate -q adresaserver se jednorázově dotáže na server a nastaví systémový čas v počítači. uzivatel@server:~# hwclock -r;date ; ntpdate -q tik.cesnet.cz St 19. červenec 2017, 08:27:48 CEST -0.032243 sekundy St čec 19 08:27:48 CEST 2017 server 195.113.144.201, stratum 2, offset 0.001077, delay 0.03397 19 Jul 08:27:54 ntpdate[1202]: adjust time server 195.113.144.201 offset 0.001077 sec
Vysvětlím, co znamená to Stratum 2. Stratum 0 jsou atomové hodiny. Zkrátka referenční čas. Stratum 1 se dotazuje serveru Stratum 0 na to, jaký je přesný čas. Stratum 2 se proto dotazuje serveru Stratum 1, který se dotazuje na čas Stratum 0. Stratum 1 má přesnější čas, než stratum 3 a stratum 3 má přesnější čas, než Stratum 5.
uzivatel@server:~# ntptrace tik.cesnet.cz tik.cesnet.cz: stratum 2, offset -0.000034, synch distance 0.000233 tak.cesnet.cz: stratum 1, offset 0.000008, synch distance 0.000000, refid 'GPS'
uzivatel@server:~# ntptrace tak.cesnet.cz tak.cesnet.cz: stratum 1, offset 0.000008, synch distance 0.000000, refid 'GPS'
Z uvedeného výstupu vyplývá, že server tak.cesnet.cz je Stratum 1 a tedy má čas blíže k referenčnímu času. Referenční čas je z GPS. Zde je odkaz na další možné referenční používané zdroje časů z hlediska NTP protokolu.
ntpq na debianu/ubuntu
uzivatel@server:~# ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== +46.28.110.244 45.127.113.2 3 u 839 1024 377 15.837 -0.313 0.783 -pyrrha.fi.muni. 195.113.144.238 2 u 26 1024 377 7.997 11.011 12.307 +sip.svinov.net 195.113.144.238 2 u 927 1024 377 9.644 -0.160 0.440 *host189-248-2-8 147.231.100.5 2 u 828 1024 377 11.489 1.152 0.950 uzivatel@server:~# ntpq -p tak.cesnet.cz remote refid st t when poll reach delay offset jitter ============================================================================== oGPS_NMEA(0) .GPS. 0 l 7 64 377 0.000 -0.006 0.003 LOCAL(0) .LOCL. 10 l - 64 0 0.000 0.000 0.000 tik.cesnet.cz 195.113.144.238 2 u 37 64 377 0.456 -0.006 0.007 ntp1.cesnet.cz 195.113.144.238 2 u 43 64 377 0.491 -0.015 0.020 ntp3.cesnet.cz .INIT. 16 u - 64 0 0.000 0.000 0.000 +ntp2.ufe.cz .ATOM. 1 u 39 64 377 0.815 0.087 0.062 ripe-ttm.cesnet 195.113.144.238 2 u 73d 64 0 0.783 0.144 0.000 +time-a.nist.gov .NIST. 1 u 19 64 377 118.498 1.988 0.017
ntpq na Centosu:
yum install ntp ntpdate ntp-doc -y uzivatel@server:~# ntpq -p ntpq: read: Connection refused uzivatel@server:~# ntpq -p tak.cesnet.cz remote refid st t when poll reach delay offset jitter ============================================================================== oGPS_NMEA(0) .GPS. 0 l 4971 64 377 0.000 -0.007 0.004 LOCAL(0) .LOCL. 10 l - 64 0 0.000 0.000 0.000 tik.cesnet.cz 195.113.144.238 2 u 4971 64 377 0.456 -0.006 0.009 ntp1.cesnet.cz 195.113.144.238 2 u 4971 64 377 0.491 -0.015 0.018 ntp3.cesnet.cz .INIT. 16 u - 64 0 0.000 0.000 0.000 +ntp2.ufe.cz .ATOM. 1 u 4971 64 377 0.815 0.087 0.064 ripe-ttm.cesnet 195.113.144.238 2 u 73d 64 0 0.783 0.144 0.000 +time-a.nist.gov .NIST. 1 u 4971 64 377 118.498 1.988 0.018
NTP servery
Jedná se o servery rozmístěné po celém světě, které si aktualizují čas jednou za hodinu. Na Linuxu jejich nastavení najdete v /etc/ntp.conf
(a to jak na RedHatích distribucích vč. Centos a Fedora, tak na Debian/Ubuntu).
Je lokální NTP server dostupný?
Na Ubuntu/Debianu 7:
uzivatel@debianserver:~# /etc/init.d/ntp status [ ok ] NTP server is running. Na Centosu 7:
uzivatel@Centos7server:~# systemctl status ntpd ● ntpd.service - Network Time Service Loaded: loaded (/usr/lib/systemd/system/ntpd.service; disabled; vendor preset: disabled) Active: inactive (dead)
ZoneInfo
Zoneinfo je seznam všech časových zón celé zeměkoule.
uzivatel@server:~# ls /usr/share/zoneinfo/ Africa CST6CDT GB Iceland MET posix UCT America Cuba GB-Eire Indian Mexico posixrules Universal Antarctica EET GMT Iran MST PRC US Arctic Egypt GMT0 iso3166.tab MST7MDT PST8PDT UTC Asia Eire GMT-0 Israel Navajo right WET Atlantic EST GMT+0 Jamaica NZ ROC W-SU Australia EST5EDT Greenwich Japan NZ-CHAT ROK zone.tab Brazil Etc Hongkong Kwajalein Pacific Singapore Zulu Canada Europe HST Libya Poland SystemV CET Factory Chile localtime Portugal Turkey Jak si nastavit čas jako je třeba v Zurichu? cp /etc/localtime /tmp ln -sf /usr/share/zoneinfo/Europe/Zurich /etc/localtime
Pro navrácení zpět:
cp /tmp/localtime /etc/