Network Time Protocol daemon (Русский)
Network Time Protocol является одним из самых распространённых методов для синхронизации системных часов на GNU/Linux с серверами времени в интернете. Он разработан для смягчения последствий переменной задержки в сети и обычно может поддерживать время с точностью до десятков миллисекунд при синхронизации через интернет. Точность в локальных сетях даже лучше, до одной миллисекунды.
The NTP Project предоставляет эталонную реализацию протокола, которая называется просто NTP. Эта статья описывает, как установить и запустить демон NTP: как клиент, так и сервер.
Смотрите System time#Time synchronization для информации о других реализациях NTP.
Установка
Установите пакет ntp. По умолчанию ntpd работает в режиме клиента и не требует дополнительной настройки. Вы можете перейти к разделу #Использование, если вас устраивает стандартный файл конфигурации Arch. Для настройки сервера смотрите #Режим сервера NTP.
Настройка
Основной демон ntpd настраивается в файле /etc/ntp.conf
. Смотрите ntp.conf(5) для дополнительной информации.
Подключение к серверам NTP
NTP-серверы выстроены в многоуровневую иерархию; уровни называются слоями (англ. strata). Устройства, которые считаются самостоятельными источниками времени, считаются первичными (stratum 0); серверы, непосредственно подключённые к stratum 0 устройствам, считаются источниками stratum 1; серверы, подключенные к stratum 1 серверам, считаются источниками stratum 2 и так далее.
Важно понимать, что слой сервера не может рассматриваться как показатель его точности или надёжности. Обычно для синхронизации пользовательских машин используются stratum 2 серверы. Если вы ещё не знаете, к каким серверам вы собираетесь подключиться, вам следует выбрать пул серверов, расположенный недалеко от вашего местоположения, из списка серверов на pool.ntp.org (альтернативная ссылка).
Начиная с ntp version 4.2.7.p465-2, Arch Linux использует свой собственный стандартный пул NTP-серверов, который предоставляет the NTP Pool Project (смотрите FS#41700). Измените его под свои нужды, например если вы хотите использовать сервера своей страны:
/etc/ntp.conf
server 0.ru.pool.ntp.org iburst server 1.ru.pool.ntp.org iburst server 2.ru.pool.ntp.org iburst server 3.ru.pool.ntp.org iburst
Опция 'iburst' рекомендуется, с ее помощью посылается шквал пакетов, если не удается установить соединение с сервером с первого раза. Напротив, опцию 'burst' не используйте никогда без особого разрешения, так как Вы можете попасть в "черный список".
Режим сервера NTP
При настройке своего NTP-сервера проверьте, что у вас включен orphan mode[устаревшая ссылка 2021-11-13], чтобы в случае пропажи интернета он продолжил обслуживать сеть; включите orphan mode с помощью параметра tos
(может настроить до stratum 15), чтобы он никогда не использовался, пока интернет доступен:
tos orphan 15
Затем определите правила, которые позволят клиентам подключиться к вашему сервису (localhost тоже считается клиентом) с помощью команды restrict; в файле уже должна быть примерно такая строка:
restrict default nomodify nopeer noquery
Она запрещает всем модифицировать что-либо и предотвращает запрос статуса вашего сервера: nomodify
запрещает перенастройку ntpd (через ntpq или ntpdc), а noquery
важен для предотвращения дампа статуса ntpd (тоже через ntpq или ntpdc).
Можете также добавить следующие опции:
restrict default kod nomodify notrap nopeer noquery
noserve
, если вы хотите запретить отдачу времени. Это также заблокирует синхронизацию времени, так как заблокирует все пакеты кроме запросов ntpq и ntpdc.Если вы хотите изменить что-то из этого, читайте полную документацию по опции "restrict" в ntp.conf(5), подробные инструкции по ntp и #Использование.
Теперь нужно указать ntpd, какие подключения к Вашему серверу разрешены; если Вы не конфигурируете сервер NTP, следующей строки будет достаточно:
restrict 127.0.0.1
Если Вы желаете принудительно определить адреса по протоколу IPv6, напишите -6 перед IP-адресом или именем хоста (-4 принудительно устанавливает протокол IPv4), например:
restrict -6 default kod nomodify notrap nopeer noquery restrict -6 ::1 # ::1 - это 127.0.0.1 в шестой версии протокола IP
Наконец, установите файл-буфер (в котором будет находиться погрешность часов системы) и журнал (лог):
driftfile /var/lib/ntp/ntp.drift logfile /var/log/ntp.log
Примерная конфигурация выглядит так:
/etc/ntp.conf
server 0.ru.pool.ntp.org iburst server 1.ru.pool.ntp.org iburst server 2.ru.pool.ntp.org iburst server 3.ru.pool.ntp.org iburst tos orphan 15 restrict default kod nomodify notrap nopeer noquery restrict -6 default kod nomodify notrap nopeer noquery restrict 127.0.0.1 restrict -6 ::1 driftfile /var/lib/ntp/ntp.drift logfile /var/log/ntp.log
Использование
По умолчанию пакет настроен на режим клиента и использует отдельные пользователя и группу для избавления от root-прав. При ручном запуске через консоль всегда указывайте опцию -u
:
# ntpd -u ntp:ntp
Опция -u
используется в двух systemd-службах. Они также используют опцию -g
, которая отключает порог (panic-gate). Таким образом они будут синхронизировать время даже если время на NTP-серверах очень сильно отличается от локального системного времени.
Both services are tied to the system's resolver, and will start synchronizing when an active network connection is detected.
Запуск ntpd при загрузке системы
Включите службу ntpd.service
. Смотрите также #Запуск в chroot.
timedatectl set-ntp 1
как root может случайно остановить работающий ntpd.service
.[1]
Используйте ntpq для просмотра списка настроенных пиров и статуса синхронизации:
$ ntpq -p
Задержка, смещение и джиттер должны быть отличны от нуля. Серверы, с которыми синхронизируется ntpd, отмечены звёздочкой. Может потребоваться несколько минут, прежде чем ntpd выберет сервер для синхронизации; попробуйте проверить через 17 минут (1024 секунды).
Синхронизация один раз при загрузке
В качестве альтернативы включите службу ntpdate.service
для однократной синхронизации (опция -q
) в non-forking режиме (опция -n
) при загрузке системы вместо запуска постоянно работающего демона в фоне. Этот метод не рекомендуется на серверах и в целом на машинах, которые работают без перезагрузки более нескольких дней.
Если синхронизированное время нужно записать в аппаратные часы компьютера, создайте drop-in файл для этой службы:
/etc/systemd/system/ntpdate.service.d/hwclock.conf
[Service] ExecStart=/usr/bin/hwclock -w
Советы и рекомендации
Запуск ntpd при подключении сети
ntpd может быть запущен вашим менеджером сети, чтобы демон запускался только при появлении интернета.
- Netctl
Добавьте следующие строки в ваш профиль netctl:
ExecUpPost='/usr/bin/ntpd || true' ExecDownPre='killall ntpd || true'
- NetworkManager
ntpd можно включать/выключать вместе со стартом сетевого соединения с помощью диспетчерских скриптов. Пакет networkmanager-dispatcher-ntpdAUR устанавливает скрипты, настроенные на запуск и остановку ntpd.service одновременно с соединением.
- Wicd
Для Wicd создайте запускающий скрипт в каталоге postconnect
и останавливающий скрипт в каталоге predisconnect
. Не забудьте сделать их исполняемыми:
/etc/wicd/scripts/postconnect/ntpd
#!/bin/bash systemctl start ntpd &
/etc/wicd/scripts/predisconnect/ntpd
#!/bin/bash systemctl stop ntpd &
Смотрите также Wicd#Scripts.
- KDE
KDE может использовать NTP (ntp должен быть установлен) путём нажатия правой кнопкой мыши по часам и выбору синхронизации даты/времени. Однако при этлм демон ntp должен быть отключен. [2]
Использование ntpd с GPS
Многие статьи предлагают настраивать ntpd на получение времени из GPS через общую память, однако как минимум с версии 4.2.8 появился гораздо более хороший метод. Он подключается напрямую к gpsd, так что gpsd должен быть установлен.
Добавьте следующие строки в /etc/ntp.conf
:
/etc/ntp.conf
#========================================================= # GPSD native ntpd driver #========================================================= # This driver exists from at least ntp version 4.2.8 # Details at # https://www.eecis.udel.edu/~mills/ntp/html/drivers/driver46.html server 127.127.46.0 fudge 127.127.46.0 time1 0.0 time2 0.0 refid GPS
Для проверки сперва убедитесь, что gpsd работает:
$ cgps -s
Затем подождите несколько минут и запустите ntpq -p
. Он должен показать, что ntpd общается с gpsd:
$ ntpq -p
remote refid st t when poll reach delay offset jitter ================================================================================== *GPSD_JSON(0) .GPS. 0 l 55 64 377 0.000 2.556 14.109
- Если reach равен 0, это означает, что ntpd не смог пообщаться с gpsd. Подождите несколько минут и попробуйте снова.
- GPS-устройство должно поддерживать PPS. Вы можете проверить своё устройство с помощью команды
ppscheck /dev/gps0
.
/dev/gps0
. Если оно подключено через USB, оно может оказаться /dev/ttyUSB0
, и вам может понадобиться создать символьную ссылку ln -s /dev/ttyUSB0 /dev/gps0
и запустить gpsd на этом /dev/gps0
, чтобы строка GPSD_JSON
появилась как ожидается. gpsd следует запускать с флагом -n
в строке GPSD_OPTIONS
и использовать /dev/gps0
в строке DEVICES
в файле настроек /etc/default/gpsd
.Запуск в chroot
Создайте каталог /etc/systemd/system/ntpd.service.d/
(если его ещё нет) и drop-in файл customexec.conf
в нём со следующим содержимым:
[Service] ExecStart= ExecStart=/usr/bin/ntpd -g -u ntp:ntp -i /var/lib/ntp
Затем измените /etc/ntp.conf
, прописав пути относительно chroot. Измените:
driftfile /var/lib/ntp/ntp.drift
на:
driftfile /ntp.drift
Создайте необходимое chroot-окружение, чтобы getaddrinfo() работал:
# mkdir /var/lib/ntp/etc /var/lib/ntp/lib /var/lib/ntp/proc # mkdir /var/lib/ntp/usr /var/lib/ntp/usr/lib # touch /var/lib/ntp/etc/resolv.conf /var/lib/ntp/etc/services
и пропишите bind mount для упомянутых файлов:
/etc/fstab
... #ntpd chroot mounts /etc/resolv.conf /var/lib/ntp/etc/resolv.conf none bind 0 0 /etc/services /var/lib/ntp/etc/services none bind 0 0 /lib /var/lib/ntp/lib none bind 0 0 /usr/lib /var/lib/ntp/usr/lib none bind 0 0 /proc /var/lib/ntp/proc none bind 0 0
# mount -a
Затем перезапустите демон ntpd
. После перезапуска вы можете проверить, действительно ли он запустился в chroot, посмотрев, куда ведёт символьная ссылка /proc/{PID}/root
:
# ps -C ntpd | awk '{print $1}' | sed 1d | while read -r PID; do ls -l /proc/$PID/root; done
Должно ссылаться на /var/lib/ntp
вместо /
.
Скорее всего придётся немного подождать, чтобы проверить корректность настройки driftfile, так как ntpd пишет и читает не очень часто. Если вы ошиблись, демон отпечатает ошибку в журнале; если всё в порядке, он обновит метку времени. Если вы не наблюдаете ошибок в течение суток и время при этом обновляется, значит всё хорошо.
Ограничение прослушивающих сокетов
Вы можете ограничить сокеты, которые прослушивает ntpd, используя опцию interface:
interface [listen | ignore | drop] [all | ipv4 | ipv6 | wildcard | name | address[/prefixlen]]
примерно так:
/etc/ntp.conf
interface listen lo interface listen enp3s0 interface ignore enp5s0
Смотрите также
- https://www.ntp.org/
- https://support.ntp.org/
- https://www.pool.ntp.org/
- https://www.eecis.udel.edu/~mills/ntp/html/index.html
- https://www.akadia.com/services/ntp_synchronize.html
- ВНИИФТРИ - список серверов NTP Государственного эталона времени и частоты (ГЭВЧ) Российской Федерации.