Зачем точное время
Расхождение часов в секундах ломает:
- 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 плывут.
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.
Проверить кто синхронизирует:
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 <host> iburst | DNS-имя возвращает несколько серверов; iburst - быстрый initial-sync |
server <host> iburst | Один конкретный сервер |
server X.X.X.X prefer | Предпочитать этот источник если он работает |
driftfile <path> | Сохранять оценку 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 - простой:
[Time]
NTP=time.cloudflare.com 0.pool.ntp.org
FallbackNTP=ntp.ubuntu.com
RootDistanceMaxSec=5
После правки - systemctl restart systemd-timesyncd. Проверка:
timedatectl timesync-status
Дебаг - chronyc
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.
Список серверов:
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- может ошибаться,?- ещё не получили ответ.
Принудительно синхронизироваться сейчас:
sudo chronyc makestep
# 200 OK
Использовать после правки конфига или когда хост проснулся после долгого sleep'а.
RTC - hardware clock
Hardware clock (RTC) - батарейка на плате, тикает и при выключенной системе. Системные часы (kernel) при boot читают RTC, а потом NTP их подкручивает.
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:
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 от сервера.
Дебаг - почему время не синхронизируется
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.