Linux Time Synchronization: NTP, Chrony at systemd-timesyncd

Linux Time Synchronization: NTP, Chrony at systemd-timesyncd
Karamihan sa mga tao ay sumusubaybay sa oras. Bumangon tayo sa oras upang tapusin ang ating mga ritwal sa umaga at pumunta sa trabaho, magpahinga para sa tanghalian, matugunan ang mga deadline ng proyekto, ipagdiwang ang mga kaarawan at pista opisyal, sumakay ng eroplano, at iba pa.

Bukod dito: ang ilan sa atin ay nahuhumaling sa oras. Ang aking relo ay solar powered at nakukuha nito ang tumpak na oras mula sa National Institute of Standards and Technology (NIST) sa Fort Collins, Colorado sa pamamagitan ng longwave radio WWVB. Ang mga signal ng oras ay naka-synchronize sa isang atomic na orasan na matatagpuan din sa Fort Collins. Ang aking Fitbit ay nagsi-sync sa aking telepono, na nagsi-sync sa server NTP, na kalaunan ay nagsi-synchronize sa atomic na orasan.

Sinusubaybayan din ng mga device ang oras.

Maraming dahilan kung bakit kailangan ng ating mga device at computer ng tumpak na oras. Halimbawa, sa pagbabangko, stock market at iba pang mga negosyong pinansyal, ang mga transaksyon ay dapat isagawa sa tamang pagkakasunud-sunod, at ang mga tumpak na pagkakasunud-sunod ng oras ay kritikal dito.

Ang aming mga telepono, tablet, kotse, GPS system at computer ay nangangailangan ng tumpak na mga setting ng oras at petsa. Gusto kong ipakita ng orasan sa desktop ng aking computer ang tamang oras. Gusto kong lumabas ang mga paalala sa aking lokal na kalendaryo sa tamang oras. Tinitiyak din ng tamang timing na ang mga cron at systemd na trabaho ay magsisimula sa tamang oras.

Ang petsa at oras ay mahalaga din para sa pag-log, kaya medyo mas madaling makahanap ng ilang mga log batay sa petsa at oras. Halimbawa, minsan akong nagtrabaho sa DevOps (hindi nila ito tinawag noon) na nagse-set up ng isang email system sa North Carolina State. Nagproseso kami noon ng mahigit 20 milyong email sa isang araw. Ang pagsubaybay sa email sa isang serye ng mga server o pagtukoy sa eksaktong pagkakasunud-sunod ng mga kaganapan gamit ang mga log file sa mga host na nakakalat sa heograpiya ay maaaring maging mas madali kung ang mga kaukulang computer ay naka-synchronize sa oras.

Isang beses - maraming oras

Dapat malaman ng mga host ng Linux na mayroong oras ng system at oras ng RTC. Ang RTC (Real Time Clock) ay medyo kakaiba at hindi partikular na tumpak na pangalan para sa isang hardware clock.

Ang orasan ng hardware ay patuloy na tumatakbo, kahit na naka-off ang computer, gamit ang baterya sa motherboard ng system. Ang pangunahing function ng RTC ay mag-imbak ng oras kapag ang isang koneksyon sa isang time server ay hindi magagamit. Noong mga araw na imposibleng kumonekta sa isang server ng oras sa pamamagitan ng Internet, ang bawat computer ay kailangang magkaroon ng tumpak na panloob na orasan. Kailangang i-access ng mga operating system ang RTC sa panahon ng boot, at kailangang manu-manong itakda ng user ang oras ng system gamit ang interface ng configuration ng BIOS hardware upang matiyak na tama ito.

Hindi naiintindihan ng mga orasan ng hardware ang konsepto ng mga time zone; Oras lang ang iniimbak ng RTC, hindi time zone o offset mula sa UTC (Coordinated Universal Time, na kilala rin bilang GMT o Greenwich Mean Time). Maaari mong i-install ang RTC gamit ang isang tool na tatalakayin ko mamaya sa artikulong ito.

