Якщо у вашій мережі є кілька машин і вам потрібен точний час навіть без інтернету — локальний NTP‑сервер на chrony це саме те, що треба. Сьогодні покажу, як розгорнути chrony як сервер, увімкнути fallback на апаратний RTC та налаштувати базовий моніторинг без складних інструментів. Обіцяю, буде просто і по‑людськи 🛠️
Що таке NTP і чому саме chrony
NTP — це протокол мережевої синхронізації часу. chrony — сучасна й дуже гнучка реалізація NTP для Linux, яка чудово працює як у ролі клієнта, так і сервера. Вона швидко сходиться до точного часу, добре тримає синхронізацію на нестабільних мережах та віртуалках, а ще дозволяє коректно працювати без зовнішнього інтернету (локальний stratum).
Підготовка середовища
Працювати будемо у терміналі на типовому сервер Linux. Переконайтеся, що ви маєте sudo‑права. Якщо у вас увімкнено systemd-timesyncd (деякі дистрибутиви за замовчуванням), його краще вимкнути, щоб не конкурував з chrony.
# Debian/Ubuntu
sudo systemctl disable --now systemd-timesyncd.service || true
# Встановлення chrony
sudo apt update && sudo apt install -y chrony
# RHEL/CentOS/Fedora
yes | sudo dnf install chrony
Налаштовуємо chrony як локальний NTP‑сервер
1) Базове конфігурування
Відкрийте конфіг і пропишіть джерела часу (NTP‑пули), дозвольте клієнтам з вашої підмережі та додайте параметри для швидкого старту й синхронізації з апаратним RTC.
sudo cp /etc/chrony/chrony.conf /etc/chrony/chrony.conf.bak
sudo nano /etc/chrony/chrony.conf
# /etc/chrony/chrony.conf (приклад)
# Зовнішні джерела часу (замініть на ближчі до вас пули)
pool 0.ua.pool.ntp.org iburst
pool 1.ua.pool.ntp.org iburst
pool 2.ua.pool.ntp.org iburst
pool 3.ua.pool.ntp.org iburst
# Дозволяємо клієнтів з локальних мереж (налаштуйте CIDR під себе)
allow 192.168.0.0/16
allow 10.0.0.0/8
# Дозволяємо працювати як локальний сервер без інтернету (обережно у великих мережах)
local stratum 10
# Швидке коригування часу на старті (до 1 секунди протягом перших 3 оновлень)
makestep 1.0 3
# Синхронізувати системний час з апаратним RTC (fallback, 11-хв режим)
rtcsync
# Файл дрейфу (за замовчуванням у багатьох дистрибутивах)
driftfile /var/lib/chrony/drift
# Краще явно вказати часову зону для коректних стрибків секунд
leapsectz right/UTC
2) Запуск і автозапуск
sudo systemctl enable --now chronyd
sudo systemctl status chronyd --no-pager
3) Мережеві налаштування (відкрити порт 123/UDP)
NTP працює по UDP 123. Відкрийте його у вашому firewall. Це частина ваших мережеві налаштування.
# UFW (Ubuntu)
sudo ufw allow 123/udp
# firewalld (RHEL/Fedora/CentOS)
sudo firewall-cmd --add-service=ntp --permanent
sudo firewall-cmd --reload
4) Перевірка статусу
# Джерела часу: зірочка * означає вибране головне джерело
chronyc sources -v
# Загальний трекінг точності
chronyc tracking
# Клієнти, які ходять до вашого сервера
chronyc clients
Fallback на апаратний RTC (коли інтернету немає)
Ідея проста: як тільки chrony синхронізується з інтернетом, він періодично записує точний час у RTC. Під час перезапуску або коли мережа відвалиться, ядро підніме системний час з RTC — і ви стартуєте з адекватними значеннями.
Кроки
- Тримайте RTC в UTC (це best practice):
sudo timedatectl set-local-rtc 0
sudo hwclock --systohc --utc
sudo timedatectl status
- У конфігу вже є
rtcsync(див. вище). Залишається час від часу перевіряти, що все ок.
Додатково можна раз на добу підтвердити запис у RTC через cron та systemd timers (опційно):
# Скрипт для форс‑синхронізації RTC (опційно)
echo '#!/usr/bin/env bash
set -euo pipefail
logger -t rtc-sync "Writing system time to RTC"
hwclock --systohc --utc' | sudo tee /usr/local/sbin/rtc-sync.sh >/dev/null
sudo chmod +x /usr/local/sbin/rtc-sync.sh
# Юніт systemd
sudo tee /etc/systemd/system/rtc-sync.service >/dev/null <<'EOF'
[Unit]
Description=Write system time to RTC
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/rtc-sync.sh
EOF
# Таймер раз на добу о 03:17
sudo tee /etc/systemd/system/rtc-sync.timer >/dev/null <<'EOF'
[Unit]
Description=Daily RTC sync
[Timer]
OnCalendar=*-*-* 03:17:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
sudo systemctl enable --now rtc-sync.timer
Моніторинг chrony
Для базового Linux моніторинг зручно використовувати chronyc і прості скрипти. Нижче — мінімальний health‑check, який логує стан синхронізації.
# Простий health-check (лог у /var/log/chrony-health.log)
echo '#!/usr/bin/env bash
set -euo pipefail
LOG=/var/log/chrony-health.log
TS=$(date -Is)
TRACK=$(chronyc tracking || true)
if chronyc sources | awk '\''/^\^\*/ {ok=1} END {exit ok?0:1}'\''; then
echo "$TS OK: synchronized" | tee -a "$LOG" >/dev/null
else
echo "$TS WARN: not synchronized" | tee -a "$LOG" >/dev/null
fi
' | sudo tee /usr/local/sbin/chrony-health.sh >/dev/null
sudo chmod +x /usr/local/sbin/chrony-health.sh
# Запустимо кожні 5 хвилин через systemd timer
sudo tee /etc/systemd/system/chrony-health.service >/dev/null <<'EOF'
[Unit]
Description=Chrony health check
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/chrony-health.sh
EOF
sudo tee /etc/systemd/system/chrony-health.timer >/dev/null <<'EOF'
[Unit]
Description=Run chrony health check every 5 minutes
[Timer]
OnBootSec=2min
OnUnitActiveSec=5min
Persistent=true
[Install]
WantedBy=timers.target
EOF
sudo systemctl enable --now chrony-health.timer
Якщо хочете графіки — подивіться на інтеграцію з Prometheus (chrony‑exporter) або Netdata. Але для більшості випадків цього логу і команд нижче достатньо:
watch -n 5 'chronyc tracking; echo; chronyc sources -v'
Альтернативні способи
- ntpd/ntpsec: класична реалізація NTP. Менше зручностей у нестабільних мережах, але сумісність чудова.
- OpenNTPD: легкий, простий у конфігурації, але з меншим набором можливостей.
- PTP (Precision Time Protocol): для дуже точної синхронізації всередині ЛАН та датацентрів; це вже інший стек.
GUI‑спосіб (Cockpit)
На RHEL/Fedora/CentOS зручно скористатися Cockpit для базового керування часом і перевірки сервісу (в Ubuntu теж доступний). Він допоможе візуально переконатися, що NTP увімкнено, а також швидко заглянути в журнали. Пам’ятайте: реальне редагування /etc/chrony/chrony.conf все одно робимо у терміналі.
# Встановлення Cockpit
# RHEL/Fedora/CentOS
sudo dnf install -y cockpit
sudo systemctl enable --now cockpit.socket
# Ubuntu/Debian
sudo apt install -y cockpit
sudo systemctl enable --now cockpit.socket
# Відкрити порт 9090 при потребі
sudo ufw allow 9090/tcp || sudo firewall-cmd --add-service=cockpit --permanent && sudo firewall-cmd --reload
# Далі в браузері: https://<ip>:9090 → System → Date & Time
FAQ
Чому клієнти не синхронізуються?
Перевірте, що відкрито UDP 123, у конфізі є allow <мережа>, а клієнти вказують ваш сервер як NTP‑джерело. На клієнті: chronyc sources -v має показати рядок зі зірочкою навпроти вашого сервера.
Чи можна одночасно тримати systemd-timesyncd і chrony?
Краще ні. Вимкніть timesyncd на хості, де працює chrony, щоб уникнути конфліктів.
Що робити у віртуалках?
Вимкніть синхронізацію годинника з хостом у гіпервізорі, залиште тільки chrony. Це мінімізує стрибки часу.
Як перевірити, що працює fallback на RTC?
Вимкніть мережу, перезавантажте сервер і перевірте поточний час. Якщо RTC у UTC і був свіжий запис (через rtcsync або скрипт), час буде адекватний. Після появи мережі chrony «підтягне» точність.
Чому бачу «Leap status: Not synchronised»?
Chrony ще не вибрав джерело. Дайте кілька хвилин, перевірте доступність пулів, час системи та DNS. Команди: chronyc sources -v, chronyc tracking.
Чи безпечно виставляти local stratum 10?
Так, якщо це внутрішня мережа та ви розумієте наслідки: без зовнішніх джерел ваш сервер стане «орфанним» авторитетом. Не експонуйте його в інтернет.
Порада від Kernelka
Вибирайте NTP‑пули ближчі географічно (наприклад, ua.pool.ntp.org) і ставте iburst — так ваш сервер синхронізується швидше ⏱️. Для невеликих офісів цього більш ніж достатньо; для датацентрів розгляньте власні апаратні джерела (GPS/PPS).
Підсумок
- Встановили і ввімкнули chrony як локальний NTP‑сервер.
- Відкрили порт 123/UDP та налаштували доступ клієнтам.
- Увімкнули
rtcsyncі підготували RTC у UTC для надійного fallback. - Додали простий моніторинг через chronyc та systemd timer.
- За потреби користуємося Cockpit для швидкої перевірки стану.