Не думай о секундах свысока

Маленькая повесть о нашем времени


Часть 1. Вводная

Далеко-далеко, за зелеными лесами и широкими лугами молочные реки сливаются с шоколадными берегами от Nestle, гномы пересчитывают сокровища в банках и делают точнейшие в мире часы для супершпионов. А еще в Швейцарии расположен институт ядерных исследований, именуемый в просторечии CERN. Если учесть, что CERN стоял у истоков современного интернета, то легко понять любовь интернетчиков к точному времени. Ведь ни для кого не является секретом, что самым точным способом выражения интервала времени (секунд, например) является указание числа физических превращений определенного атома. Вот и заводят каждый день в CERN часы по идеально точному атомному хронометру. Делают то же самое в Беркли (США) и в Дубне (Россия) и еще в некоторых местах. Для обмена между компьютерами информацией, который час, создали протокол NTP (network time protocol). При помощи этого протокола два любых компьютера (если поддерживается операционной системой) могут синхронизировать время, причем время на одном из них условно объявляется точным, а время на втором юстируется под время первого компьютера. В описанном случае первый компьютер является сервером, второй - клиентом.

Существует разделение всех компьютеров в мире на классы согласно их роли в процессе юстировки и распространения идеально точного времени.

Серверы I класса имеют собственное оборудование для получения показаний времени напрямую с радиоизотопных образцов. Серверы II класса образуют сеть, корнями которой являются серверы I класса, а сами участники предназначены для поддержания бесперебойного функционирования сети, обеспечивая избыточность (redundancy) в хранении идеально точного времени. Платой за это является незначительная рассогласованность между собой этих серверов. Если для кого-то пять наносекунд - существенный интервал времени, то советую им начать чтение статьи с конца. Описываемая сеть включает всего лишь сотню компьютеров, разбросанных по всему миру. Наконец, серверы III класса обеспечивают "раздачу" точного времени в локальные подсети. Они же являются "корнями" соответствующих субдоменных сетей.

 

Для системных администраторов привожу таблицу иерархии компьютеров в доменном дереве.

Уровень Члены
1 внешний сервер (сервер III класса)
2 эмулятор PDC в корне леса
3 DC в корне леса или эмуляторы PDC в субдоменах
4 рабочие станции и рядовые серверы в корне леса или DC в субдоменах
5 рабочие станции и рядовые серверы в субдоменах

Список адресов серверов I и II уровней ведется централизованно на сайте EECIS (www.eecis.udel.edu/~mills/ntp/clock1.htm и www.eecis.udel.edu/~mills/ntp/clock2.htm).

Для кого же нужно точное время? Для всех нас. Простым пользователям просто интересен сам факт точного времени. Системным аналитикам миллисекунды разницы дают точную картину при анализе процессов, синхронно происходящих на разных компьютерах (например, сетевых атак). Для администраторов сетей большая разница во времени локального компьютера и сервера приводит к невозможности авторизации (особенность протокола Kerberos), для администраторов баз данных (например, банковских систем) - к срыву синхронизации и параличу системы транзакций (например, перестают проходить платежи). Я уже не говорю о военных и транспортниках, для которых неточность во времени может обернуться колоссальными финансовыми убытками и человеческими жертвами.

Взаимодействие сервера и клиента на низком уровне происходит посредством соединения по порту 123 протокола UDP. Так что первое необходимое условие для сверки часов по сети - незанятость другими службами данного порта.

Если попытаться рассматривать все особенности функционирования NTP на разных операционных системах, то на это не хватит и десяти полос газеты. Давайте ограничимся решением практической задачи настройки компьютера под сервер или клиент NTP в случае, если он работает под управлением ОС Windows 2000/XP/2003.


Часть 2. MS Windows

Примем как данность, что Microsoft реализовала протокол NTP в сильно упрощенном варианте, который назвала Simple NTP. Его особенностью является невысокая точность (time shift может достигать 10 микросекунд) и отсутствие какой-либо проверки правильности. Но для практических целей поддержания точного времени на компьютерах с установленной MS Windows, точность внутренних часов которой достигает 1 миллисекунды, SNTP вполне достаточно.

Сам процесс синхронизации осуществляется службой времени Windows, полное название - w32time service. Она зависит от RPC, так что будьте бдительны, не заблокируйте случайно ее запуск! В зависимости от текущего состояния счетчика синхронизации и политики синхронизации, разово или периодически инициируется соединение с серверами SNTP, перечисленными в соответствующей ветке реестра определенным ключом. Если соединение с сервером установить не удалось, служба времени реагирует весьма болезненно: после 8 неудачных попыток тихо самоостаналивается на 960 минут, правда, при этом занеся запись в журнал ошибок.