Ang oras ng system ay ang oras na ipinapakita ng OS sa orasan ng GUI sa iyong desktop, sa output ng command ng petsa, sa mga timestamp ng log. Nalalapat din ito sa mga oras kung kailan nilikha, binago, at binuksan ang mga file.

Sa pahina tao para sa rtc mayroong kumpletong paglalarawan ng RTC at system clock.

Anong meron sa NTP?

Ang mga computer sa buong mundo ay gumagamit ng NTP (Network Time Protocol) upang i-synchronize ang kanilang oras sa mga karaniwang reference na orasan sa Internet gamit ang isang hierarchy ng mga NTP server. Ang mga pangunahing server ng oras ay matatagpuan sa Layer 1, at sila ay direktang konektado sa iba't ibang mga serbisyo ng pambansang oras sa Layer 0 sa pamamagitan ng satellite, radyo, o kahit na mga modem sa mga linya ng telepono. Ang mga serbisyo sa oras sa antas 0 ay maaaring isang atomic na orasan, isang radio receiver na nakatutok sa mga signal na ipinadala ng mga atomic na orasan, o isang GPS receiver na gumagamit ng mga high-precision na signal ng orasan na ipinadala ng mga GPS satellite.

Ang karamihan sa mga reference server ay may ilang libong pampublikong NTP stratum 2 server na bukas sa lahat. Maraming mga organisasyon at user (kabilang ako mismo) na may malaking bilang ng mga host na nangangailangan ng isang NTP server ang pinipiling mag-install ng kanilang sariling mga time server, kaya isang lokal na host lamang ang nag-a-access sa stratum 2 o 3. Pagkatapos ay i-configure nila ang natitirang mga host sa network upang gamitin ang server ng lokal na oras. Sa kaso ng aking home network, ito ay isang layer 3 server.

Iba't ibang pagpapatupad ng NTP

Ang orihinal na pagpapatupad ng NTP ay ntpd. Ito ay sinamahan ng dalawang mas bago, chronyd at systemd-timesyncd. Lahat ng tatlo ay nag-synchronize ng oras ng localhost sa isang server ng oras ng NTP. Ang serbisyo ng systemd-timesyncd ay hindi kasing maaasahan ng chronyd, ngunit ito ay sapat para sa karamihan ng mga layunin. Kung ang RTC ay hindi naka-synchronize, maaari nitong unti-unting ayusin ang oras ng system upang mag-synchronize sa NTP server kapag bahagyang gumagalaw ang oras ng lokal na system. Ang serbisyo ng systemd-timesync ay hindi maaaring gamitin bilang isang server ng oras.

Chrony ay isang pagpapatupad ng NTP na naglalaman ng dalawang programa: ang chronyd daemon at isang command line interface na tinatawag na chronyc. May ilang feature ang Chrony na kailangan lang sa maraming kaso:

  • Maaaring mag-sync ang Chrony sa isang server ng oras nang mas mabilis kaysa sa lumang serbisyo ng ntpd. Ito ay mabuti para sa mga laptop o desktop na hindi tumatakbo sa lahat ng oras.
  • Maaari itong magbayad para sa mga pagbabagu-bago sa bilis ng orasan, tulad ng kapag ang host ay natutulog o pumasok sa sleep mode, o kapag ang bilis ng orasan ay nagbabago dahil sa frequency hopping, na nagpapabagal sa bilis ng orasan sa ilalim ng mababang load.
  • Nilulutas nito ang mga problema sa timing na may kaugnayan sa hindi matatag na koneksyon sa network o pagsisikip ng network.
  • Kinokontrol nito ang latency ng network.
  • Pagkatapos ng paunang pag-synchronize ng oras, hindi kailanman hihinto ng Chrony ang orasan. Nagbibigay ito ng matatag at pare-parehong timing para sa maraming serbisyo at application ng system.
  • Maaaring gumana ang Chrony kahit walang koneksyon sa network. Sa kasong ito, maaaring manu-manong i-update ang lokal na host o server.
  • Maaaring kumilos si Chrony bilang isang NTP server.

