Синхронизация на времето на 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 часовника на вашия работен плот, в изхода на командата за дата, в клеймото за време на регистрационните файлове. Това важи и когато файловете се създават, променят и отварят.

На страницата човек за rtc има пълно описание на RTC и системния часовник.

Какво става с NTP?

Компютрите по целия свят използват NTP (протокол за мрежово време), за да синхронизират времето си със стандартни референтни часовници по интернет, като използват йерархия от NTP сървъри. Основните сървъри за време са на ниво 1 и те са директно свързани с различни национални услуги за време на ниво 0 чрез сателит, радио или дори модеми по телефонни линии. Услугите за време от слой 0 могат да бъдат атомен часовник, радиоприемник, който е настроен на сигнали, предавани от атомни часовници, или GPS приемник, който използва много точни часовникови сигнали, предавани от GPS сателити.

По-голямата част от референтните сървъри имат няколко хиляди публични NTP сървъри от слой 2, отворени за обществеността. Много организации и потребители (включително и аз) с много хостове, които се нуждаят от NTP сървър, избират да настроят свои собствени сървъри за време, така че само един локален хост да има достъп до слой 2 или 3. След това те конфигурират останалите възли в мрежата да използват локалния сървър за време. В случая на моята домашна мрежа това е сървър от ниво 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.

NTP, Chrony и systemd-timesyncd RPM са налични в стандартните хранилища на Fedora. Systemd-udev RPM е мениджър на събития на ядрото, който е инсталиран по подразбиране във 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 време. В този случай системното време е настроено на часовата зона Америка / Ню_Йорк (TZ), RTC е настроено на времето в местната часова зона и услугата NTP не е активна. RTC времето започна леко да се отклонява от системното време. Това е нормално за системи, чиито часовници не са синхронизирани. Размерът на отместването на хоста зависи от времето, изминало от последното синхронизиране на системата.

Получихме също предупреждение относно използването на местно време за RTC - това се отнася за промените в часовата зона и настройките за DST. Ако компютърът е изключен, когато трябва да се направят промени, 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 VM:

#  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

Работно време синхронизиране

Можете да стартирате и да активирате 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

Източник: www.habr.com

Добавяне на нов коментар