Приводим в соответствие с действительностью нашу временную зону GMT. Это действительно важно для дальнейшей работы. Проверяем правильность установленной GMT:
# date
Должно получится что-то вроде этого:
Sat Oct 24 18:39:13 ALMT 2009
Устанавливаем необходимые пакеты:
# aptitude install ntp ntpdate
Подбираем список эталонных NTP серверов.
Идём по адресу http://www.ntp.org/ и подбираем начальный список серверов.
Отбираем из списка удовлетворяющие нашим требованиям серверы с помощью анализа вывода следующей комманды (ключ -d указывает на использование отладочного режима без внесения реальных изменений, ключ -q указывает на использование запроса времени без его применения в системе):
# ntpdate -q 0.asia.pool.ntp.org 1.asia.pool.ntp.org 2.asia.pool.ntp.org 3.asia.pool.ntp.org 4.asia.pool.ntp.org
Получаем что-то вроде этого:
Error : Name or service not known
24 Oct 19:31:53 ntpdate[28139]: can't find host 4.asia.pool.ntp.org
server 202.134.1.10, stratum 2, offset 0.677492, delay 0.59177
server 92.61.176.135, stratum 2, offset 0.741315, delay 0.63548
server 140.109.1.4, stratum 2, offset 0.699329, delay 0.54922
server 61.153.197.226, stratum 2, offset 0.689142, delay 0.46191
server 158.108.212.157, stratum 2, offset 0.734005, delay 0.55374
server 158.108.212.158, stratum 2, offset 0.731420, delay 0.54985
server 158.108.212.156, stratum 2, offset 0.722033, delay 0.52885
24 Oct 19:32:01 ntpdate[28139]: step time server 115.139.9.150 offset 0.654564 sec
24 Oct 19:31:53 ntpdate[28139]: can't find host 4.asia.pool.ntp.org
server 202.134.1.10, stratum 2, offset 0.677492, delay 0.59177
server 92.61.176.135, stratum 2, offset 0.741315, delay 0.63548
server 140.109.1.4, stratum 2, offset 0.699329, delay 0.54922
server 61.153.197.226, stratum 2, offset 0.689142, delay 0.46191
server 158.108.212.157, stratum 2, offset 0.734005, delay 0.55374
server 158.108.212.158, stratum 2, offset 0.731420, delay 0.54985
server 158.108.212.156, stratum 2, offset 0.722033, delay 0.52885
24 Oct 19:32:01 ntpdate[28139]: step time server 115.139.9.150 offset 0.654564 sec
Выбираем NTP серверы второго уровня (stratum 2).
Создаем, если он ещё не создан, конфигурационный файл службы ntpd (предварительно поискать, вдруг в текущей реализации сервера файл перенесён в другое место):
# cd /etc
# touch ntp.conf
# touch ntp.conf
Создаем, если они ещё не созданы, файл логов и файл для хранения смещения системного времени (предварительно поискать, вдруг в текущей реализации сервера файлы перенесены в другое место):
# cd /var/log
# touch ntp.log
# cd /var/lib/ntp
# touch ntp.drift
# touch ntp.log
# cd /var/lib/ntp
# touch ntp.drift
Приводим конфигурационный файл ntp.conf службы ntpd к следующему виду (рекомендуется в конфигурационном файле использовать не доменные имена, а IP; есть масса невнятных стонов о некорректной работе ntpd при разрешении доменных имён):
# IP эталонных NTP серверов
server 10.10.2.22 iburst burst prefer # имя другого нашего NTP сервера, значение которого будет приоритетно при прочих равных условиях
server server1.ip iburst burst
server server2.ip iburst burst
...
server serverX.ip iburst burst
# ACL
# restrict default ignore # запрещаем отвечать кому бы то ни было (запасное правило на всякий случай)
restrict default nomodify noquery notrap ntpport nopeer # разрешаем от всех запросы к нашему серверу но не принимаем никаких указаний на изменение состояния
restrict 127.0.0.1 # разрешаем принимать и отправлять запросы любого вида с localhost
restrict 10.10.2.22 # разрешаем принимать и отправлять запросы любого вида с другого нашего сервера точного времени
# Настройки приложения
driftfile /var/lib/ntp/ntp.drift # уточнить месторасположение для текущей версии приложения
logfile /var/log/ntp.log
server 10.10.2.22 iburst burst prefer # имя другого нашего NTP сервера, значение которого будет приоритетно при прочих равных условиях
server server1.ip iburst burst
server server2.ip iburst burst
...
server serverX.ip iburst burst
# ACL
# restrict default ignore # запрещаем отвечать кому бы то ни было (запасное правило на всякий случай)
restrict default nomodify noquery notrap ntpport nopeer # разрешаем от всех запросы к нашему серверу но не принимаем никаких указаний на изменение состояния
restrict 127.0.0.1 # разрешаем принимать и отправлять запросы любого вида с localhost
restrict 10.10.2.22 # разрешаем принимать и отправлять запросы любого вида с другого нашего сервера точного времени
# Настройки приложения
driftfile /var/lib/ntp/ntp.drift # уточнить месторасположение для текущей версии приложения
logfile /var/log/ntp.log
Сразу договоримся, что служба NTPd будет заниматься только своим делом - корректировкой и раздачей времени, а не регламентированием доступа. Разрешения на доступ к этому серверу будем определять где угодно, но не силами самого сервера.
Если текущее системное время нашего NTP сервера не сильно отличается от фактического, то можно сразу запускать службу ntpd, иначе желательно обновить показания локальных часов с помощью утилиты ntpdate:
# ntpdate -b server0.name server1.name server2.name
Запуск или перезапуск службы ntpd элементарен:
# /etc/init.d/ntp start
# /etc/init.d/ntp restart
# /etc/init.d/ntp restart
Для теста можно запустить иначе, но служба не будет управляма с помощью стандартного скрипта:
# /usr/sbin/ntpd &
Проверяем факт запуска ntpd:
# ps wax | grep ntpd | grep -v grep
Получаем что-то вроде этого:
2195 /usr/sbin/ntpd -p /var/run/ntpd.pid
Остановка:
# /etc/init.d/ntp stop
Или следующим образом:
# /bin/kill `cat /var/run/ntpd.pid`
Если мы запускали службу ntpd не с помощью стандартного управляющего скрипта, то придеться искать процесс службы и останавливать его вручную.
Смотрим состояние ntpd:
# /usr/bin/ntpdc -s -n
Получаем примерно такое:
remote local st poll reach delay offset disp
-----------------------------------------------------------------------
.79.124.0.10 10.0.2.21 2 128 373 0.26662 -0.043952 0.07156
120.88.47.10 10.0.2.21 2 128 376 0.45685 0.016082 0.07793
*38.117.195.101 10.0.2.21 2 128 357 0.25211 -0.047911 0.11281
.209.167.68.100 10.0.2.21 2 128 277 0.23950 -0.037958 0.11118
-----------------------------------------------------------------------
.79.124.0.10 10.0.2.21 2 128 373 0.26662 -0.043952 0.07156
120.88.47.10 10.0.2.21 2 128 376 0.45685 0.016082 0.07793
*38.117.195.101 10.0.2.21 2 128 357 0.25211 -0.047911 0.11281
.209.167.68.100 10.0.2.21 2 128 277 0.23950 -0.037958 0.11118
Знаки перед именами серверов означают:
пробел - слишком большой уровень, цикл или явная ошибка;
x - фальшивый источник по алгоритму пересечения;
. - исключён из списка кандидатов из-за большого расстояния;
- - удалено из списка кандидатов алгоритмом кластеризации;
+ - входит в конечный список кандидатов;
# - выбран для синхронизации, но есть 6 лучших кандидатов;
* - выбран для синхронизации;
o - выбран для синхронизации, но используется PPS.
пробел - слишком большой уровень, цикл или явная ошибка;
x - фальшивый источник по алгоритму пересечения;
. - исключён из списка кандидатов из-за большого расстояния;
- - удалено из списка кандидатов алгоритмом кластеризации;
+ - входит в конечный список кандидатов;
# - выбран для синхронизации, но есть 6 лучших кандидатов;
* - выбран для синхронизации;
o - выбран для синхронизации, но используется PPS.
Наиболее интересное нам поле: "offset". Это разница между показателями локальных часов компьютера и эталонных NTP серверов. Чем меньше этот показатель, тем точнее идут наши часы. Служба ntpd "умная" и сама отсеивает источники времени слишком выбивающиеся за рамки разумного; через некоторое время после запуска ntpd выберет наиболее достоверные источники данных и будет синхронизироваться с ними. Представленный нами список эталонных NTP серверов регулярно пересматривается службой.
Следующая команда покажет нам полный список используемых эталонных NTP серверов:
# /usr/bin/ntpdc -c list
Получим что-то вроде этого:
client ns.airbites.bg
client 120-88-47-10.infra.hnsdc.com
client ns1.your-site.com
client zeus.yocum.org
client 120-88-47-10.infra.hnsdc.com
client ns1.your-site.com
client zeus.yocum.org
Смотрим обобщённую статистику ntpd:
# /usr/bin/ntpdc -c sysinfo -n
Получаем примерно такое:
system peer: 79.124.0.10
system peer mode: client
leap indicator: 00
stratum: 3
precision: -20
root distance: 0.33919 s
root dispersion: 0.18980 s
reference ID: [79.124.0.10]
reference time: ce8dab92.4e33abaf Sat, Oct 24 2009 22:36:34.305
jitter: 0.068192 s
stability: 0.000 ppm
broadcastdelay: 0.003998 s
authdelay: 0.000000 s
system peer mode: client
leap indicator: 00
stratum: 3
precision: -20
root distance: 0.33919 s
root dispersion: 0.18980 s
reference ID: [79.124.0.10]
reference time: ce8dab92.4e33abaf Sat, Oct 24 2009 22:36:34.305
jitter: 0.068192 s
stability: 0.000 ppm
broadcastdelay: 0.003998 s
authdelay: 0.000000 s
Ждем, когда служба выйдет в состояние стабильного полёта и получит уровень (stratum) от 2 до 4. Как только это состоялось, мы получаем работающий NTP сервер в сети. Ранее, чем за пятнадцать-двадцать минут этого не произойдет, так что - самое время пойти заваривать кофе.
Так или иначе, но в процессе штатной инсталляции ntpd создаётся конфигурация автоматического запуска службы ntpd; при удачном расположении Луны нам не придётся заботиться о создании скриптов запуска службы.
Возможно, будет полезным втиснуть в работу службы скрипт ежесуточной приостановки службы ntpd и запуска ntpdate для компенсации возможных погрешностей в работе службы, вызванной теми или иными причинами.
Для этого следует разместить в таблице заданий cron по адресу "/etc/crontab" указание на запуск скрипта (каждые сутки, в первую минуту семи часов утра):
1 7 * * * root /etc/custom/ntpscript.sh
Исполняемый скрипт должен иметь следующее содержимое:
#!/bin/sh
/etc/init.d/ntp stop
sleep 5
/usr/sbin/ntpdate ru.pool.ntp.org
sleep 5
/etc/init.d/ntp start
/etc/init.d/ntp stop
sleep 5
/usr/sbin/ntpdate ru.pool.ntp.org
sleep 5
/etc/init.d/ntp start
На тот случай, если у нас нет возможности синхронизироваться с внешними NTP серверами или есть свой собственный эталон времени, подключённый к NTP серверу, можно в конфигурационный файл ntp.conf вставить строки, объявляющие локальные часы компьютера своего рода эталонным NTP сервером с повышенным уровнем (stratum):
server 127.127.1.0 # условный, для приложения, адрес NTP сервера, ассоциированного с локальным таймером компьютера
fudge 127.127.1.0 stratum 1 # принудительно объявляем локальные часы компьютера эталонным NTP сервером уровня (statum) 1
fudge 127.127.1.0 stratum 1 # принудительно объявляем локальные часы компьютера эталонным NTP сервером уровня (statum) 1