Muli, ang NTP ay isang protocol na maaaring ipatupad sa isang Linux host gamit ang Chrony o systemd-timesyncd.

Ang mga pakete ng NTP, Chrony, at systemd-timesyncd RPM ay magagamit sa karaniwang mga repositoryo ng Fedora. Ang systemd-udev RPM ay isang kernel event manager na naka-install bilang default sa Fedora, ngunit hindi kinakailangan para sa paggamit.

Maaari mong i-install ang tatlo at lumipat sa pagitan ng mga ito, ngunit lilikha ito ng hindi kinakailangang pananakit ng ulo. Kaya mas mabuting huwag na lang. Ang mga modernong release ng Fedora, CentOS at RHEL ay lumipat sa Chrony bilang karaniwang pagpapatupad, at bilang karagdagan mayroon silang systemd-timesyncd. Sa tingin ko, gumagana nang maayos ang Chrony, nagbibigay ng mas mahusay na interface kaysa sa serbisyo ng NTP, nagbibigay ng higit pang impormasyon at higit na kontrol, na tiyak na makakaakit sa mga administrator ng system.

Hindi pagpapagana ng mga serbisyo ng NTP

Maaaring mayroon nang serbisyo ng NTP na tumatakbo ang iyong host. Kung gayon, kailangan mong i-disable ito bago lumipat sa ibang bagay. Nagkaroon ako ng chronyd running kaya ginamit ko ang mga sumusunod na command para ihinto at i-disable ito. Patakbuhin ang naaangkop na mga utos para sa anumang NTP daemon na iyong pinapatakbo sa iyong host:

[root@testvm1 ~]# systemctl disable chronyd ; systemctl stop chronyd
Removed /etc/systemd/system/multi-user.target.wants/chronyd.service.
[root@testvm1 ~]#

Tingnan kung ang serbisyo ay huminto at hindi pinagana:

[root@testvm1 ~]# systemctl status chronyd
● chronyd.service - NTP client/server
     Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:chronyd(8)
             man:chrony.conf(5)
[root@testvm1 ~]#

Sinusuri ang katayuan bago magsimula

Ang katayuan ng pag-synchronize ng system clock ay nagbibigay-daan sa iyo upang matukoy kung tumatakbo ang serbisyo ng NTP. Dahil hindi mo pa nasisimulan ang NTP, ang timesync-status na utos ay magpaparamdam dito:

[root@testvm1 ~]# timedatectl timesync-status
Failed to query server: Could not activate remote peer.

Ang isang direktang kahilingan sa katayuan ay nagbibigay ng mahalagang impormasyon. Halimbawa, ang timedatectl na utos na walang argumento o mga parameter ay nagpapatupad ng status subcommand bilang default:

[root@testvm1 ~]# timedatectl status
           Local time: Fri 2020-05-15 08:43:10 EDT  
           Universal time: Fri 2020-05-15 12:43:10 UTC  
                 RTC time: Fri 2020-05-15 08:43:08      
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: no                          
              NTP service: inactive                    
          RTC in local TZ: yes                    

Warning: The system is configured to read the RTC time in the local time zone.
         This mode cannot be fully supported. It will create various problems
         with time zone changes and daylight saving time adjustments. The RTC
         time is never updated, it relies on external facilities to maintain it.
         If at all possible, use RTC in UTC by calling
         'timedatectl set-local-rtc 0'.
[root@testvm1 ~]#

Bibigyan ka nito ng lokal na oras ng iyong host, oras ng UTC, at oras ng RTC. Sa kasong ito, nakatakda ang oras ng system sa time zone ng America/New_York (TZ), nakatakda ang RTC sa lokal na time zone, at hindi aktibo ang serbisyo ng NTP. Ang oras ng RTC ay nagsimula nang bahagyang lumihis mula sa oras ng system. Normal ito para sa mga system na ang mga orasan ay hindi naka-synchronize. Ang halaga ng offset sa host ay depende sa oras na lumipas mula noong huling na-synchronize ang system.

