xntpd (UNIXовый сервер NTP - network time protocol)
оригинал статьи лежит на сервере: http://www.bog.pp.ru/work/
источник
Брал версию 5.90, полная реализация RFC-1305 (NTP, версия 3) с дополнительными возможностями предполагаемыми к включению в версию 4. Последняя реализация: xntp3-5.93e (на 6 октября 1999). Версия для использования в США с шифровкой и экспортный вариант. Готовится версия 4.
Где взять: ftp://ftp.udel.edu/pub/ntp
-
ntpdate -
установка времени на местном
компьютере, беря его из списка
ntp-серверов (злобный
комментарий к программе
утверждает, что реально она
сдвигает часы вдвое больше чем
положено - в расчете на то, что вскоре они все
равно убегут)
-B - только плавный сдвиг (adjtime), даже если смещение больше 128 мс
-b - всегда использовать settimeofday (можно использовать только при загрузке!)
-d - отладка (реальных изменений не будет)
-p число - число запросов к каждому серверу (от 1 до 8, по умолчанию 4)
-q - только запрос времени
-s - использовать syslog вместо stdout
-t timeout - время ожидания ответа (по умолчанию 1 сек)
-u - использовать непривилегированный порт
-v - болтливость -
ntpq - удаленый запрос
состояния NTP-сервера и его
изменение (использует NTP mode 6)
единственное, что я извлек полезного (но есть интерактивный режим: -i) это: ntpq -p список-хостов - узнать, от кого питаются эти хосты (самый левый символ в ответе определяет статус питателей:- пробел - слишком большой страт или явная ошибка
- x - фальшивый по алгоритму пересечения
- . - взято из конца списка кандидатов
- - - удалено алгоритмом кластеризации
- +- входит в конечный список
- # - выбран для синхронизации, но дистанция превышает максимальную
- * - выбран для синхронизации
- o - выбран для синхронизации, PPS в действии
-
ntptrace - поиск
сервера страты-1 (выдает цепочку
серверов)
-r число - количество запросов (по умолчанию 5)
-t секунд - timeout (по умолчанию 2)
-v - болтливость -
xntpd [-aAbdm ] [-c
config-file] [-f drift-file] [-k
key-file] [-l log-file] [-p
pid-file] [-r broadcast-delay] [-s
stats-dir] [-t key] [-v variable]
[-V variable] - демон
сетевого времени
-a разрешить аутентификацию (по умолчанию)
-A запретить аутентификацию
-b broadcast
-c config-file (по умолчанию /etc/ntp.conf
-d отладка (чем больше раз встречается, тем выше уровень)
-f drift-file (по умолчанию /etc/ntp.drift)
-k key-file (по умолчанию /etc/ntp.keys)
-l log-file (по умолчанию syslog)
-m multicast (IP-адрес 224.0.1.1) -
xntpdc -
удаленый запрос состояния NTP-сервера и его
изменение (только для
xntpd-серверов!) используя NTP mode 7
единственное, что я извлек полезного (но есть интерактивный режим: -i, в котором можно извлечь кучу разной статистики - кто и сколько раз пользовался твоим сервером, например) это: xntpdc -s список-хостов - узнать, от кого питаются эти хосты (самый левый символ в ответе определяет статус питателей:- пробел - слишком большой страт или явная ошибка
- x - фальшивый по алгоритму пересечения
- . - взято из конца списка кандидатов
- - - удалено алгоритмом кластеризации
- +- входит в конечный список
- # - выбран для синхронизации, но дистанция превышает максимальную
- * - выбран для синхронизации
- o - выбран для синхронизации, PPS в действии
позволяет также конфигурировать на ходу (обязательно д.б. включена шифровка)
-
tickadj -
настройка ядра ОС (если без
параметров, то
посмотреть), почему у меня tickadj = 5us?
переменная dosynctodr управляет синхронизацией системных часов и батареечных часов (надо выключить для xntpd)
-a tickadj - настройка переменной tickadj (сколько микросекунд добавлять к часам при каждом прерывании)
-A настроить tickadj на "оптимальное" значение
-t tick - настроить переменную ядра tick (сколько микросекунд между прерываниями по таймеру)
-s - установить dosynctodr в 0 -
директория script содержит кучу
полезных утилит
- summary.pl и plot_summary.pl требуют perl 5.003, так что посмотреть их в действии не удалось
- в поддиректории stats: summary.sh, loop.awk, peer.awk извлекают из ежедневной статистики (loopstats.yyyymmdd и peerstats.yyyymmdd) что-то полезное и кладут в loop_summary и peer_summary (исходные файлы удаляются); тексты процедур должны лежать там же, где и файлы со статистикой (у меня в /var/log/ntp) и summary.sh запускаться ежедневно из cron
-
в
поддиректории script/stats: psummary.awk -
скрипт для
суммирования
ежедневных
суммирований
статистики по соседям:
awk -f psummary.awk peer_summary - script/support/bin/monl -d /var/log/ntp -v ntp.deol.ru. : узнать кто пользуется нашим NTP-сервером (отслеживает новых, текущих и ушедших клиентов)
Установка
Руководство по установке:
http://www.eecis.udel.edu/~ntp/database/html_xntp3-5.90/build.html
а также файл INSTALL
Solaris 2.5. Установка из исходников (5.90).
Сначала надо
выполнить
./configure --disable-all-clock --enable-LOCAL-CLOCK
-делает config.h и Makefile в каждой
поддиректории, драйверы
аппаратных часов
отключить
make (не забудь добавить /usr/ccs/bin к PATH)
make check
make install (из-под
суперпользователя)
make clean
Red Hat Linux 6.0 / 6.2 (xntp3-5.93-12.rpm / xntp3-5.93-14.rpm).
Приходит в готовом виде (/etc/ntp.conf, /etc/ntp/, /etc/rc.d/init.d/xntpd, /usr/doc/xntp3-5.93/, /usr/sbin/{ntpdate, ntpq, ntptime, ntptrace, tickadj, xntpd, xntpdc}). В /etc/ntp/step-tickers положить список опорных NTP-серверов. Для автоматического запуска/остановки /etc/rc.d/rc{2,3}.d сделать линки с {K,S}31xntpd на ../init.d/xntpd. Настроить /etc/ntp.conf. Подстроить часы вручную (лучше дождаться завершения ntpdate -B).
Перед запуском местное время не должно ошибаться больше, чем на 1000 секунд (CLOCK_WAYTOOBIG), round-trip delay д.б. меньше 1 секунды, ошибка частоты д.б. меньше 390 ppm.
Конфигурация (по умолчанию /etc/ntp.conf):
-
сосед: peer address [key key] [version version] [prefer]
[minpoll minpoll] [maxpoll maxpoll]
где address - адрес симметричного сервера, key - 32-битный ключ для поля аутентификации (по умолчанию без оной), prefer - предпочитать данный сервер при прочих равных условиях, minpoll - минимальный интервал запросов (в секундах, степень двойки, от 4 - 16с -до 14 - 16384с, по умолчанию 6 - 64с), maxpoll - максимальный интервал запросов (по умолчанию 10 - 1024с)
Внимание! разрешение имен происходит параллельно и приводит к run-time реконфигурации сервера посредством пакетов mode 7. - сервер: server address [key key] [version version] [prefer] [mode mode]
- рассылка broadcast сообщений: broadcast address [key key] [version version] [ttl ttl]
- broadcastclient [address]
- broadcastdelay секунд - вообще-то должен вычисляться автоматически, но можно и вручную (по умолчанию 0.004)
- multicastclient [address]...
- driftfile driftfile - сюда записывается и при запуске извлекается сдвиг частоты местных часов (ppm - в действительности 2^-20)
-
enable/disable auth/bclient/monitor/pll/pps/stats
-включить/выключить режим работы:
- auth - с неупомянутыми соседями общаться только в режиме аутентификации (включено по умолчанию)
- monitor - разрешить мониторинг (команда monlist в xntpdc -узнать кто когда и сколько с нами общался) (включено по умолчанию)
- pll - разрешать настраивать частоту местных часов по NTP (включено по умолчанию)
- stats - разрешить сбор статистики (включено по умолчанию)
- keys/trustedkey/controlkey/requestkey - параметры аутентификации пока не рассматривались
-
statistics loopstats - при каждой
модификации локальных часов
записывает строчка в файл loopstats
формат файла loopstats- номер модифицированного Юлианского дня
- секунды с полуночи (UTC)
- смещение в секундах
- смещение частоты в милионных долях
- временная константа алгоритма дисциплинирования часов
-
statistics peerstats - каждое
общение с соседом
записывается в журнал
формат файла peerstats- номер модифицированного Юлианского дня
- секунды с полуночи (UTC)
- IP-адрес соседа
- статус соседа, шестнадцатеричное число (см. приложение А к RFC1305)
- смещение (сек)
- задержка (сек)
- дисперсия (сек)
- statistics clockstats - каждое сообщение от драйвера локальных часов записывается в журнал
- statsdir имя-директории-со-статистикой
-
filegen [file filename] [type typename] [flag
flagval] [link | nolink] [enable | disable] -
алгоритм генерации имен файлов
(например, файлов
статистики):
-
имена файлов состоят из:
- префикса: постоянная часть имени файла, задается либо при компиляции, либо специальными командами конфигурации
- имя файла: добавляется к префиксу без косой черты, две точки запрещены, может быть изменена ключом file
-
суффикс:
генерируется в
зависимости от typename:
- none - один обычный файл
- pid - при каждом запуске xntpd создается новый файл (к префиксу и имени файла добавляются точка и номер процесса)
- day - каждый день создается новый файл (день в координатах UTC) (к префиксу и имени файла добавляются .yyyymmdd)
- week - каждую неделю создается новый файл (к префиксу и имени файла добавляются .yyyyWww)
- month - каждый месяц создается новый файл (к префиксу и имени файла добавляются .yyyymm)
- year - каждый год создается новый файл (к префиксу и имени файла добавляются .yyyy)
- age - новый файл создается каждые 24 часа (к префиксу и имени файла добавляются .a и 8-значное количество секунд на момент создания файла от момента запуска xntpd)
- file задает специфический набор файлов, к которому относится команда filegen (например, peerstats)
- link/unlink - по умолчанию создается жесткая ссылка от файла без суффикса к текущему элементу набора (это позволяет обратиться к текущему файлу из набора используя постоянное имя)
- enable/disable разрешают/запрещают запись в соответствующий набор файлов
-
имена файлов состоят из:
-
restrict numeric-address [ mask numeric-mask ] [flag]
...
ограничение доступа: ACL сортируются по адресам (можно использовать слово default) и маскам, берется исходный адрес и последовательно сравнивается (and по маскам), от последнего удачного сравнения берется флаг доступа:- нет флагов - дать доступ
- ignore - игнорировать все пакеты
- noquery - игнорировать пакеты NTP 6 и 7 (запрос и модификация состояния)
- nomodify - игнорировать пакеты NTP 6 и 7 (модификация состояния)
- notrap - отказать в обеспечении mode 6 trap сервиса (удаленная журнализация событий)
- lowpriotrap - обслуживать ловушки, но прекращать обслуживание, если более приоритетный клиент потребует этого (сервер обслуживает максимум 3 ловушки)
- noserve - обслуживать только запросы mode 6 и 7
- nopeer - обслуживать хост, но не синхронизоваться с ним
- notrust - не рассматривать как источник синхронизации
- limited - обслуживать только ограниченное количество клиентов из данной сети
- ntpport/non-ntpport - это не флаг, а модификатор алгоритма сравнения адресов (сравнение успешно если исходный порт равен /не равен 123), алгоритм сортировки ставит эту строку в конец списка.
по умолчанию ставится ignore и ntpport для собственных адресов (чтобы не синхронизоваться с собой), не очень надежное средство, лучше использовать аутентификацию.
- clientlimit limit - для флага limited определяет макс. количество обслуживаемых клиентов (по умолчанию 3)
- clientperiod секунд - сколько секунд считать клиента активным и учитывать при определении количества обслуживаемых клиентов (3600)
-
конфигурация
аппаратных часов (если есть),
например обычного таймера (127.127.1.0) (про
другие устройства - читай
отдельно):
server 127.127.1.0 [prefer]
fudge 127.127.1.0 [time1 смещение-часов] [time2 смещение-частоты-ppm] [stratum int]
stratum лучше поставить побольше (10), чтобы этот источник работал, только если все остальные отвалятся - trap host-address [port port-number] [interface interface-address] - задать хост и порт (18447), которые будут вести журнал
- setvar variable - установка доп. переменных
- logfile имя-файла - использовать файл вместо syslog
- logconfig keyword - управление количеством сообщений сбрасываемых в журнал (по умолчанию все включено), ключевое слово может быть предварено символами равно (установка маски), минус (удаление класса сообщений), плюс (добавление); ключевое слово образуется слиянием класса сообщений (clock, peer, sys, sync) и класса событий (info, event, statistics, status); в качестве суффикса или префикса может использоваться слово all.
Местные настройки
Не забудь разрешить вход на порты ntp (UDP/123) для всех хостов, на которых работает ntp-сервера, питаемые снаружи.
Для тех
компьютеров, на которых точное (30мс) время не так
важно, можно не занимать ОЗУ
громадным xntpd (2 MB), а
запускать каждый час:
ntpdate -B ntp ntp2 ntp3
Надо сделать tickadj -s (оторвать системные часы от батареечных) перед запуском xntpd.
Запуск (Solaris 2.5):
/etc/rc2.d/S99xntpd
#!/bin/sh if [ $1 = "start" ]; then if [ -x /usr/local/bin/xntpd ]; then echo "Starting NTP daemon, takes about 1 minute... " # The following line is unnecessary if you turn off # dosynctodr in /etc/system. /usr/local/bin/tickadj -s /usr/local/bin/ntpdate -v server1 server2 sleep 60 /usr/local/bin/xntpd fi else if [ $1 = "stop" ]; then pid=`/usr/bin/ps -e | /usr/bin/grep xntpd | /usr/bin/sed -e 's/^*//' -e 's/ .*//'` if [ "${pid}" != "" ]; then echo "Stopping Network Time Protocol daemon " /usr/bin/kill ${pid} fi fi fi
Проблема. Время от времени опорные NTP-сервера перестают нас обслуживать. xntpd переводит их при этом в стратум-0 и синхронизуется черт знает с чем. Необходим автоматический отлов этой ситуации.