Сінхранізацыя часу ў Linux: NTP, Chrony і systemd-timesyncd

Сінхранізацыя часу ў Linux: NTP, Chrony і systemd-timesyncd
Большасць людзей сочаць за часам. Мы ўстаём своечасова, каб выканаць нашы ранішнія рытуалы і адправіцца на працу, зрабіць перапынак на абед, укласціся ў тэрміны праекту, адзначыць дні нараджэння і святы, сесці на самалёт і гэтак далей.

Больш за тое: некаторыя з нас апантаныя часам. Мой гадзіннік сілкуецца ад сонечнай энергіі і атрымліваюць дакладны час з Нацыянальнага інстытута стандартаў і тэхналогій (NIST) у Форт-Колінз (штат Каларада) праз даўгахвалевую радыёстанцыю WWVB. Сігналы часу сінхранізуюцца з атамнымі гадзінамі, таксама размешчанымі ў форце Колінз. Мой Fitbit сінхранізуецца з маім тэлефонам, які сінхранізуецца з серверам NTP, які ў канчатковым выніку сінхранізуецца з атамнымі гадзінамі.

Прылады таксама сочаць за часам

Ёсць шмат прычын, па якіх нашым прыладам і кампутарам трэба дакладны час. Напрыклад, у банкаўскай сферы, на фондавых рынках і іншых фінансавых прадпрыемствах транзакцыі павінны выконвацца ў належным парадку, і для гэтага крытычна важныя дакладныя часовыя паслядоўнасці.

Нашы тэлефоны, планшэты, аўтамабілі, сістэмы GPS і кампутары патрабуюць дакладнай наладкі часу і даты. Я хачу, каб гадзіннік на працоўным стале майго кампутара паказваў правільны час. Я хачу, каб у маім лакальным календары напамінкі з'яўляліся ў патрэбны час. Правільны час таксама гарантуе, што заданні cron і systemd запускаліся ў патрэбны час.

Дата і час таксама важныя для вядзення часопіса, таму крыху прасцей знайсці тыя ці іншыя логі, арыентуючыся па даце і часу. Напрыклад, аднойчы я працаваў у DevOps (у той час яго так не называлі) і займаўся настройкай сістэмы электроннай пошты ў штаце Паўночная Караліна. Раней мы апрацоўвалі больш за 20 мільёнаў лістоў у дзень. Адсочванне электроннай пошты праз серыю сервераў або вызначэнне дакладнай паслядоўнасці падзей з выкарыстаннем файлаў часопісаў на геаграфічна разнесеных хастах можа быць нашмат прасцей, калі адпаведныя кампутары сінхранізаваны па часе.

Час адно - гадзін шмат

Госты Linux павінны ўлічваць, што існуе сістэмны час і час RTC. RTC (Real Time Clock — гадзіннік рэальнага часу) з'яўляецца крыху дзіўным і не асабліва дакладным назвай для апаратных гадзін.

Апаратны гадзіннік працуе бесперапынна, нават калі кампутар выключаны, выкарыстоўваючы акумулятар на матчынай плаце сістэмы. Асноўная функцыя RTC - захоўваць час, калі злучэнне з серверам часу недаступнае. У тыя часы, калі нельга было падлучыцца да сервера часу праз інтэрнэт кожны кампутар павінен быў мець дакладныя ўнутраныя гадзіны. Аперацыйныя сістэмы павінны былі звяртацца да RTC падчас загрузкі, і карыстач павінен быў уручную ўсталяваць сістэмны час, выкарыстаючы апаратны інтэрфейс канфігурацыі BIOS, каб пераканацца, што яно правільнае.

Апаратны гадзіннік не разумее канцэпцыю гадзінных паясоў; у RTC захоўваецца толькі час, а не гадзінны пояс або зрушэнне ад UTC (Сусветнае каардынаваны час, якое таксама вядома як GMT або сярэдні час па Грынвічы). Вы можаце ўсталяваць RTC з дапамогай інструмента, аб якім я раскажу пазней у гэтым артыкуле.

Сістэмны час - гэта час, якое АС адлюстроўвае на гадзінніках GUI на вашым працоўным стале, у выходных дадзеных каманды date, у пазнаках часу часопісаў. Гэта таксама адносіцца да часу стварэння, змены і адкрыцця файлаў.

На старонцы man для rtc ёсць поўнае апісанне RTC і сістэмных гадзін.

Што тамака ў NTP?