Nakatanggap din kami ng babala tungkol sa paggamit ng lokal na oras para sa RTC - nalalapat ito sa mga pagbabago sa time zone at mga setting ng daylight saving time. Kung naka-off ang computer kapag kailangang gumawa ng mga pagbabago, hindi magbabago ang oras ng RTC. Ngunit para sa mga server o iba pang mga host na gumagana sa buong orasan, hindi ito isang problema. Bukod pa rito, ang anumang serbisyo na nagbibigay ng pag-synchronize ng oras ng NTP ay magsasaayos ng oras ng host sa panahon ng paunang yugto ng pagsisimula, upang kapag kumpleto na ang startup, magiging tama muli ang oras.

Pagtatakda ng time zone

Karaniwan, tinutukoy mo ang time zone sa panahon ng pamamaraan ng pag-install, at hindi mo na kailangang baguhin ito sa ibang pagkakataon. Gayunpaman, may mga pagkakataong kailangan mong baguhin ang iyong time zone. Mayroong ilang mga tool na maaaring makatulong. Gumagamit ang Linux ng mga time zone file upang matukoy ang lokal na time zone ng host. Ang mga file na ito ay matatagpuan sa direktoryo /usr/share/zoneinfo. Bilang default, para sa aking time zone, isinusulat ito ng system: /etc/ localtime -> ../usr/share/zoneinfo/America/New_York. Ngunit hindi mo kailangang malaman ang mga ganitong subtlety para mabago ang iyong time zone.

Ang susi ay malaman ang opisyal na pangalan ng time zone para sa iyong lokasyon at ang kaukulang command. Sabihin nating gusto mong baguhin ang time zone sa Los Angeles:


[root@testvm2 ~]# timedatectl list-timezones | column
<SNIP>
America/La_Paz                  Europe/Budapest
America/Lima                    Europe/Chisinau
America/Los_Angeles             Europe/Copenhagen
America/Maceio                  Europe/Dublin
America/Managua                 Europe/Gibraltar
America/Manaus                  Europe/Helsinki
<SNIP>

Maaari mo na ngayong itakda ang iyong time zone. Ginamit ko ang utos ng petsa upang suriin ang mga pagbabago, ngunit maaari mo ring gamitin ang timedatectl:

[root@testvm2 ~]# date
Tue 19 May 2020 04:47:49 PM EDT
[root@testvm2 ~]# timedatectl set-timezone America/Los_Angeles
[root@testvm2 ~]# date
Tue 19 May 2020 01:48:23 PM PDT
[root@testvm2 ~]#

Maaari mo na ngayong baguhin muli ang time zone ng iyong host sa lokal na oras.

systemd-timesyncd

Ang systemd timesync daemon ay nagbibigay ng isang pagpapatupad ng NTP na madaling pamahalaan sa isang systemd na konteksto. Ito ay naka-install bilang default sa Fedora at Ubuntu. Gayunpaman, ito ay tumatakbo bilang default sa Ubuntu lamang. Hindi ako sigurado tungkol sa iba pang mga pamamahagi. Maaari mong suriin para sa iyong sarili:

[root@testvm1 ~]# systemctl status systemd-timesyncd

Pag-configure ng systemd-timesyncd

Ang configuration file para sa systemd-timesyncd ay /etc/systemd/timesyncd.conf. Ito ay isang simpleng file na may mas kaunting mga opsyon na pinagana kaysa sa lumang NTP at chronyd na mga serbisyo. Narito ang mga nilalaman ng file na ito (nang walang karagdagang mga pagbabago) sa aking Fedora virtual machine:

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See timesyncd.conf(5) for details.

[Time]
#NTP=
#FallbackNTP=0.fedora.pool.ntp.org 1.fedora.pool.ntp.org 2.fedora.pool.ntp.org 3.fedora.pool.ntp.org
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

