# chrony и NTP - синхронизация времени _Процессы и ресурсы · LinuxLab Knowledge Base_ **TL;DR:** NTP - протокол синхронизации часов (точность ~миллисекунды через интернет). На современных Linux реализация - `chronyd` (default) или `systemd-timesyncd` (lightweight). ## Зачем точное время Расхождение часов в секундах ломает: - **TLS-handshake** - сертификаты валидируются по времени, ±5 минут от реальности и `curl` отдаёт `certificate has expired`. - **Kerberos** - допуск ±5 минут, дальше `KRB_AP_ERR_SKEW`. - **Логи и трейсинг** - ELK/Loki/Jaeger корреллируют события по timestamp'ам. - **Базы и репликацию** - Postgres physical replication, MongoDB causal consistency. - **Систему файлов** - `make` решает что пересобирать по mtime; cron ждёт конкретное время; [systemd-timers](/kb/systemd-timers.md) плывут. ## NTP - протокол NTP (Network Time Protocol) - UDP/123. Иерархия серверов в **стратумах**: ``` Stratum 0 атомные часы / GPS / радиосигнал (не отвечают на NTP сами) ↓ Stratum 1 сервера прямо подключённые к stratum 0 (несколько штук в мире) ↓ Stratum 2 публичные сервера, синхронизированные со stratum 1 ↓ Stratum 3 обычно - твой локальный NTP-сервер если он есть ↓ Stratum 4+ клиенты в твоей сети ``` Чем выше число - тем дальше от первоисточника. Stratum 16 = «не синхронизирован». Источники для домашнего/офисного хоста: - **pool.ntp.org** - глобальный пул из тысяч серверов, DNS отдаёт случайных. - Дистрибутивные пулы: `0.fedora.pool.ntp.org`, `0.debian.pool.ntp.org`, `0.ubuntu.pool.ntp.org`. - Свой внутренний сервер для большой сети - снижает нагрузку на публичные и работает в air-gapped окружении. ## Три реализации NTP в Linux | Реализация | Где default | Особенности | |-----------------------|----------------------------------|------------------------------------------------| | `chronyd` (chrony) | Fedora, RHEL, Arch | Полноценный, работает с прерывистой сетью, может БЫТЬ сервером | | `systemd-timesyncd` | Ubuntu desktop, минимальные образа | Только клиент (SNTP), один сервер, lightweight | | `ntpd` (reference) | редко на новых системах | Старая реализация, медленнее реагирует, deprecated | Запускать **только одну**. Если стоит chrony - `systemctl disable --now systemd-timesyncd`. Проверить кто синхронизирует: ```bash timedatectl # System clock synchronized: yes # NTP service: active ``` Когда `NTP service: active` - какой-то демон работает, но какой именно определить через `systemctl is-active chronyd systemd-timesyncd`. ## Конфиг chrony - /etc/chrony.conf (или /etc/chrony/chrony.conf) Минимум для клиента: ``` pool 2.fedora.pool.ntp.org iburst driftfile /var/lib/chrony/drift makestep 1.0 3 rtcsync ``` Что значат ключевые директивы: | Директива | Назначение | |--------------------------|---------------------------------------------------------------------| | `pool iburst` | DNS-имя возвращает несколько серверов; iburst - быстрый initial-sync | | `server iburst` | Один конкретный сервер | | `server X.X.X.X prefer` | Предпочитать этот источник если он работает | | `driftfile ` | Сохранять оценку drift'а кварца между перезагрузками | | `makestep 1.0 3` | Если расхождение > 1 сек - first 3 update'а делать прыжком, потом плавно | | `rtcsync` | Раз в 11 минут синхронизировать RTC (hardware clock) с системными часами | | `allow 192.168.0.0/24` | Раздавать NTP клиентам из этой подсети (chrony как сервер) | | `local stratum 10` | Объявлять себя на stratum 10 если интернет недоступен (для air-gap) | Опция `iburst` - критичная: при старте делает 4 пакета подряд с интервалом 2 сек, синхронизация занимает секунды вместо минут. ## Конфиг systemd-timesyncd `/etc/systemd/timesyncd.conf` - простой: ```ini [Time] NTP=time.cloudflare.com 0.pool.ntp.org FallbackNTP=ntp.ubuntu.com RootDistanceMaxSec=5 ``` После правки - `systemctl restart systemd-timesyncd`. Проверка: ```bash timedatectl timesync-status ``` ## Дебаг - chronyc ```bash chronyc tracking # Reference ID : C0A80034 (yorktown.both.org) # Stratum : 3 # System time : 0.000004870 seconds slow of NTP time ← ключ # Last offset : -0.000007259 seconds # Frequency : 18715.217 ppm fast ← drift кварца # Skew : 0.087 ppm # Leap status : Normal ``` Главные индикаторы: - **System time** - насколько отстаёт/спешит. < 1 ms = всё хорошо. Секунды = плохо. - **Stratum** - твой стратум. Если 16 - не синхронизирован. - **Leap status** - `Normal`, или `Insert`/`Delete` в дни перед leap-second. Список серверов: ```bash chronyc sources -v # MS Name/IP address Stratum Poll Reach LastRx Last sample # ^* time.cloudflare.com 3 8 377 55 +418us[+430us] +/- 18ms ``` Расшифровка `MS` (Mode/State): - `^` - обычный сервер, `=` - peer. - `*` - выбран как best, `+` - комбинируется, `-` - отброшен, `x` - может ошибаться, `?` - ещё не получили ответ. Принудительно синхронизироваться сейчас: ```bash sudo chronyc makestep # 200 OK ``` Использовать после правки конфига или когда хост проснулся после долгого sleep'а. ## RTC - hardware clock Hardware clock (RTC) - батарейка на плате, тикает и при выключенной системе. Системные часы (kernel) при boot читают RTC, а потом NTP их подкручивает. ```bash hwclock --show # время в RTC sudo hwclock --systohc # записать system → RTC sudo hwclock --hctosys # прочитать RTC → system ``` В chrony `rtcsync` делает `--systohc` автоматически каждые 11 минут. Без него после reboot часы прыгнут до того что было в RTC. **Нюанс с двойной загрузкой Windows/Linux:** Windows хранит в RTC **локальное** время, Linux - UTC. Если двойная загрузка и часы прыгают на величину timezone offset: ```bash sudo timedatectl set-local-rtc 1 # сказать Linux что RTC - local time ``` ## Сделать свой NTP-сервер Если в офисе/дома десятки хостов - лучше один локальный сервер чем все в pool.ntp.org. В `/etc/chrony.conf` на сервере: ``` pool 2.fedora.pool.ntp.org iburst allow 192.168.0.0/24 # кому раздавать rtcsync driftfile /var/lib/chrony/drift ``` Плюс открыть UDP/123 в firewall'е. На клиентах: ``` server 192.168.0.10 iburst prefer ``` Stratum клиентов будет +1 от сервера. ## Дебаг - почему время не синхронизируется ```bash systemctl status chronyd # запущен ли вообще journalctl -u chronyd --since "10 min ago" # последние сообщения chronyc activity # сколько источников онлайн/offline chronyc sources -v # видим ли что-то # сетевая проверка sudo nmap -sU -p 123 0.pool.ntp.org # порт открыт? sudo ss -ulnp 'sport = :123' # сами слушаем? ``` Типичные проблемы: - Все source'ы `?` (не отвечают) - UDP/123 заблочен файрволом провайдера. - `Reference ID: 00000000 ()` - не синхронизирован, идёт первичный sync, подождать минуту с `iburst`. - `chronyd` не стартует - конфликт с `systemd-timesyncd`. Отключить timesyncd. ## Команды ```bash timedatectl ``` Главный обзор: системное время, RTC, timezone, статус NTP-синхронизации ```bash chronyc tracking ``` Точная статистика синхронизации chrony - offset, drift, stratum, leap ```bash chronyc sources -v ``` Все NTP-источники с их статусом и временем последнего ответа ```bash sudo chronyc makestep ``` Принудительная синхронизация прыжком - после правки конфига или wake-up ```bash sudo timedatectl set-timezone Europe/Moscow ``` Сменить часовой пояс - обновляет /etc/localtime symlink ## См. также - [systemd - init и менеджер сервисов](/kb/systemd.md) - [systemd-resolved - локальный DNS-stub](/kb/systemd-resolved.md) - [systemctl - управление сервисами systemd](/kb/cmd-systemctl.md) - [journalctl - журнал systemd](/kb/cmd-journalctl.md)