Кампутары ва ўсім свеце выкарыстоўваюць NTP (сеткавы пратакол часу) для сінхранізацыі свайго часу са стандартным эталонным гадзіннікам праз інтэрнэт з дапамогай іерархіі сервераў NTP. Асноўныя серверы часу знаходзяцца на ўзроўні 1, і яны напрамую падключаны да розных нацыянальных службаў часу на ўзроўні 0 праз спадарожнік, радыё ці нават мадэмы па тэлефонных лініях. Службы часу на ўзроўні 0 могуць быць атамнымі гадзінамі, радыёпрымачом, які наладжаны на сігналы, якія перадаюцца атамнымі гадзінамі, або прымачом GPS, выкарыстоўвалым высокадакладныя сігналы гадзін, якія перадаюцца спадарожнікамі GPS.

На пераважнай большасці эталонных сервераў адчынена некалькі тысяч агульнадаступных сервераў NTP stratum 2, якія даступныя для ўсіх. Шматлікія арганізацыі і карыстачы (уключаючы мяне) з вялікай колькасцю хастоў, якім патрабуецца NTP-сервер, аддаюць перавагу ўсталёўваць свае ўласныя серверы часу, таму толькі адзін лакальны хост звяртаецца да stratum 2 ці 3. Затым яны наладжваюць пакінутыя вузлы ў сетцы для выкарыстання лакальнага сервера часу . У выпадку маёй хатняй сеткі гэта сервер узроўня 3.

Розныя рэалізацыі NTP

Першапачатковая рэалізацыя NTP – гэта ntpd. Затым да яе далучыліся дзве навейшых, chronyd і systemd-timesyncd. Усе тры сінхранізуюць час лакальнага хаста з серверам часу NTP. Служба systemd-timesyncd не так надзейная, як chronyd, але гэтага дастаткова для большасці мэт. Калі RTC не сінхранізаваны, яна можа паступова карэктаваць сістэмны час, каб сінхранізавацца з NTP-серверам, калі лакальны сістэмны час трохі ссоўваецца. Служба systemd-timesync не можа выкарыстоўвацца ў якасці сервера часу.

Хранія - гэта рэалізацыя NTP, якая змяшчае дзве праграмы: дэман chronyd і інтэрфейс каманднага радка пад назвай chronyc. У Chrony ёсць некаторыя функцыі, якія ў шматлікіх выпадках проста незаменныя:

  • Chrony можа сінхранізавацца з серверам часу нашмат хутчэй, чым стары сэрвіс ntpd. Гэта добра для наўтбукаў або настольных кампутараў, якія не працуюць увесь час.
  • Ён можа кампенсаваць ваганні тактавых частот, напрыклад, калі хост перамыкаецца ў спячы рэжым ці ўваходзіць у спячы рэжым, ці калі тактавая частата змяняецца з-за скачкападобнай змены частаты, якое запавольвае тактавыя частоты пры нізкіх нагрузках.
  • Ён вырашае праблемы з часам, звязаныя з нестабільным сеткавым злучэннем ці перагрузкай сеткі.
  • Ён рэгулюе затрымкі ў сетцы.
  • Пасля пачатковай часовай сінхранізацыі Chrony ніколі не спыняе гадзіннік. Гэта забяспечвае стабільныя і ўзгодненыя часовыя інтэрвалы для многіх сістэмных службаў і дадаткаў.
  • Chrony можа працаваць нават без падлучэння да сеткі. У гэтым выпадку лакальны хост ці сервер можна абнавіць уручную.
  • Chrony можа выступаць у якасці NTP-сервера.

Яшчэ раз: NTP – гэта пратакол, які можа быць рэалізаваны на хасце Linux з выкарыстаннем Chrony або systemd-timesyncd.

RPM-пакеты NTP, Chrony і systemd-timesyncd даступныя ў стандартных рэпазітарах Fedora. RPM systemd-udev - гэта мэнэджар падзей ядра, які ў Fedora усталяваны па змаўчанні, але не з'яўляецца абавязковым для выкарыстання.

Вы можаце ўсталяваць усе тры і перамыкацца паміж імі, але гэта створыць лішні галаўны боль. Так што лепей не варта. Сучасныя рэлізы Fedora, CentOS і RHEL перайшлі на Chrony як стандартную рэалізацыю, і акрамя таго, у іх ёсць systemd-timesyncd. Я лічу, што Chrony працуе добра, забяспечвае лепшы інтэрфейс, чым служба NTP, падае значна больш інфармацыі і падвышае кантроль, што безумоўна спадабаецца сістэмным адміністратарам.

Адключэнне службаў NTP