Ang tanging seksyon na naglalaman nito maliban sa mga komento ay [Oras]. Ang lahat ng iba pang mga linya ay nagkomento. Ito ang mga default na halaga at hindi kailangang baguhin (maliban kung mayroon kang dahilan upang gawin ito). Kung wala kang isang NTP time server na tinukoy sa NTP= line, ang Fedora ay nagde-default sa Fedora fallback time server. Karaniwan kong idinaragdag ang aking time server:

NTP=myntpserver

Patakbuhin ang timesync

Maaari mong simulan at gawing aktibo ang systemd-timesyncd tulad nito:

[root@testvm2 ~]# systemctl enable systemd-timesyncd.service
Created symlink /etc/systemd/system/dbus-org.freedesktop.timesync1.service β†’ /usr/lib/systemd/system/systemd-timesyncd.service.
Created symlink /etc/systemd/system/sysinit.target.wants/systemd-timesyncd.service β†’ /usr/lib/systemd/system/systemd-timesyncd.service.
[root@testvm2 ~]# systemctl start systemd-timesyncd.service
[root@testvm2 ~]#

Pagtatakda ng orasan ng hardware

Ito ang hitsura ng sitwasyon pagkatapos patakbuhin ang timesyncd:

[root@testvm2 systemd]# timedatectl
               Local time: Sat 2020-05-16 14:34:54 EDT  
           Universal time: Sat 2020-05-16 18:34:54 UTC  
                 RTC time: Sat 2020-05-16 14:34:53      
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: yes                          
              NTP service: active                      
          RTC in local TZ: no    

Sa una, ang pagkakaiba sa pagitan ng RTC at lokal na oras (EDT) ay mas mababa sa isang segundo, at ang pagkakaiba ay tataas ng ilang segundo pa sa susunod na mga araw. Dahil ang RTC ay walang konsepto ng mga time zone, ang timedatectl command ay dapat magsagawa ng paghahambing upang matukoy ang tamang time zone. Kung ang oras ng RTC ay hindi eksaktong tumutugma sa lokal na oras, hindi ito tumutugma sa lokal na time zone.

Naghahanap ng higit pang impormasyon, tiningnan ko ang katayuan ng systemd-timesync at nakita ko ito:

[root@testvm2 systemd]# systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/usr/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: disabled)
     Active: active (running) since Sat 2020-05-16 13:56:53 EDT; 18h ago
       Docs: man:systemd-timesyncd.service(8)
   Main PID: 822 (systemd-timesyn)
     Status: "Initial synchronization to time server 163.237.218.19:123 (2.fedora.pool.ntp.org)."
      Tasks: 2 (limit: 10365)
     Memory: 2.8M
        CPU: 476ms
     CGroup: /system.slice/systemd-timesyncd.service
             └─822 /usr/lib/systemd/systemd-timesyncd

May 16 09:57:24 testvm2.both.org systemd[1]: Starting Network Time Synchronization...
May 16 09:57:24 testvm2.both.org systemd-timesyncd[822]: System clock time unset or jumped backwards, restoring from recorded timestamp: Sat 2020-05-16 13:56:53 EDT
May 16 13:56:53 testvm2.both.org systemd[1]: Started Network Time Synchronization.
May 16 13:57:56 testvm2.both.org systemd-timesyncd[822]: Initial synchronization to time server 163.237.218.19:123 (2.fedora.pool.ntp.org).
[root@testvm2 systemd]#

Tandaan ang mensahe ng log na nagsasabing ang oras ng system ay hindi nakatakda o na-reset. Itinatakda ng serbisyong Timesync ang oras ng system batay sa isang timestamp. Ang mga timestamp ay pinapanatili ng timesync daemon at ginagawa sa tuwing may matagumpay na pag-synchronize.

