С чего начать Первые шаги трек · 15 ступеней
Linux Labs

chrony: синхронизация времени по NTP

11 мин Ubuntu 24.04 · chrony 4.5

NTP-клиент и сервер: подводит системные часы по серверам времени и может раздавать время своим машинам.

Шпаргалка

8 команд Версия для печати
  • chronyc tracking синхронизированы ли часы и насколько
  • chronyc sources серверы времени и их состояние
  • chronyc sourcestats смещение и разброс по серверам
  • sudo chronyc reload sources перечитать /etc/chrony/sources.d
  • sudo chronyc burst 4/4 опросить серверы сейчас
  • sudo chronyc makestep подвести часы одним шагом
  • chronyc waitsync 10 0.5 ждать синхронизации (для скриптов)
  • sudo systemctl restart chrony перечитать chrony.conf и conf.d

Обзор

chrony — две программы. Служба chronyd ведёт системные часы: опрашивает серверы времени по NTP (UDP-порт 123) и подводит часы к их времени. chronyc спрашивает службу и даёт ей команды через локальный сокет. По умолчанию часы Ubuntu ведёт systemd-timesyncd — только клиент, его состояние показывает timedatectl. chrony точнее держит часы, подробно показывает, откуда время, и умеет раздавать его другим машинам.

На учебной машине chrony не установлен, пакет лежит в /opt/debs:

bash
sudo apt-get install -y -q --no-download \
  -o Dir::Cache::archives=/opt/debs chrony

Установка идёт около 10 секунд и удаляет systemd-timesyncd: два NTP-клиента на одной машине мешали бы друг другу. Служба chrony сразу включена и запущена.

Синхронизированы ли часы — tracking

node1 получает время от node2:

text
student@node1:~$ chronyc tracking
Reference ID    : 0A2FFC0C (node2)
Stratum         : 11
Ref time (UTC)  : Wed Oct 21 11:45:02 2026
System time     : 0.000004130 seconds slow of NTP time
Last offset     : -0.000005138 seconds
RMS offset      : 0.000005138 seconds
Frequency       : 0.000 ppm slow
Residual freq   : -11.864 ppm
Skew            : 1000000.000 ppm
Root delay      : 0.000475221 seconds
Root dispersion : 4.684397697 seconds
Update interval : 2.0 seconds
Leap status     : Normal
Поле Что значит
Reference ID от кого время сейчас: адрес в шестнадцатеричном виде и имя
Stratum уровень в иерархии NTP: у источника на единицу меньше
System time насколько системные часы сейчас отстают (slow) или спешат (fast)
Last offset смещение при последнем измерении
Leap status Normal — часы синхронизированы, Not synchronised — нет

Расхождение часов с источником — строка System time: здесь 4 микросекунды. Без источников Reference ID — 00000000 (), Stratum — 0, Ref time — 1970 год, Leap status — Not synchronised.

Серверы — sources

text
student@node1:~$ chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample
^* node2                        10   6    17     4
    +51us[  +46us] +/-  238us

Последняя строка в выводе одна, здесь она перенесена.

Столбец Что значит
M ^ — сервер, = — равный узел, # — часы самой машины
S * — выбран для подстройки, + — учтён вместе с ним, - — не учтён, ? — не годится, x — может ошибаться, ~ — слишком нестабилен
Stratum уровень сервера
Poll интервал опроса степенью двойки: 6 — 64 секунды
Reach последние восемь опросов в восьмеричном виде: 377 — ответили все, 17 — опросов пока четыре, ответ на каждый, 0 — ни одного ответа
LastRx сколько секунд назад пришёл последний ответ
Last sample смещение после подстройки, в скобках — измеренное, после +/- — погрешность

Reach читается справа налево: младший разряд — последний опрос. После того как на node2 закрыли UDP 123, 17 превратилось в 170: три последних опроса без ответа. chronyc sources -v печатает над таблицей ту же расшифровку.

Шаг и плавная подстройка — makestep

Обычно chronyd подводит часы плавно: чуть ускоряет или замедляет их ход, и время не прыгает: не быстрее 83 миллисекунд за секунду (maxslewrate по умолчанию — 83333 ppm), так что 2 часа ушли бы не меньше чем на сутки. Большое расхождение он исправляет шагом. Строка makestep 1 3 в конфиге Ubuntu разрешает шаг, когда расхождение больше 1 секунды, — но только при первых трёх обновлениях после запуска.

