Клиент своего сервера
iburst — первые четыре опроса подряд, синхронизация за секунды вместо
минут. Источником останется только node2, если закомментировать
строки pool в chrony.conf и перезапустить службу.
NTP-клиент и сервер: подводит системные часы по серверам времени и может раздавать время своим машинам.
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:
Установка идёт около 10 секунд и удаляет systemd-timesyncd: два
NTP-клиента на одной машине мешали бы друг другу. Служба chrony
сразу включена и запущена.
node1 получает время от node2:
| Поле | Что значит |
|---|---|
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.
Последняя строка в выводе одна, здесь она перенесена.
| Столбец | Что значит |
|---|---|
M |
^ — сервер, = — равный узел, # — часы самой машины |
S |
* — выбран для подстройки, + — учтён вместе с ним, - — не учтён, ? — не годится, x — может ошибаться, ~ — слишком нестабилен |
Stratum |
уровень сервера |
Poll |
интервал опроса степенью двойки: 6 — 64 секунды |
Reach |
последние восемь опросов в восьмеричном виде: 377 — ответили все, 17 — опросов пока четыре, ответ на каждый, 0 — ни одного ответа |
LastRx |
сколько секунд назад пришёл последний ответ |
Last sample |
смещение после подстройки, в скобках — измеренное, после +/- — погрешность |
Reach читается справа налево: младший разряд — последний опрос. После
того как на node2 закрыли UDP 123, 17 превратилось в 170: три
последних опроса без ответа. chronyc sources -v печатает над таблицей
ту же расшифровку.
Обычно chronyd подводит часы плавно: чуть ускоряет или замедляет их
ход, и время не прыгает: не быстрее 83 миллисекунд за секунду
(maxslewrate по умолчанию — 83333 ppm), так что 2 часа ушли бы не меньше
чем на сутки. Большое расхождение он исправляет шагом.
Строка makestep 1 3 в конфиге Ubuntu разрешает шаг, когда расхождение
больше 1 секунды, — но только при первых трёх обновлениях после запуска.
Часы node1 спешат на 2 часа, источник node2 добавлен через
reload sources — через 4 секунды в журнале:
Если перевести часы руками (date -s) на работающей машине, chronyd
замечает скачок и снимает синхронизацию до нового измерения, а потом
возвращает время шагом:
Новое измерение приходит по расписанию опроса (64 секунды и больше)
или сразу после sudo chronyc burst 4/4.
Главный файл — /etc/chrony/chrony.conf. В Ubuntu 24.04 без
комментариев он такой:
Свои настройки кладут в два каталога:
| Каталог | Файлы | Как применить |
|---|---|---|
/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 |
Ничего не найдено. Попробуй запрос короче.
iburst — первые четыре опроса подряд, синхронизация за секунды вместо
минут. Источником останется только node2, если закомментировать
строки pool в chrony.conf и перезапустить службу.
На node2:
allow — каким адресам отвечать: без него chronyd работает только
клиентом. Сеть учебных машин своя в каждом сеансе — её покажет
ip -br a. local stratum 10 разрешает раздавать время своих часов, даже
когда у самого сервера источника нет: без этой строки такой сервер
клиентам не годится. Клиенты node2 получают уровень 11.
waitsync <попыток> <смещение> ждёт, пока часы синхронизированы и
поправка меньше заданной (здесь 0.5 с), опрос — раз в 10 секунд. Код 0
— дождался, 1 — попытки кончились. Смещение числом — четвёртое поле:
makestep без свежего измерения ничего не меняет: сразу после
date -s он отвечает 200 OK, а часы остаются как были.
sudo systemctl restart chrony тоже подводит часы: после запуска снова
действуют три первых обновления из makestep 1 3.
chronyd не запущен: systemctl status chrony. Если chrony не
установлен, команды chronyc нет вовсе.
Команды, которые меняют состояние службы — makestep, burst,
reload sources, — даются от root: sudo chronyc …. tracking,
sources и sourcestats работают от обычного пользователя.
Имя сервера не разрешается: chronyd добавил источник без адреса и
ждёт. В журнале — Added source ID#0000000017 (ntp.lab.invalid) без IP,
chronyc activity считает его в sources with unknown address.
Проверь имя: getent hosts <имя>.
Сервер не ответил ни разу (Reach 0): неверный адрес, на нём нет
chrony, нет allow для твоей сети или UDP 123 закрыт файрволом —
firewall. Если Reach был ненулевым и упал, ответы перестали
приходить недавно.
Годного источника нет: см. chronyc sources. Сразу после ручного
date -s то же самое — chronyd ждёт нового измерения.
chronyd возвращает время к источнику шагом, как в разделе
chrony. Сдвинуть время для опыта можно, выключив
синхронизацию: sudo timedatectl set-ntp false останавливает chrony,
set-ntp true запускает снова.
timesync-status спрашивает systemd-timesyncd, а его удалила
установка chrony. С chrony — chronyc tracking. Сразу после установки
timedatectl может писать NTP service: n/a; надёжная проверка —
Leap status в chronyc tracking.
Шаг назад повторяет уже прошедшее время: строки журнала идут не по
порядку, задания cron и таймеров могут сработать дважды или
пропуститься, сертификаты TLS кажутся «ещё не действующими». На
работающем сервере пусть chrony подводит часы плавно, а makestep и
date -s оставь для машины, которую только что подняли.
systemd-timesyncd.journalctl -u chrony.Есть неточность? Сообщить об ошибке в статье