При соединении клиента с сервером (если необходимо провести одноразовую синхронизацию, можно просто исполнить команду w32tm -once, при этом она не будет запущена как служба) происходит получение с сервера точного времени и обрыв связи. В зависимости от текущего значения таймера и полученного маркера времени принимается решение о синхронизации. На это решение влияет также применяемая политика синхронизации (о ней ниже). После проведения (или ошибки) синхронизации MS Windows добавляет в журнал системных событий соответствующую запись.


Часть 3. Практическая

Но чтобы в вашей сети такой процесс принес плоды, требуется наличие, как минимум, одного сервера SNTP; желательно его соединение с другим авторизованным источником точного времени (по возможности, через интернет или интранет). Служба сервера SNTP входит в состав Windows 2000 (2003) Server всех модификаций. На сервере необходимо сделать следующие операции:

  1. Установить службу SNTP server, если она пока не установлена (Панель Управления - Установка и удаление программ - Установка компонентов Windows - Прочие сетевые службы).
  2. Через оснастку "Службы" установить тип запуска службы "Авто" и запустить службу SNTP server. В случае фатального исхода попытки проверить функционирование службы DCOM (там же).
  3. В консоли подать команду net time /setsntp:<список_адресов_серверов>. Это запустит службу w32time и автоматически занесет список адресов внешних серверов времени в нужную ветку реестра (HKLM\SYSTEM\CurrentControlSet\ Services\w32time\Parameters\ntpserver). Автоматически применятся и запишутся в реестр default-значения политики синхронизации.
  4. Открыть указанную ветку реестра в редакторе и изменить остальные значения параметров на желаемые.
  5. Через оснастку "Службы" перезапустить службу w32time (как вариант, исполнить в командной строке net stop w32time && net start w32time).
  6. Проверить правильность настройки списка внешних серверов командой в консоли net time /querysntp. Вы должны увидеть правильно отображаемый список адресов. О правилах его записи - ниже.
  7. Проверить командой net time время на внешнем сервере и time - на этом компьютере.
  8. Провести первую синхронизацию времени командой в консоли net time /set или w32tm -s.
  9. Выполнить пункт 7 еще раз, убедившись в синхронности хода часов.

Я настоятельно рекомендую провести этот процесс, как минимум, на двух компьютерах в вашей сети: PDC (первичном контроллере домена) и шлюзе в интернет (если он у вас на Windows Server). Иначе вам придется для синхронизации времени на PDC открывать прозрачным 123-й порт на шлюзе, и каждый компьютер сети полезет в него (шлюз) своими грязными лапами. Естественно, нелишне здесь повторить рекомендацию Microsoft о недопустимости совмещения шлюзом в интернет роли PDC или же его эмулятора. У себя же в сети я дополнительно сделал сервером SNTP еще и BDC (резервный контроллер домена).

Для того, чтобы автоматически на BDC установить PDC в качестве основного и единственного надежного сервера, достаточно на BDC исполнить команду net time /setsntp.

Теперь займемся настройкой клиентов. На каждом клиенте необходимо произвести следующие операции:

  1. В консоли (с правами Администратора, естественно) подать команду net time /setsntp:<список_адресов_ внутренних_серверов>. Это запустит службу w32time и автоматически занесет список адресов внутренних серверов времени в нужную ветку реестра (HKLM\SYSTEM\CurrentControlSet\ Services\w32time\Parameters\ntpserver). Автоматически применятся и запишутся в реестр default-значения политики синхронизации. В случае фатального исхода попытки проверить функционирование службы RPC (там же).
  2. Открыть указанную ветку реестра в редакторе и изменить остальные значения параметров на желаемые в соответствии с выбранной политикой.
  3. Перезапустить службу w32time.
  4. Проверить правильность настройки списка внешних серверов командой в консоли net time /querysntp. Вы должны увидеть правильно отображаемый список адресов.
  5. Проверить командой net time время на внутреннем сервере и time - на клиенте.
  6. Провести первую синхронизацию времени командой в консоли net time /set или w32tm -s.
  7. Еще раз убедиться в синхронности хода часов. Исполнить команду net time \\computer_somewhere, где computer_somewhere - некий компьютер в вашей сети, заведомо синхронизированный с сервером (например, BDC). Убедиться в синхронности показаний часов.


Часть 4. Настройки

Итак, вы уже заметили некоторое сходство в процессах настройки сервера и клиента. В чем же между ними разница? В настройках. В таблице я дам описание параметров службы w32time.

