26
октября
2023
Синхронизация времени в Linux: использование службы SNTP
15:45

Синхронизация времени в Linux: использование службы SNTP

26 октября 2023 15:45

Бывают ситуации, когда возможностей обычной службы клиента NTP недостаточно: перезагрузка ПК без батареи CMOS тому пример. Некачественный Интернет - редкая синхронизация времени не позволяет полноценно работать службе NTP. Для решения этой проблемы придумана служба systemd-timesyncd, которая работает по упрощённому протоколу SNTP - Simple NTP.

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

(Не обязательно). Часовые пояса рассмотрены в статье "Поясное время в Linux".

sudo timedatectl set-timezone Europe/Moscow

Способы синхронизации времени

1) С помощью клиента NTP о чем рассказано в статье - полный клиент NTP.
2) С помощью службы systemd-timesyncd - простой клиент SNTP с синхронизацией с помощью systemd.
3) иные способы (не рассматриваю).

Установка службы systemd-timesyncd

sudo apt install systemd-timesyncd

Запуск службы systemd-timesyncd

sudo systemctl enable systemd-timesyncd.service
sudo systemctl start systemd-timesyncd.service

Включение синхронизации времени через службу systemd-timesyncd

Разрешает синхронизацию времени через сеть:

sudo timedatectl set-ntp true

Настройка автоматической синхронизации времени

Чтобы коррекция времени происходила автоматически через заданные промежутки времени, нужно исправить конфигурационный файл /etc/systemd/timesyncd.conf:

sudo nano /etc/systemd/timesyncd.conf

[Time]
NTP=2.ru.pool.ntp.org
FallbackNTP=3.ru.pool.ntp.org
RootDistanceMaxSec=5
PollIntervalMinSec=32
PollIntervalMaxSec=2048

В данном примере интервал опроса NTP серверов составляет от 32 секунд до 34 минут.

Перезапуск службы systemd-timesyncd:

sudo systemctl restart systemd-timesyncd.service

Проверка состояния синхронизации времени

timedatectl status

Если все хорошо, будет выведено:

System clock synchronized: yes
NTP service: active

Замечание

Оба способа взаимоисключающие:

  • NTP: при установке пакетов ntp / sntp автоматически удалится пакет systemd-timesyncd.
  • SNTP: для работы systemd-timesyncd, пакет ntp не требуется.

Кажется, что второй способ, SNTP, больше подходит для полевых условий и встроенных систем. Так как поддерживает время между перезагрузками в специальном файле и с помощью поправок учитывается дрейф часов.

MAN - руководство пользователя службы SYSTEMD-TIMESYNCD.SERVICE

SYSTEMD-TIMESYNCD.SERVICE(8) systemd-timesyncd.service SYSTEMD-TIMESYNCD.SERVICE(8)

ИМЯ
systemd-timesyncd.service, systemd-timesyncd — синхронизация времени по сети

СИНОПСИС
systemd-timesyncd.service
/lib/systemd/systemd-timesyncd

ОПИСАНИЕ
systemd-timesyncd — это системная служба, которую можно использовать для синхронизации локальных системных часов с удаленным сервером Network Time Protocol (NTP).

Она также сохраняет локальное время на диск каждый раз, когда часы синхронизируются, и использует это для возможного опережения системных часов реального времени при последующих перезагрузках, чтобы гарантировать, что оно (примерно) монотонно продвигается вперед, даже если в системе отсутствует чип RTC с буферизацией от батареи.

Служба systemd-timesyncd реализует только SNTP. Этот минималистичный сервис будет увеличивать системные часы для больших смещений или медленно корректировать их для меньших отклонений. Сложные случаи использования, требующие полной поддержки NTP (и когда SNTP недостаточно), не охватываются systemd-timesyncd.

Обращение к NTP-серверам определяется на основе глобальных настроек в timesyncd.conf(5), статических настроек для каждого канала в файлах .network и динамических настроек для каждого канала, полученных через DHCP находятся в Дополнительной информации - смотрите в systemd.network(5).

Команда timedatectl set-ntp true может использоваться для включения и запуска или отключения и остановки этой службы.

Команды timedatectl timesync-status и timedatectl show-timesync можно использоваться для отображения текущего статуса этой службы.