Магчыма, на вашым хасце ўжо запушчана служба NTP. Калі гэта так, вам трэба адключыць яе перад пераключэннем на нешта іншае. У мяне быў запушчаны chronyd, таму я выкарыстоўваў наступныя каманды, каб спыніць і адключыць яго. Запусціце адпаведныя каманды для любога дэмана NTP, які вы карыстаецеся на сваім хасце:

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

Праверце, што служба спынена і адключана:

[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 ~]#

Праверка статусу перад запускам

Статус сістэмнай сінхранізацыі гадзін дазваляе вызначыць, ці запушчана служба NTP. Паколькі вы яшчэ не запусцілі NTP, каманда timesync-status намякне на гэта:

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

Прамы запыт статусу дае важную інфармацыю. Напрыклад, каманда timedatectl без аргумента ці параметраў выконвае падкаманду status па змаўчанні:

[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 ~]#

Дык вы атрымаеце мясцовы час для вашага хаста, час UTC і час RTC. У дадзеным выпадку сістэмны час усталяваны на часавы пояс America / New_York (TZ), RTC усталяваны на час у мясцовым часавым поясе, а служба NTP не актыўная. Час RTC пачало крыху адхіляцца ад сістэмнага часу. Гэта нармальна для сістэм, гадзіннік якіх не быў сінхранізаваны. Велічыня зрушэння на хасце залежыць ад часу, які прайшоў з моманту апошняй сінхранізацыі сістэмы.

Мы таксама атрымалі папярэджанне аб выкарыстанні мясцовага часу для RTC - гэта адносіцца да змен гадзіннага пояса і налад летняга часу. Калі кампутар выключаны ў той момант, калі неабходна ўнесці змены, час RTC не зменіцца. Але для сервераў ці іншых хастоў, якія працуюць кругласутачна, гэта ўвогуле не праблема. Акрамя таго, любая служба, якая забяспечвае сінхранізацыю часу NTP, будзе карэктаваць час хаста яшчэ на пачатковым этапе запуску, таму пасля завяршэння запуску час ізноў стане правільным.

Устаноўка часавога пояса

Звычайна вы паказваеце гадзінны пояс падчас працэдуры ўстаноўкі, і ў вас няма задачы мяняць яго ў далейшым. Аднак бываюць выпадкі, калі неабходна змяніць гадзінны пояс. Ёсць некалькі інструментаў, якія могуць дапамагчы. Для вызначэння мясцовага гадзіннага пояса хаста Linux выкарыстоўвае файлы гадзінных паясоў. Гэтыя файлы знаходзяцца ў каталогу /usr/share/zoneinfo. Па змаўчанні для майго часавага пояса сістэма прапісвае вось гэта: /etc/ localtime -> ../usr/share/zoneinfo/America/New_York. Але вам не трэба ведаць такія тонкасці, каб змяніць гадзінны пояс.

Галоўнае - ведаць афіцыйную назву часавага пояса для вашага месцазнаходжання і адпаведную каманду. Скажам, вы жадаеце змяніць гадзінны пояс на Лос-Анджэлес:


[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>

Цяпер вы можаце ўсталяваць гадзінны пояс. Я выкарыстаў каманду date для праверкі змен, але вы таксама можаце выкарыстоўваць 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 ~]#

Цяпер ізноў можаце змяніць гадзінны пояс свайго хаста на мясцовы час.

systemd-timesyncd

Дэман systemd timesync дае рэалізацыю NTP, якой лёгка кіраваць у кантэксце systemd. Ён усталёўваецца па змаўчанні ў Fedora і Ubuntu. Аднак запускаецца ён па змаўчанні толькі ў Ubuntu. Я не ўпэўнены наконт іншых дыстрыбутываў. Вы можаце праверыць у сябе самі:

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

Канфігураванне systemd-timesyncd

Файл канфігурацыі для systemd-timesyncd – гэта /etc/systemd/timesyncd.conf. Гэта просты файл з меншай колькасцю уключаных опцый, чым у старых сэрвісах NTP і chronyd. Вось змесціва гэтага файла (без дадатковых змен) на маёй віртуальнай машыне з Fedora:

#  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

Адзіная частка, які ён утрымоўвае, акрамя каментароў, гэта [Time]. Усе астатнія радкі закаментаваны. Гэта значэння па змаўчанні, іх не трэба мяняць (калі ў вас няма для гэтага прычын). Калі ў вас няма сервера часу NTP, вызначанага ў радку NTP =, па змаўчанні ў Fedora выкарыстоўваецца рэзервовы сервер часу Fedora. Я звычайна дадаю свой сервер часу:

NTP=myntpserver

Запуск timesync