Параметр Значение Назначение
LocalNTP 0 компьютер является клиентом SNTP
1 компьютер является сервером SNTP
Reliable TimeSouce 1 только для сервера, который должен считать, что его внутренние часы надежны, иначе он не будет отвечать на запросы
ntpserver список адресов список адресов вышестоящих серверов
type Nt5DS при синхронизации пользоваться доменным деревом (см. выше)
NTP при синхронизации пользоваться списком ntpserver
MaxAllowed ClockErrIn Seconds <число> <число> секунд между синхронизациями
Period 0 при Nt5DS синхронизация каждые 45 минут до 3 удачных попыток, затем один раз в день. Для NTP — каждые 8 часов
<число> <число> попыток синхронизации в день
BiDaily синхронизация раз в два дня
TriDaily синхронизация раз в три дня
Weekly синхронизация раз в неделю
Special Skew синхронизация каждые 45 минут до 3 удачных попыток, затем каждые 8 часов.
Daily Special Skew синхронизация каждые 45 минут до 1 удачной попытки, затем каждый день

Итак, "ассортимент" политик юстировки, задаваемых параметром Period, удовлетворит требования самого взыскательного пользователя. В устойчивых сетях после настройки времени вполне достаточно SpecialSkew. Теперь поговорим о формировании списка адресов серверов SNTP. Из-за особенностей реализации службы, для задания единственного адреса сервера допустимо задание как IP-адреса, так и доменного имени. Но если вы хотите задать несколько серверов, то в реестре вам придется через пробел указать их IP-адреса. Подача списка адресов в виде неразрешенных доменных имен через пробел допускается только в командной строке, утилита которой разрешает имена в IP-адреса. Данная ошибка существует только в Windows 2000 с Service Pack ниже SP3.

Для упрощения настройки SNTP в сети для новых компьютеров я сбросил ветку реестра в REG-файл (в примере - start.reg на ресурсе Install компьютера servant), и теперь на каждом новом компьютере достаточно всего лишь исполнить в командной строке (с правами Администратора, напоминаю) следующий BAT-файл:

@echo off
net stop w32time
start \\servant\install\time.reg
net start w32time
net time /set /yes
pause Server SNTP added successfully! Press any key to exit this window

На компьютерах под управлением старых версий Windows (Windows 98 или 4.0) возможна только ручная синхронизация времени командой net time \\SERVER_ADDRESS /set /yes, которую можно записать в BAT-файл и поместить ярлык на него в Планировщик задач.

Если необходима высокая точность или дополнительные возможности службы времени, то на PDC необходимо установить стороннее программное обеспечение и обеспечить синхронизацию им, а синхронизацию w32time временно отключить, использовав для этого значение NoSync параметра Type.

Теперь настало время поговорить о такой опции рассматриваемой службы, как автоюстировка хода часов. Ни для кого не является секретом, что основные задающие часы питаются во время отключения компьютера от аккумулятора, выходное напряжение которого (если он невысокого качества) может сильно отличаться от номинальных 3 В, что вносит свою "лепту" в ошибку работы кварцевого генератора, задающего такты времени. Таким образом, на низкокачественных системных платах (и примером тому может служить продукция почивших в бозе Zida и Acorp) время может "убегать" от реального до получаса за ночь. Windows пытается помочь решить эту проблему, используя свой собственный таймер, который учитывает вносимую w32time "правку" в ход времени. Клиентская компонента w32time оценивает разницу между временем, прошедшим между двумя юстировками часов на сервере и клиенте, и делает соответствующие выводы, нужно ли дополнительно "подводить" часы на клиенте. Разберем правила сего алгоритма:

если разница во времени сервера и клиента превышает 8 часов, синхронизация не проводится никак и возникает ошибка;

если разница во времени сервера и клиента превышает 3 минуты, автоматически происходит безоговорочная синхронизация клиентского времени под серверное;

если разница во времени менее 3 минут (очень похоже, что со времени предыдущей синхронизации было установлено правильное время, но произошла небольшая рассинхронизация), автоматически понижается частота локального таймера клиентского компьютера: рассчитывается поправка и вносится в параметр msSkewPerDay указанного раздела реестра.

Для выключения автоюстировки можно запустить w32tm -adjoff - и отключение навсегда гарантировано. При этом синхронизация по графику будет точно синхронизировать время и ничего более. Для временного выключения автоюстировки достаточно запустить w32time в тестовом режиме командой w32tm -test. Говоря вообще, работу службы времени Windows из командной строки можно и нужно изучать при помощи консольной команды w32tm, что и будет домашним заданием сисадминам (например, изменить номер используемого порта).

Да пребудет с вами точное время и покровитель интернета!

Ваш дядюшка хардовик,

Mexicanetz Express,
crowngold.narod.ru,
ICQ UIN 26967876

Версия для печатиВерсия для печати

Номер: 

37 за 2005 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!