DataLife Engine > Система > Сервер синхронизации времени NTPD

Сервер синхронизации времени NTPD


02-11-2010. Разместил: synergix Сервер синхронизации времени NTPD
Сегодня поговорим о точном времени. Написать об этом статью меня подтолкнул друг, который просил поднять сервис точного времени для синхронизации своих компьютеров, имеющих выход в TAS-IX.
Собственно, опишу кратко сам принцип синхронизации. Практически на всех компьютерах производители устанавливают TOY-микросхемы (time-of-year), которые позволяют хранить системное время, а также инициализировать его при загрузке. Суть демона ntpd состоит в том, чтобы плавно подгонять системное время под точные сигналы с серверов синхронизации. Сама модель включает в себя слоистую структуру. Первый слой, или stratum 0 - это сервера, имеющий источник точного времени, такого как атомные часы, или источник точного времени, такого как CDMA, GPS, etc. Сами сервера Stratum 0 непосредственно к сети не подключены. К ним подключены сервера уровня Stratum 1, с которых собственно и производится синхронизация по сети посредством специально разработанного протокола NTP (Network Time Protocol).

Для получения точного времени в FreeBSD имеется как утилита ntpdate, так и собственно сервер синхронизации ntpd. Различие в том, что ntpdate производит резкую синхронизацию, что может быть критично для некоторых сервисов, если разница во времени будет существенная, например Dovecot при разнице в 2 секунды завершил работу с сообщением об резком изменении системного времени. Так что синхронизировать время с помощью ntpdate имеет смысл только на момент начальной загрузки до старта системных сервисов. Подробно ознакомиться с описанием утилиты и списком опций вы можете набрав man ntpdate.
Собственно, использовать ее очень просто, достаточно в консоли набрать
#ntpdate unix.uz
и утилита проведет синхронизацию вашего системного времени с NTP-сервером unix.uz.

Нам же, на сервере, имеющем большой аптайм и редкие перезагрузки, имеет смысл настроить ntpd.

Главный конфигурационный файл называется ntp.conf и находится в директории /etc. Я приведу краткий листинг своего конфига с пояснениями.


#Эта секция описывает сервера,с которых мы будем 
#синхронизироваться, количество их должно быть не менее 3, 
#иначе мы получим Stratum 16 и компьютеры не будут с нас 
#обновляться.

server ntp1.imvp.ru iburst prefer
server ntp3.imvp.ru prefer
server ntp4.imvp.ru prefer
server time.nist.gov prefer

#Далее указываем файл для ведения логов и так называемый 
#drift-файл, который нужен для хранении разницы между точным и 
#вашим системным временем.

driftfile /var/db/ntp.drift
logfile /var/log/ntp.log

#Тут описываем разрешения - кому можно синхронизироваться, с кого можно, и кому можно менять время.

restrict default nomodify notrap #разрешаю всем синхронизацию со мной

#разрешаю синхронизацию с данными серверами, они должны иметь возможность менять время нашего сервера.
restrict ntp1.imvp.ru noquery notrap 
restrict ntp3.imvp.ru noquery notrap
restrict ntp4.imvp.ru noquery notrap
restrict time.nist.gov noquery notrap

#разрешаю все с локалхоста(изменение, синхронизация,управление, etc.)
restrict 127.0.0.1



Сохраняем, и запускаем ntpd

#/etc/rc.d/ntpd start