Запусціць і зрабіць systemd-timesyncd актыўным можна так:

[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 ~]#

Устаноўка апаратнага гадзінніка

Вось як выглядае сітуацыя пасля запуску 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    

Першапачаткова розніца паміж RTC і мясцовым часам (EDT) не перавышае секунды, і разыходжанне ўзрастае яшчэ на пару секунд на працягу наступных некалькіх дзён. Паколькі ў RTC няма паняцця часавых паясоў, каманда timedatectl павінна выканаць параўнанне, каб вызначыць патрэбны гадзінны пояс. Калі час RTC сапраўды не адпавядае мясцоваму часу, то значыць, яно не адпавядае і мясцоваму гадзіннаму поясу.

У пошуках дадатковай інфармацыі я праверыў стан systemd-timesync і выявіў вось што:

[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]#

Звярніце ўвагу на паведамленне часопіса, у якім гаворыцца, што сістэмны час не ўстаноўлены або скінуты назад. Служба Timesync усталёўвае сістэмны час на аснове часавай пазнакі. Пазнакі часу падтрымліваюцца дэманам timesync і ствараюцца пры кожнай паспяховай сінхранізацыі.

Каманда timedatectl не мае магчымасці ўзяць значэнне апаратнага гадзінніка з сістэмнага гадзінніка. Яна можа ўсталяваць час і дату толькі са значэння, уведзенага ў камандным радку. Вы можаце ўсталяваць RTC на тое ж значэнне, што і сістэмны час, выкарыстоўваючы каманду hwclock:

[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

Опцыя -localtime кажа аб тым, што апаратныя гадзіны паказваюць мясцовы час, а не UTC.

Навошта вам увогуле RTC?

Любая рэалізацыя NTP усталюе сістэмныя гадзіны падчас запуску. І навошта тады RTC? Гэта не зусім так: гэта адбудзецца толькі ў выпадку, калі ў вас есць сеткавае злучэнне з серверам часу. Аднак шматлікія сістэмы не маюць сталага доступу да сеткавага злучэння, таму апаратныя гадзіны карысныя для таго, каб Linux мог на іх аснове ўсталяваць сістэмны час. Гэта лепш, чым усталёўка часу ўручную, нават калі яно можа адхіляцца ад рэальнага часу.

Заключэнне

У гэтым артыкуле разгледжаны некаторыя інструменты для кіравання датай, часам і часавымі паясамі. Інструмент systemd-timesyncd дае NTP-кліента, які можа сінхранізаваць час на лакальным хасце з NTP-серверам. Аднак systemd-timesyncd не дае серверную службу, таму, калі вам патрэбен NTP-сервер у вашай сетцы, вы павінны выкарыстоўваць нешта яшчэ - напрыклад, Chrony, для працы ў якасці сервера.

Я аддаю перавагу мець адзіную рэалізацыю для любой службаў у маёй сетцы, таму выкарыстоўваю Chrony. Калі вам не патрэбен лакальны NTP-сервер ці калі вы не супраць выкарыстоўваць Chrony у якасці сервера і systemd-timesyncd у якасці SNTP-кліента. Бо няма неабходнасці выкарыстоўваць дадатковыя магчымасці Chrony як кліента, калі вас уладкоўвае функцыянал systemd-timesyncd.

Яшчэ адна заўвага: вы не абавязаны выкарыстоўваць прылады systemd для рэалізацыі NTP. Вы можаце выкарыстоўваць старую версію ntpd, Chrony ці іншую рэалізацыю NTP. Бо systemd складаецца з вялікай колькасці сэрвісаў; многія з іх з'яўляюцца неабавязковымі, таму іх можна адключыць і выкарыстоўваць замест іх нешта яшчэ. Гэта не вялізны маналітны монстар. Можна не любіць systemd ці яго часткі, але вы павінны прыняць абгрунтаванае рашэнне.

Мне падабаецца рэалізацыя NTP у systemd, але я аддаю перавагу Chrony, таму што ён лепш адказвае маім патрэбам. Гэта Linux, дзетка -)

На правах рэкламы

VDSina прапануе серверы пад любыя задачы, велізарны выбар аперацыйных сістэм для аўтаматычнай усталёўкі, ёсць магчымасць усталяваць любую АС з уласнага ISO, зручная панэль кіравання уласнай распрацоўкі і посуточная аплата. Нагадаем, у нас ёсць вечныя серверы, якія сапраўды непадуладныя часу 😉

Сінхранізацыя часу ў Linux: NTP, Chrony і systemd-timesyncd

Крыніца: habr.com

Дадаць каментар