Ang utos ng timedatectl ay walang kakayahang kunin ang halaga ng orasan ng hardware mula sa orasan ng system. Maaari lamang nitong itakda ang oras at petsa mula sa halagang ipinasok sa command line. Maaari mong itakda ang RTC sa parehong halaga ng oras ng system gamit ang hwclock command:

[root@testvm2 ~]# /sbin/hwclock --systohc --localtime
[root@testvm2 ~]# timedatectl
               Local time: Mon 2020-05-18 13:56:46 EDT  
           Universal time: Mon 2020-05-18 17:56:46 UTC  
                 RTC time: Mon 2020-05-18 13:56:46      
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: yes                          
              NTP service: active                      
          RTC in local TZ: yes

Ang --localtime na opsyon ay nagsasabi sa hardware clock na ipakita ang lokal na oras sa halip na UTC.

Bakit kailangan mo ng RTC?

Ang anumang pagpapatupad ng NTP ay magtatakda ng orasan ng system sa panahon ng pagsisimula. At bakit naman RTC? Hindi ito ganap na totoo: mangyayari lamang ito kung mayroon kang koneksyon sa network sa server ng oras. Gayunpaman, maraming mga sistema ang walang patuloy na access sa isang koneksyon sa network, kaya ang isang orasan ng hardware ay kapaki-pakinabang upang maitakda ng Linux ang oras ng system batay dito. Ito ay mas mahusay kaysa sa manu-manong pagtatakda ng oras, kahit na ito ay maaaring lumihis mula sa real time.

Konklusyon

Sinasaklaw ng artikulong ito ang ilang tool para sa pamamahala ng petsa, oras, at time zone. Ang systemd-timesyncd tool ay nagbibigay ng isang NTP client na maaaring i-synchronize ang oras sa lokal na host sa isang NTP server. Gayunpaman, ang systemd-timesyncd ay hindi nagbibigay ng serbisyo ng server, kaya kung kailangan mo ng NTP server sa iyong network, dapat kang gumamit ng ibang bagay - tulad ng Chrony - upang kumilos bilang server.

Mas gusto kong magkaroon ng iisang pagpapatupad para sa anumang serbisyo sa aking network, kaya gumagamit ako ng Chrony. Kung hindi mo kailangan ng lokal na NTP server o kung hindi mo iniisip na gamitin ang Chrony bilang server at systemd-timesyncd bilang SNTP client. Pagkatapos ng lahat, hindi na kailangang gumamit ng mga karagdagang feature ng Chrony bilang isang kliyente kung nasiyahan ka sa functionality ng systemd-timesyncd.

Isa pang tala: hindi mo kailangang gumamit ng systemd tool upang ipatupad ang NTP. Maaari kang gumamit ng mas lumang bersyon ng ntpd, Chrony, o isa pang pagpapatupad ng NTP. Pagkatapos ng lahat, ang systemd ay binubuo ng isang malaking bilang ng mga serbisyo; marami sa mga ito ay opsyonal, kaya maaari mong hindi paganahin ang mga ito at gumamit ng ibang bagay sa halip. Ito ay hindi isang malaking monolitikong halimaw. Maaaring hindi mo gusto ang systemd o mga bahagi nito, ngunit dapat kang gumawa ng matalinong desisyon.

Gusto ko ang pagpapatupad ng NTP ng systemd, ngunit mas gusto ko ang Chrony dahil mas nababagay ito sa aking mga pangangailangan. Linux ito, baby -)

Sa Mga Karapatan ng Pag-advertise

Nag-aalok ang VDSina mga server para sa anumang gawain, isang malaking seleksyon ng mga operating system para sa awtomatikong pag-install, posibleng mag-install ng anumang OS mula sa iyong sarili ISO, komportable control panel sariling pag-unlad at pang-araw-araw na pagbabayad. Let us remind you na meron tayong eternal servers na siguradong timeless πŸ˜‰

Linux Time Synchronization: NTP, Chrony at systemd-timesyncd

Pinagmulan: www.habr.com

Magdagdag ng komento