Опубликован: 04.07.2008 | Уровень: специалист | Доступ: платный | ВУЗ: Европейский Университет в Санкт-Петербурге
Лекция 14:

Синхронизация времени в Solaris

< Лекция 13 || Лекция 14: 12 || Лекция 15 >

Время в сети очень важно, так как многие операции в сети должны грамотно синхронизироваться.

Например, очевидно, что при запуске резервного копирования через сеть время на сервере, где расположен ленточный накопитель, и время на сервере, откуда производится копирование, должно быть одинаковым – это особенно важно при автоматизации копирования на ленту, и еще важнее – при организации последовательного копирования на несколько лент, если объема одной недостаточно для завершения копирования.

Еще один пример важности синхронизации времени – возможные проблемы при сохранении на файловом сервере файлов с тех клиентских машин, чье время отличается от серверного. Из-за этого на клиентских системах может возникать ложное восприятие "свежести" или "несвежести" файлов, хранящихся на сервере. Согласитесь, неприятно сохранить файл и тут же убедиться, что он датирован вчерашинм днем. Приходится гадать, сохранен ли свежий файл в соседний каталог, или на сервере просто сбита дата, или дата неверна на клиентской машине.

Как узнать и установить системное время и дату

Для того, чтобы узнать, который час, в UNIX принято использовать команду date. Она сообщает и текущую системную дату, и время. Команда time предназначена для другой цели – она подсчитывает время, потраченное системой на выполнение команды. Попробуйте

time 'find / -name \* '

для проверки, как много времени процессора займет составление и вывод полного списка файлов системы.

С помощью команды date можно не только узнать текущее время, но и установить его. Устанавливать системное время может только root.

Программа date понимает разные форматы дат, когда вы требуете установить дату, наиболее стандартным является формат

date hhmm # hhmm – часы минуты

или

date ссyyMMddhhmm.ss

где

  • сс – 19 или 20 ( cc – от "век" – century);
  • yy – год (98, если 1998, или 67, если 2067);
  • MM – месяц;
  • dd – число месяца;
  • hh – час;
  • mm – минуты;
  • ss – секунды.
  • date

без параметров выводит текущую дату и время, в формате, определяемом параметрами локализации (locale).

Как синхронизировать время

В Solaris есть возможность установить сервер синхронизации времени, который будет отвечать на вопросы "который час?" от других машин. Клиент этого сервера – программа ntpdate. Она спрашивает время у сервера точного времени (также называемого сервером синхронизации времени) и директивно устанавливает время в своей системе. При маленьких отклонениях времени от эталонного она вызывает функцию "мягкого изменения" времени, когда время не устанавливается определенным одномоментно, а часы системы ежесекундно "подталкиваются" на долю секунды вперед или назад.

Программу ntpdate можно использовать и без собственного эталонного сервера времени, поскольку существуют публичные серверы времени.

Посмотрим, как работает ntpdate – программа установки системной даты и времени:

date
Сбт 29 Май 2004 19:10:20

Установим заведомо неверное время:

date 1912
Сбт 29 Май 2004 19:12:00

Теперь запустим ntpdate и сообщим ей для ориентировки адреса двух эталонных серверов времени (я взял их из списка на www.ntp.org):

ntpdate tock.keso.fi ntp.psn.ru
29 May 19:10:31 ntpdate[10630]: step time server 194.149.67.130
offset -95.351227 sec

Повторим для надежности:

ntpdate tock.keso.fi ntp.psn.ru
29 May 19:10:39 ntpdate[10631]: adjust time server 194.149.67.130
offset -0.006045 sec

Очевидно, что вторая подвижка времени оказалась существенно меньше, чем первая: вначале часы были "возвращены" к правильному времени, а затем лишь слегка синхронизированы, причем в первом случае использовалась явная установка времени (step time server), а во втором – мягкая "подвижка" (adjust time server).

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

Кроме программы ntpdate существуют и другие средства, предназначенные для организации синхронизации времени в сети. Программа ntpdate – это "клиентская" программа. В локальной сети организации имеет смысл установить по крайней мере один (лучше – два, чтобы был запасной) сервер времени. Именно он будет опрашивать серверы слоя 2, а компьютеры локальной сети будут сверять свои часы по этому локальному серверу времени. В качестве такого сервера в Solaris используют демон xntpd.

