Network Time Protocol daemon (Русский)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Состояние перевода: На этой странице представлен перевод статьи Network Time Protocol daemon. Дата последней синхронизации: 14 октября 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

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
Примечание: Вообще, журнал (лог) устанавливать необязательно, но рекомендуется для того, чтобы знать, какие изменения проводит ntpd.

Использование

По умолчанию пакет настроен на режим клиента и использует отдельные пользователя и группу для избавления от root-прав. При ручном запуске через консоль всегда указывайте опцию -u:

# ntpd -u ntp:ntp

Опция -u используется в двух systemd-службах. Они также используют опцию -g, которая отключает порог (panic-gate). Таким образом они будут синхронизировать время даже если время на NTP-серверах очень сильно отличается от локального системного времени.

Важно: Одна из причин, почему panic-gate вообще существует, связана с тем, что некоторые службы могут оказаться чувствительны к прыжкам времени. Если системные часы ни разу раньше не синхронизировались, стоит остановить чувствительные службы перед первым запуском ntpd.

Both services are tied to the system's resolver, and will start synchronizing when an active network connection is detected.

Запуск ntpd при загрузке системы

Включите службу ntpd.service. Смотрите также #Запуск в chroot.

Примечание: systemd-команда timedatectl управляет только службой systemd-timesyncd. Выполнение 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.
Примечание: ntpd ожидает, что ваше устройство называется например /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

Примечание: ntpd следует запускать как не-root (по умолчанию в Arch Linux) перед попыткой помещения в chroot, так как chroot довольно бесполезен при запуске процессов от имени root.

Создайте каталог /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

Смотрите также