Смотрим вывод лога на наличие ошибок:
unix# cat /var/log/ntp.log
 1 Nov 11:16:28 ntpd[58585]: synchronized to 128.9.176.30, stratum 1
 1 Nov 11:16:19 ntpd[58585]: time reset -8.838775 s
 1 Nov 11:20:32 ntpd[58585]: ntpd exiting on signal 15
 1 Nov 11:20:39 ntpd[58670]: synchronized to 62.117.76.142, stratum 1
 1 Nov 11:20:39 ntpd[58670]: kernel time sync status change 2001
 1 Nov 11:20:50 ntpd[58670]: ntpd exiting on signal 15
 1 Nov 11:43:39 ntpd[58953]: synchronized to 62.117.76.142, stratum 1
 1 Nov 11:43:39 ntpd[58953]: kernel time sync status change 2001
 1 Nov 18:00:32 ntpd[58953]: ntpd exiting on signal 15
 1 Nov 18:00:50 ntpd[61243]: synchronized to 62.117.76.142, stratum 1
 1 Nov 18:00:50 ntpd[61243]: kernel time sync status change 2001
 1 Nov 18:52:33 ntpd[61243]: ntpd exiting on signal 15
 1 Nov 18:52:41 ntpd[31119]: synchronized to 62.117.76.142, stratum 1
 1 Nov 18:52:41 ntpd[31119]: kernel time sync status change 2001
 2 Nov 00:02:35 ntpd[31119]: kernel time sync status change 6001
 2 Nov 00:28:13 ntpd[31119]: kernel time sync status change 2001
 2 Nov 04:57:24 ntpd[31119]: kernel time sync status change 6001
 2 Nov 05:14:28 ntpd[31119]: kernel time sync status change 2001
 2 Nov 05:48:37 ntpd[31119]: kernel time sync status change 6001
 2 Nov 06:05:43 ntpd[31119]: kernel time sync status change 2001
 2 Nov 07:31:03 ntpd[31119]: kernel time sync status change 6001
 2 Nov 07:48:07 ntpd[31119]: kernel time sync status change 2001
unix#


Смотрим на каком сокете слушает демон:

unix# sockstat|grep -v udp6|grep ntpd
root     ntpd       31119 3  dgram  -> /var/run/logpriv
root     ntpd       31119 20 udp4   *:123                 *:*
root     ntpd       31119 22 udp4   91.212.89.106:123     *:*
root     ntpd       31119 25 udp4   127.0.0.1:123         *:*
unix#


Следует отметить, , что после перезапуска демона синхронизация не начнется сразу же. Придется подождать некоторое время, потому что ntpd несколько медлителен и не торопится обновлять время, мне пришлось ждать около двух часов. Для того, чтобы проследить как идут дела с установкой соединения с другими серверами, есть утилита ntpq:

unix# ntpq -c peers
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp1.imvp.ru    .PPS.            1 u  688 1024  377   79.179    0.197   0.430
+ntp3.imvp.ru    .PPS.            1 u  612 1024  377   80.477    0.972   0.077
+ntp4.imvp.ru    .PPS.            1 u  669 1024  377   79.574    0.133   0.016
-time.nist.gov   .ACTS.           1 u  493 1024  213  251.832    9.269   2.644
unix#


Знаки перед именами серверов означают:
пробел - слишком большой уровень, цикл или явная ошибка;
x - фальшивый источник по алгоритму пересечения;
. - исключён из списка кандидатов из-за большого расстояния;
- - удалено из списка кандидатов алгоритмом кластеризации;
+ - входит в конечный список кандидатов;
# - выбран для синхронизации, но есть 6 лучших кандидатов;
* - выбран для синхронизации;
o - выбран для синхронизации, но используется PPS.

Наиболее интересное нам поле: "offset". Это разница между показателями локальных часов компьютера и эталонных NTP серверов. Чем меньше этот показатель, тем точнее идут наши часы. Служба ntpd "умная" и сама отсеивает источники времени слишком выбивающиеся за рамки разумного; через некоторое время после запуска ntpd выберет наиболее достоверные источники данных и будет синхронизироваться с ними. Представленный нами список эталонных NTP серверов регулярно пересматривается службой.

Примерно такой вывод команды говорит о том, что сейчас для синхронизации мне доступны указанные серверы. Теперь, в качестве проверки, можно синхронизировать время на самом сервере с помощью ntpdate:

unix# ntpdate -q localhost
server 127.0.0.1, stratum 2, offset -0.000006, delay 0.02563
server ::1, stratum 2, offset -0.000004, delay 0.02565
 2 Nov 08:52:02 ntpdate[56948]: adjust time server 127.0.0.1 offset -0.000006 sec
unix#


И напоследок, нужно добавить демон в автозагрузку:

ntpd_enable="YES"


В том случае, если у вас работает файерволл (а он у вас должен работать), нужно проследить, чтобы порт 123/UDP был открыт.
В IPFW это делается добавлением команды:

ipfw add allow udp from any to me 123 via ${ex_if}


где ex_if - ваш внешний интерфейс. Вот собственно и все.
Если вы решите также поднять свой сервер синхронизации времени, добавьте его в пул http://www.pool.ntp.org, в данный момент там всего 3 активных сервера.

Все ваши замечания и вопросы по данной статье Вы можете опубликовать на форуме.
Вернуться назад