Настройка сервера синхронизации времени

Алгоритм работы xntpd

Для синхронизации времени в сети был разработан специальный протокол NTP (network time protocol), в настоящее время используется, в основном, версия 4 этого протокола, но серверы NTP обладают полной обратной совместимостью. Протокол предполагает существование нескольких "слоев" эталонных источников времени.

Как известно, в мире есть так называемые эталонные источники времени – цезиевые часы и радиосигналы точного времени со спутников. Такие эталонные источники, говоря языком протокола NTP, входят в слой 0 ( stratum 0 ) и являются максимально точными из всех доступных эталонов времени.

К серверам слоя 0 обращаются серверы слоя 1. Работающие на последних демоны xntpd (или ntpd – в других системах UNIX) распространяют точное время дальше, к серверам слоя 2 ( stratum 2 ). Именно к серверам слоя 2 обращаются обычные серверы точного времени из локальных сетей самых разных организаций.

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

Каждый NTP-сервер использует один или несколько источников точного времени, полностью полагаясь на них. Эти источники указываются в файле /etc/inet/ntp.conf. При старте xntpd отправляет им запрос, уточняя текущее время.

Каждый из серверов времени, которым мы доверяем, опрашивается несколько раз для получения достоверной статистики задержки передачи пакета. Если указано несколько серверов, время с каждого из них запрашивается многократно. Как правило, 5 минут уходит на опрос каждого сервера для получения показаний времени, которые следует расценивать как достаточно точные.

Запрос к серверу времени выполняется так:

  • клиент (например, наш xntpd ) указывает в отправляемом серверу пакете свое текущее системное время и отправляет этот пакет;
  • сервер времени получает пакет, вкладывает него время передачи пакета, вычисленное как разность между временем отправки и временем получения пакета сервером. Затем он вкладывает в этот же пакет свое текущее системное время и отправляет пакет обратно;
  • клиент получает пакет и запоминает свое локальное время получения пакета.

Теперь клиент имеет возможность рассчитать задержку передачи пакета как половину от "времени передачи туда и обратно минус время обработки пакета сервером".

Если разница между эталонным и текущим системным временем не превышает 128 миллисекунд, то xntpd подстраивает частоту системных часов так, чтобы они догнали или затормозились до эталонного времени. Подстройка происходит довольно медленно и плавно.

Если разница превышает 1000 секунд, xntpd полагает, что имеет место фатальный сбой времени на локальной машине, и завершается с предсмертным воплем, который запишется в /var/adm/messages.

Если разница находится в пределах между 128 миллисекундами и 1000 секундами, то xntpd по умолчанию выставляет время сразу же, просто вызывая функцию settimeofday().

Как видно, коррекция времени может быть постепенная и резкая. При резкой коррекции системное время изменяется быстрым скачком, одномоментно. Можно запретить такое изменение демону xntpd, указав при запуске ключ –x. Если часы спешат, особенно не рекомендуется изменять время резко, поскольку ряд приложений, зависимых от врмени (например, СУБД), могут в результате сохранить неверные данные. Впрочем, при постоянной работе сервера xntpd, как и при регулярном опросе такого сервера с помощью ntpdate, сильное расхождение времени нашего сервера и эталона исключено. Не следует использовать в качестве сервера времени компьютеры со сбоями аппаратуры или разряженной (неисправной) батарейкой CMOS (x86). Кроме этого, сервер времени не должен быть сильно нагруженным ресурсоемкими задачами компьютером: он не сможет обеспечить быстрый ответ и корректную обработку запроса.

Для общения между собой серверы времени используют UDP порт 123.

< Лекция 13 || Лекция 14: 12 || Лекция 15 >
Александр Тагильцев
Александр Тагильцев

Где проводится профессиональная переподготовка "Системное администрирование Windows"? Что-то я не совсем понял как проводится обучение.

Анатолий Натрусов
Анатолий Натрусов
Россия
Виктор Саркисов
Виктор Саркисов
Россия, Нижний Новгород, НГТУ, 2001