Часы node1 спешат на 2 часа, источник node2 добавлен через reload sources — через 4 секунды в журнале:

text
chronyd[5096]: Selected source 10.47.252.12 (node2)
chronyd[5096]: System clock wrong by -7199.962332 seconds
chronyd[5096]: System clock was stepped by -7199.962332 seconds

Если перевести часы руками (date -s) на работающей машине, chronyd замечает скачок и снимает синхронизацию до нового измерения, а потом возвращает время шагом:

text
chronyd[1939]: Forward time jump detected!
chronyd[1939]: Can't synchronise: no selectable sources
chronyd[1939]: Selected source 10.71.162.12 (node2)
chronyd[1939]: System clock wrong by -7199.999899 seconds
chronyd[1939]: System clock was stepped by -7199.999899 seconds

Новое измерение приходит по расписанию опроса (64 секунды и больше) или сразу после sudo chronyc burst 4/4.

Конфигурация

11

Файлы и каталоги

Главный файл — /etc/chrony/chrony.conf. В Ubuntu 24.04 без комментариев он такой:

text
confdir /etc/chrony/conf.d
pool ntp.ubuntu.com        iburst maxsources 4
pool 0.ubuntu.pool.ntp.org iburst maxsources 1
pool 1.ubuntu.pool.ntp.org iburst maxsources 1
pool 2.ubuntu.pool.ntp.org iburst maxsources 2
sourcedir /run/chrony-dhcp
sourcedir /etc/chrony/sources.d
keyfile /etc/chrony/chrony.keys
driftfile /var/lib/chrony/chrony.drift
ntsdumpdir /var/lib/chrony
logdir /var/log/chrony
maxupdateskew 100.0
rtcsync
makestep 1 3
leapsectz right/UTC

Свои настройки кладут в два каталога:

Каталог Файлы Как применить
/etc/chrony/conf.d/ *.conf — любые директивы sudo systemctl restart chrony
/etc/chrony/sources.d/ *.sources — только server, pool, peer sudo chronyc reload sources

reload sources перечитывает только sources.d: строка server в conf.d после него не появится, нужен перезапуск. Сети наружу у учебной машины нет, имена из pool не разрешаются, и chronyc activity пишет 16 sources with unknown address — эти строки ничему не мешают.

Директивы — в таблице ниже, полный список — man chrony.conf.

Директива Что делает Пример
server sources.d, conf.d Сервер времени по имени или адресу; iburst — первые четыре опроса подряд. server node2 iburst
pool chrony.conf, sources.d Имя, за которым стоит много серверов; maxsources — сколько из них брать. pool ntp.ubuntu.com iburst maxsources 4
allow conf.d Каким адресам отвечать как сервер NTP; без allow chronyd работает только клиентом. allow 10.0.0.0/8
local conf.d Раздавать время своих часов, даже когда у сервера нет источника. local stratum 10
makestep chrony.conf Шагнуть часами, если расхождение больше N секунд, но только при первых M обновлениях после запуска. makestep 1 3
confdir chrony.conf Каталог с файлами *.conf, которые читаются при запуске службы. confdir /etc/chrony/conf.d
sourcedir chrony.conf Каталог с файлами *.sources; chronyc reload sources перечитывает их без перезапуска. sourcedir /etc/chrony/sources.d
driftfile chrony.conf Файл, где chronyd помнит, насколько спешат или отстают часы машины, между перезапусками. driftfile /var/lib/chrony/chrony.drift
rtcsync chrony.conf Раз в 11 минут переписывать аппаратные часы (RTC) по системным. rtcsync
maxupdateskew chrony.conf Не учитывать измерения, если оценка ошибки частоты больше этого числа ppm. maxupdateskew 100.0
logdir chrony.conf Каталог журналов chrony; что писать, задаёт директива log. logdir /var/log/chrony

Ничего не найдено. Попробуй запрос короче.

Рецепты

4

Клиент своего сервера

bash
echo 'server node2 iburst' | sudo tee /etc/chrony/sources.d/lab.sources
sudo chronyc reload sources
chronyc sources                  # через несколько секунд: ^* node2

iburst — первые четыре опроса подряд, синхронизация за секунды вместо минут. Источником останется только node2, если закомментировать строки pool в chrony.conf и перезапустить службу.