Инициализация systemd-timesyncd задерживает запуск модулей, которые упорядочены после time-set.target (подробности см. в systemd.special(7)), пока локальное время не будет обновлено из /var/lib/systemd/timesync/lock (см. ниже). ), чтобы сделать его примерно монотонным. Он не задерживает другие устройства до тех пор, пока не будет достигнута синхронизация с точными источниками эталонного времени. Для этого используйте systemd-time-wait-sync.service(8), который задержит запуск модулей, заказанных после time-sync.target, до тех пор, пока не будет достигнута синхронизация с точными эталонными часами.

ФАЙЛЫ
/var/lib/systemd/timesync/clock
Время модификации («mtime») этого файла указывает метку времени последней успешной синхронизации (или, по крайней мере, дату сборки systemd, если синхронизация невозможна). Он используется для обеспечения того, чтобы системные часы оставались примерно монотонными при перезагрузках, в случае отсутствия локальных часов реального времени.

/run/systemd/timesync/syncronized
Файл, который затрагивается при каждой успешной синхронизации, чтобы помочь systemd-time-wait-sync и другим приложениям обнаружить синхронизацию с точными эталонными часами.

Как узнать дату и время последней успешной синхронизации времени?

ls -l /var/lib/systemd/timesync/clock

Запускаем синхронизацию времени вручную

Cинхронизация вручную не требуется, если настроена автоматическая синхронизация (см. выше ).

sudo systemctl restart systemd-timesyncd

Для удобства, можно создать shell-скрипт с именем "timesync.sh":

#!/bin/sh
sudo systemctl restart systemd-timesyncd.service
find /var/lib/systemd/timesync/clock -printf "File: %f: Date: %TY-%Tm-%Td - Time: %TT\n" -exec tail -n5 {} \;
timedatectl status | grep -e "synchronized" -e "NTP"

Вот этот файл в архиве ZIP:
timesync.sh.zip

Сохранить его в текущем каталоге и сделать исполняемым

sudo chmod +x timesync.sh

Ручной запуск синхронизации времени:

./timesync.sh

(Чтобы пароль не запрашивался каждый раз: usermod -aG sudo ваше_имя).

NB: Если часы ПК синхронизированы с высокой точностью, сервис напишет: "System clock synchronized: yes" независимо от того, присутствовало ли соединение с сетью в момент запроса к серверу NTP.

Какова ошибка (отклонение) времени при использовании SNTP?

Отклонине относительно точного времени составляет 5-6 миллисекунд:

sudo apt-get update
sudo apt install iputils-clockdiff
sudo clockdiff 3.ru.pool.ntp.org

Технические подробности

В момент синхронизации времени используется протокол UDP, удалённый порт 123, протокол NTP Version 4.
Полезная нагрузка составляет 48 байт.

Frame xxxx: 90 bytes on wire (720 bits), 90 bytes captured (720 bits) on interface enp1s10, id 0
Ethernet II, Src: PERIPHER_0c (), Dst: Router ()
Internet Protocol Version 4, Src: xx.xx.xx.xx, Dst: 91.209.94.10
User Datagram Protocol, Src Port: xxxxx, Dst Port: 123
Source Port: xxxxx
Destination Port: 123
Length: 56
Checksum: 0x7b13 [unverified]
[Checksum Status: Unverified]
[Stream index: 1059]
[Timestamps]
UDP payload (48 bytes)
Network Time Protocol (NTP Version 4, client)
Flags: 0x23, Leap Indicator: no warning, Version number: NTP Version 4, Mode: client
Peer Clock Stratum: unspecified or invalid (0)
Peer Polling Interval: invalid (0)
Peer Clock Precision: 1,000000 seconds
Root Delay: 0,000000 seconds
Root Dispersion: 0,000000 seconds
Reference ID: NULL
Reference Timestamp: (0)Jan 1, 1970 00:00:00.000000000 UTC
Origin Timestamp: (0)Jan 1, 1970 00:00:00.000000000 UTC
Receive Timestamp: (0)Jan 1, 1970 00:00:00.000000000 UTC
Transmit Timestamp: Oct 26, 2023 13:10:05.053581346 UTC

Эксперимент

Каким будет отклонение часов, если оставить ПК без Интернета на ночь?

Если оставить ПК в выключенном состоянии на ночь, а затем загрузить при отсутствии сети, погрешность времени составила плюс 114-168 миллисекунд.

После включения Интернет, системное время, благодаря SNTP протоколу и службе SystemD, самостоятельно вернулось к точному — погрешность системных часов компьютера составила минус 14 миллисекунд.

Полезная ссылка: