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

Состояние перевода:
На этой странице представлен перевод статьи
Network Time Protocol daemon
. Дата последней синхронизации: 4 февраля 2022. Вы можете
помочь
синхронизировать перевод, если в английской версии произошли
изменения
.
Ссылки по теме
NTPSec
Chrony
Синхронизация времени
Network Time Protocol
является одним из самых распространённых методов для синхронизации
системных часов
на GNU/Linux с серверами времени в интернете. Он разработан для смягчения последствий переменной задержки в сети и обычно может поддерживать время с точностью до десятков миллисекунд при синхронизации через интернет. Точность в локальных сетях даже лучше, до одной миллисекунды.
The NTP Project
предоставляет эталонную реализацию протокола, которая называется просто NTP. Эта статья описывает, как установить и запустить демон NTP: как клиент, так и сервер.
Смотрите
Синхронизация времени
для информации о других реализациях 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' не используйте никогда без особого разрешения, так как Вы можете попасть в "черный список".
Файл високосных секунд
Чтобы система могла предоставить
International Atomic Time
приложению, которое запрашивает это, необходимо загрузить список високосных секунд. Этот список является частью пакета
tzdata
и может быть загружен путем добавления следующей строки в файл конфигурации NTP:
leapfile /usr/share/zoneinfo/leap-seconds.list
Режим сервера NTP
При настройке своего NTP-сервера проверьте, что у вас включен
orphan mode
[
устаревшая ссылка
2022-09-22 ⓘ]
, чтобы в случае пропажи интернета он продолжил обслуживать сеть; включите 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 limited 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 limited 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.arch.pool.ntp.org iburst
server 1.arch.pool.ntp.org iburst
server 2.arch.pool.ntp.org iburst
server 3.arch.pool.ntp.org iburst
tos orphan 15

restrict default kod limited nomodify notrap nopeer noquery
restrict -6 default kod limited 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="systemctl start ntpd.service"
ExecDownPre="systemctl stop ntpd.service"
NetworkManager
ntpd
можно включать/выключать вместе со стартом сетевого соединения с помощью
диспетчерских скриптов
. Пакет
networkmanager-dispatcher-ntpd
AUR
устанавливает скрипты, настроенные на запуск и остановку
ntpd.service
одновременно с соединением.
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
Смотрите также
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 Государственного эталона времени и частоты (ГЭВЧ) Российской Федерации.