Сервер для своих машин

На node2:

bash
printf 'allow 10.0.0.0/8\nlocal stratum 10\n' \
  | sudo tee /etc/chrony/conf.d/lab-server.conf
sudo systemctl restart chrony
sudo ss -ulnp | grep chronyd     # 0.0.0.0:123 — ждёт клиентов
sudo chronyc clients             # кто спрашивал время

allow — каким адресам отвечать: без него chronyd работает только клиентом. Сеть учебных машин своя в каждом сеансе — её покажет ip -br a. local stratum 10 разрешает раздавать время своих часов, даже когда у самого сервера источника нет: без этой строки такой сервер клиентам не годится. Клиенты node2 получают уровень 11.

Проверить синхронизацию из скрипта

text
student@node1:~$ chronyc waitsync 5 0.5; echo $?
try: 1, refid: 0AF8030C, correction: 0.388168603, skew: 1000000.000
0

waitsync <попыток> <смещение> ждёт, пока часы синхронизированы и поправка меньше заданной (здесь 0.5 с), опрос — раз в 10 секунд. Код 0 — дождался, 1 — попытки кончились. Смещение числом — четвёртое поле:

bash
chronyc tracking | awk '/System time/ {print $4}'

Подвести часы сразу

bash
sudo chronyc burst 4/4           # новое измерение сейчас
sleep 5
sudo chronyc makestep            # шаг на всё смещение

makestep без свежего измерения ничего не меняет: сразу после date -s он отвечает 200 OK, а часы остаются как были. sudo systemctl restart chrony тоже подводит часы: после запуска снова действуют три первых обновления из makestep 1 3.

Неполадки

7

506 Cannot talk to daemon

chronyd не запущен: systemctl status chrony. Если chrony не установлен, команды chronyc нет вовсе.

501 Not authorised

Команды, которые меняют состояние службы — makestep, burst, reload sources, — даются от root: sudo chronyc …. tracking, sources и sourcestats работают от обычного пользователя.

В sources пусто

Имя сервера не разрешается: chronyd добавил источник без адреса и ждёт. В журнале — Added source ID#0000000017 (ntp.lab.invalid) без IP, chronyc activity считает его в sources with unknown address. Проверь имя: getent hosts <имя>.

Источник ^?

text
^? 10.255.255.1                  0   6     0     -
    +0ns[   +0ns] +/-    0ns

Сервер не ответил ни разу (Reach 0): неверный адрес, на нём нет chrony, нет allow для твоей сети или UDP 123 закрыт файрволом — firewall. Если Reach был ненулевым и упал, ответы перестали приходить недавно.

Leap status: Not synchronised

Годного источника нет: см. chronyc sources. Сразу после ручного date -s то же самое — chronyd ждёт нового измерения.

Часы перевёл руками, а они вернулись

chronyd возвращает время к источнику шагом, как в разделе chrony. Сдвинуть время для опыта можно, выключив синхронизацию: sudo timedatectl set-ntp false останавливает chrony, set-ntp true запускает снова.

timedatectl timesync-status: Failed to query server

text
Failed to query server: The name org.freedesktop.timesync1 was not
  provided by any .service files

timesync-status спрашивает systemd-timesyncd, а его удалила установка chrony. С chrony — chronyc tracking. Сразу после установки timedatectl может писать NTP service: n/a; надёжная проверка — Leap status в chronyc tracking.

Опасно

1

Шаг часов на работающем сервере

Шаг назад повторяет уже прошедшее время: строки журнала идут не по порядку, задания cron и таймеров могут сработать дважды или пропуститься, сертификаты TLS кажутся «ещё не действующими». На работающем сервере пусть chrony подводит часы плавно, а makestep и date -s оставь для машины, которую только что подняли.

Термины

1
NTP
Протокол сверки часов с сервером времени по сети, UDP-порт 123. Клиент — systemd-timesyncd или chrony, сервер для своих машин — chrony с allow. Ещё встречается в: timedatectl, date, Локаль и кодировка

См. также

  • timedatectl — часовой пояс, UTC и systemd-timesyncd.
  • date — показать и задать время, unix-время.
  • systemd-timers — таймеры зависят от верного времени.
  • cron — расписание по местному времени.
  • firewall — открыть UDP 123 для клиентов.
  • journalctl — журнал службы: journalctl -u chrony.
Загрузка…