Синхронизиране на времето в 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 (Network Time Protocol) за синхронизиране на времето си с стандартни референтни часовници през интернет чрез йерархия от NTP сървъри. Основните времеви сървъри са на ниво 1 и са директно свързани с различни национални служби за време на ниво 0 чрез спътници, радио или дори модеми по телефонни линии. Услугите на ниво 0 могат да бъдат атомни часовници, радио приемници, настроени на сигнали, предавани от атомни часовници, или GPS приемници, използващи високоточни сигнали на часовника, предавани от GPS спътници.

На повечето референтни сървъри има отворени хиляди публични NTP сървъри от второ ниво (stratum 2), достъпни за всички. Много организации и потребители (включително мен) с многобройни хостове, изискващи NTP сървър, предпочитат да инсталират свои собствени времеви сървъри, така че само един локален хост да се свързва с stratum 2 или 3. След това те конфигурират останалите възли в мрежата да използват локалния времеви сървър. В моята домашна мрежа това е сървър от трето ниво.

Различни реализации на NTP

Първоначалната реализация на NTP е ntpd. След това се присъединиха две по-нови, chronyd и systemd-timesyncd. Всички три синхронизират времето на локалния хост със времевия сървър NTP. Услугата systemd-timesyncd не е толкова надеждна, колкото chronyd, но е достатъчна за повечето цели. Ако RTC не е синхронизирана, тя постепенно може да коригира системното време, за да се синхронизира с NTP сървъра, когато локалното системно време е малко изместено. Услугата systemd-timesync не може да се използва като времеви сървър.

Chrony — това е реализация на 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

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

Сега можете да зададете часовата зона. Използвах командата 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 сървър:

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 - Синхронизация на мрежовото време
     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: "Начална синхронизация с времеви сървър 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]: Часовникът на системата е неустановен или е скочил назад, възстановяване от записаната времева печат: Sat 2020-05-16 13:56:53 EDT
May 16 13:56:53 testvm2.both.org systemd[1]: Започната е синхронизация на мрежовото време.
May 16 13:57:56 testvm2.both.org systemd-timesyncd[822]: Начална синхронизация с времеви сървър 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

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster