Adjtimex(8)
Adjtimex(8)
позволяет пользователю изменять в ядре переменные времени, и таким образом изменять скорость хода системных часов (для этого вы должны зайти в систему пользователем "root"). Очень удобно сравнивать системные часы с ЧРВ, используя величину коррекции, указанную в /etc/adjtime. Таким образом, очень легко корректировать системные часы, один раз установив величину коррекции ЧРВ. Найдя верное значение коррекции, вы можете добавить строку в ваш загрузочный скрипт, выставляющую правильные значения переменных ядра во время загрузки системы. Так как adjtimex(8)
предназначен для работы с clock(8)
или hwclock(8), то вам придется немного потрудится для того, чтобы устранить недостаток "каждых 11 минут".
После завершения установки adjtimex(8), вы можете почерпнуть больше информации, набрав команду "man 8 adjtimex" (так же есть инструкция к adjtimex(2), которая, к сожалению, не очень подробна). Можно прочитать файл README, расположенный в /usr/doc/adjtimex-1.3/README (где номер версии, в указанном пути, должен соответствовать версии adjtimex(8)).
Chrony
Xntpd изначально был написан для машин с постоянным соединением с сетевыми радио-часами. Теоретически, она может быть использована машинами, которые соединяются на короткое время, но Richard Curnow не смог заставить программу работать так, как он того хотел, поэтому он написал "chrony" как выход для тех из нас, кто соединяется с сетью при помощи dial-up (для решения этой проблемы существует "моментальное соединение" в ntpd). Текущая версия chrony включает в себя величину коррекции ЧРВ для машин, отключенных от сети на долгое время.
Вы можете получить больше информации, посетив страницу Richard Curnow на http://www.rrbcurnow.freenet.co.uk/chrony/index.html.. Вы можете получить исходные тексты программы не только там, но и на других Linux-сайтах.
CHU и декодер
CHU - это канадская коротковолновая станция около Оттавы. Она очень похожа на WWV в США, но с одним важным отличием: в добавление к обычному объявлению точного времени на английском и французском, она раз в минуту передает сигналы точного времени, используя старые модемные сигналы "Bell 103" (300 бод). Эти сигналы очень хорошо декодируются, и Bill Rossi выдвинул идею, что вам не нужен модем, а только радиоприемник и звуковая карта. Если вам удастся поймать сигнал CHU, то это было бы наиболее дешевым способом использования радио-часов. Частота приема коротковолновых передач может меняться в течении дня, но Bill заявляет, что путем настройки частот дважды в день (утром и вечером) он имеет связь 24 часа в сутки. CHU вещает на частотах 3.33, 7.335 и 14.670 МГц.
Для получения более подробной информации обратитесь к домашней странице Bill Rossi по адресу http://www.rossi.com/chu/. Исходный файл вы можете найти на архивных сайтах Linux. Для получения информации о службе времени на CHU загляните на http://www.nrc.ca/inms/time/ctse.html.
Сайт NTP собирается поставить "декодер" для расшифровки сигналов времени CHU или любого другого коротковолнового канала, используя недорогую микросхему 300-бод на http://www.eecis.udel.edu/ntp/ntp_spool/html/gadget.htm. Там можно найти принципиальную схему двухсторонней платы, которую легко сделать самому (или попросить кого-либо помочь).
Ntpd включает в себя драйвер для приема CHU, который работает и с "декодерами" такого типа , или посылает сигнал на вход микрофона на Sun SPARCstation (или другой машины с "совместимыми аудио-драйверами").
Clock(8) и Hwclock(8)
Все дистрибутивы Linux содержат или старую clock(8), или новую hwclock(8), но не содержат величины коррекции. Так же обычно в них есть программа adjtimex(8), но она может быть включена в CD, как дополнительное приложение (или вы можете ее скачать по сети). Некоторые дистрибутивы включают в себя графическую программу корректировки часов, работающую под X-windows, но все они предназначены для интерактивного использования, и система все равно установит clock(8) или hwclock(8) для их использования при коррекции в процессе загрузки.
Clock(8) требует, чтобы вы вычислили величину коррекции сами, а hwclock(8)
вычисляет ее автоматически (использование другой программы для коррекции часов повлечет за собой несовпадение величин, поэтому предпочтительно использование одной программы, если используется величина коррекции). Если у вас старая система, которая использует clock(8), и вы хотите ее заменить, то найдите hwclock(8) в архиве "util-linux" версии 2.7 или более поздней. Посмотрите инструкцию для получения более подробной информации.
Замечание
Инструкция к hwclock(8) может называться "clock" для обеспечения обратной совместимости, поэтому попробуйте оба имени. Hwclock(8) будет работать с командами для clock(8), но результаты могут различаться, потому что "hwclock -a" - это не совсем то же самое, что и "clock -a", поэтому я рекомендую при установке hwclock заменить все обращения и ссылки к "clock", в вашем загрузочном скрипте, на обращения к hwclock, используя ее команды.
Загрузочные скрипты различаются в разных дистрибутивах, поэтому вам придется поискать то место, где производится коррекция времени. Обычно это производится в /etc/rc.local, /etc/rc.d/rc.sysinit, /etc/rc.d/boot и т.п. Величина коррекции для ЧРВ находится в файле /etc/adjtime.
Когда вы устанавливаете точное время на часах для определения величины коррекции, помните, что сигнал по телефонной линии не может быть абсолютно точным.
Если ваши ЧРВ ведут себя странно, то, возможно, у вас проблемы с оборудованием. Некоторые чипы ЧРВ содержат литиевую батарейку, которая могла разрядиться, и, поэтому, в некоторых материнских платах есть разъемы для внешнего источника питания (удостоверьтесь в том, что переключатель стоит в правильном положении). Эта же батарея питает CMOS RAM, но часы потребляют больше энергии, и быстрее выходят из строя. Так же странные результаты могут возникнуть из-за проблем с прерываниями.
Содержание
Сигналы GPS включают в себя точное время. В некоторые приемники GPS встроены последовательные порты. Ntpd содержит драйвера для некоторых таких приемников. Системе 1PPS ("One Pulse Per Second", требуется для высокой точности) требуется отдельный интерфейс для подключения к компьютеру.
TAPR (Tuscon Amateur Packet Radio) делает приспособления "TAC-2" ("Totally Accurate Clock") для интерфейсов, которые встраиваются в последовательный порт и работают с любым приемником GPS. Таким образом вы можете получить на выходе 1PPS. Некоторые модели могут быть установлены непосредственно на плату. Для получения более подробной информации загляните на http://www.tapr.org. Цена (на июнь 1999) составляет около $140, не включая стоимость приемника GPS. В комплект поставки не входят какие-либо средства установки оборудования.
"Декодер" CHU (описанный в другой главе) может использоваться как интерфейс к сигналам 1PPS. Эта проблема обсуждается на сайте NTP по адресу http://www.eecis.udel.edu/ntp/ntp_spool/html/pps.htm.
Измерение величины коррекции
Для начала вам надо узнать, который час :-). Мой любимый способ - позвонить на WWV по телефону (303)499-7111 (это дорого). Если у вас есть доступ к серверу точного времени, вы можете воспользоваться программой ntpdate, входящей в приложение xntpd
(поставьте флажок -b для того, чтобы ядро не сверяло системное время с ЧРВ). Иначе используйте "date -s hh:mm:ss" для установки времени вручную, а затем выполните "clock -w" для того, чтобы синхронизировать ЧРВ с системными часами. Вам потребуется знать, когда вы последний раз устанавливали время на часах, поэтому запишите эту информацию туда, где вы ее не потеряете. Если вы используете ntpdate, напишите "date +%s" и запишите число секунд, прошедших с 1 января 1970 года.
Затем зайдите в систему несколько дней спустя и посмотрите на сколько отклонились ваши часы. Если вы устанавливаете часы вручную, я бы посоветовал подождать две недели и высчитать отклонение в сек/день. После нескольких месяцев высчитайте отклонение в долях секунд за день. Если вы используете ntpdate, то вам придется долго ждать. Но позже можно их точно настроить.
Активируйте синхронизацию "clock -a" через некоторые промежутки времени для того, чтобы время на системных часах и ЧРВ не различалось. Эта команда также будет выполнятся каждый раз при запуске системы. Если вы делаете это часто, то этого будет достаточно для синхронности.
Помните, что в некоторых программах может произойти сбой, если коррекция часов произойдет более, чем на секунду, или, если время будет скорректировано назад. Если возникли подобные проблемы, то используйте xntpd или ntpdate для более плавной корректировки.
Низкочастотные сигналы точного времени: DCF77, MSF(Rugby), WWVB
Эти низкочастотные станции передают сигнал точного времени, путем включения и отключения модуляции. Каждая станция использует собственную схему кодов, и их описание можно найти на сервере NTP
http://www.eecis.udel.edu/mills/ntp/index.htm
(в конце страницы). DCF77 в Германии вещает на частоте 77.5 кГц. MSF в Англии (называемая "Rugby") и WWVB в Колорадо вещают на частоте 60 кГц.
Дорогие приемники, встроенные в последовательный порт, получили распространение в Европе. В Ntpd есть драйверы для некоторых MSF-приемников.
В США есть много компаний, которые продают относительно дорогие приемники WWVB со встроенными радио-часами (включая несколько с настенными часами), но меня интересуют только две модели, которые могут быть подключены к компьютеру:
Ultralink Model 320 стоит примерно $120 (на июнь 1999). В нем имеется последовательный интерфейс, и он может управляться кодами ASCII, поэтому его не так сложно запрограммировать. Он потребляет 1mA с последовательного порта. Антенна может находиться на расстоянии до 30 метров от компьютера. Блок содержит свои собственные часы, сохраняющие время, если радиосигнал будет утерян. Выпускается и упрощенная версия за $80. Она предназначена для использования с последовательными микроконтроллерами "BASIC Stamp". Взгляните на http://www.ulio.com/timepr.html.
Arcron Technology продает за $130 настольные часы с дополнительным последовательным портом, вместе с программным обеспечением для Windows. Взгляните на http://www.arctime.com
Уверенность приема WWVB может различаться. Станция обещает увеличить свою мощность в ближайшем будущем. Вы можете ознакомится с этой информацией на сайте NIST http://www.boulder.nist.gov/timefreq/wwvstatus.html.
Основные способы для Linux
В действительности, в Linux имеются две параллельные системы учета времени: одна - это часы с питанием от батарей - "Часы Реального Времени" (так же известные как "ЧРВ", "RTC", "CMOS clock", "аппаратные часы"), которые идут тогда, когда компьютер выключен, но не используются, когда система функционирует. Другая - "системные часы" (иногда называемые "часы ядра" или "программные часы") является программным счетчиком, основанном на системном прерывании. Системные часы не идут, когда система выключена, поэтому они устанавливаются от ЧРВ (или какого-либо другого источника) во время загрузки. Ссылки на часы в документации ntpd относятся к системным часам, а не ЧРВ.
Обе системы будут идти с разной скоростью, отрываться друг от друга и от реального времени. Самый простой способ корректировать их - это измерить величину их отклонения и внести его в программу, контролирующую их. ЧРВ используется только, когда система выключена, они корректируются во время загрузки, при помощи clock(8) или hwclock(8). Системные часы корректируются при помощи ранее заданной величины, которую система учитывает при каждой команде прерывания, пришедшей от часов, используя программу adjtimex(8).
Альтернативой adjtimex(8) может служить chron, которая после запуска clock(8) или hwclock(8)
периодически синхронизирует системное время с (корректированными) ЧРВ. Эта схема работы рекомендуется в документации к clock(8), ее можно использовать, если вы запускаете ее часто и не делаете больших "прыжков" в системных часах, но but adjtimex(8) - это более красивое решение. Некоторые программы могут привести к ошибке, если будет совершен "прыжок" назад.
Следующий шаг - это использование программ типа ntpd, которые регулярно сверяют часы в сети или с радио, и постоянно корректируют системное время. Если у вас есть постоянное подключение к сети во время загрузки, вы можете не использовать ЧРВ, а вместо этого, использовать программу ntpdate (которая входит в состав ntpd) для установки системных часов при помощи часового сервера в Интернете или локальной сети. Но, если у вас иногда не будет сетевого соединения, или вам понадобится точное время во время загрузки до того, как соединение будет активировано, то вам придется использовать ЧРВ.
Но, в этом случае, вам , наверное, хотелось бы синхронизировать ЧРВ с откорректированными системными часами. Но это будет иметь практическое значение, если система выключена лишь несколько минут.
Но если система все время находится в рабочем состоянии, и перезагружается сразу после того, как выключится, тогда вы можете корректировать ЧРВ, основываясь на показаниях системных часов перед самой перезагрузкой. ЧРВ во время перезагрузки не отклонятся на значительную величину, и поэтому у вас не возникнет необходимости выяснять эту погрешность.
Конечно система может перезагрузиться во внештатном режиме, поэтому некоторые ядра синхронизируют ЧРВ с системными часами каждые 11 минут, в случае, если системные часы корректируются другой программой. Погрешность на ЧРВ не будет большой за 11 минут, но если система была отключена на большее время, то возникает проблема - программам, которые корректируют ЧРВ, понадобится узнать точное время последнего выключения системы, а ядро не сохраняет такую информацию.
Некоторые "закоренелые" пользователи Unix могут пожать плечами, если услышат, что Linux установлен на машину, которая не работает круглосуточно, но некоторые из нас работают на двойных платформах или используют Linux на портативных компьютерах, которые выключают после работы. Другие просто не любят оставлять машину включенной на долгое время, если на ней не работают. Таким образом, достоинство проверки "каждые 11 минут" превращается в недостаток.
Это "достоинство/недостаток" ведет себя по-разному в разных версиях ядра (возможно, и в различных версиях xntpd и ntpd), поэтому, если вы используете ntpd
совместно с hwclock, то вам, очевидно, потребуется проверить свою систему для того, чтобы узнать в точности, что происходит. Если у вас нет возможности предотвратить коррекцию ЧРВ ядром, то вам лучше работать с нулевой величиной коррекции.
Исходный текст части ядра, который управляет этим процессом, находится в файле /usr/src/linux-номер_версии/arch/i386/kernel/time.c (где номер_версии - это версия вашего ядра). Если переменная time_status
установлена на TIME_OK , то ядро будет копировать системное время в ЧРВ каждые 11 минут, иначе ядро не корректирует ЧРВ. Эту процедуру можно также выполнить при помощи adjtimex(2) (это делается, например, в ntpd и timed). Обращение к settimeofday(2) установит time_status в TIME_UNSYNC; в результате этого, ядро не будет корректировать ЧРВ. Я не нашел документации по этому вопросу.
Если вам требуется точность в доли секунды, вам потребуется лишь hwclock(8)
и adjtimex(8). В принципе, можно легко установить часы по сети, но я использую старую программу clock(8) и она меня еще ни разу не подводила. С другой стороны, если у вас есть несколько машин в локальной сети, то было бы сподручнее синхронизировать их друг с другом.
Подробная инструкция к clock(8)
Эта глава сделана на основе предыдущей версии мини-HOWTO и предназначена для тех, кто использует clock(8). Все, что вам надо знать, находится в инструкции.
Замечание
Вы должны зайти в систему в качестве пользователя root
для того, чтобы запустить "clock", или другую программу, затрагивающую системное время или ЧРВ.
Зайдите как пользователь root. Наберите
Как установить время
Зайдите как пользователь root. Наберите (303)499-7111 (голос), прослушайте сигналы. Затем напишите:
date -s hh:mm:ss |
но не нажимайте Enter, пока не услышите сигнала. (вы можете воспользоваться "ntpdate", вместо "date", и не звонить в этом случае) Эта команда устанавливает системное время. Затем напишите:
clock -w |
Эта команда устанавливает ЧРВ по системному времени. Затем наберите:
date +%j |
(или "date +%s", если вы используете "ntpdate" вместо "date" ) и запишите число, которое вам понадобится в следующий раз.
Как переустановить время и изменить величину коррекции
Найдите дату, когда вы последний раз устанавливали часы. Зайдите как пользователь root и напишите:
clock -a |
Это синхронизирует системное время по ЧРВ. Позвоните по телефону (303)499-7111 (голос), наберите:
date |
и нажмите ввод, когда услышите сигнал. Пока вы ждете, запишите точное время. Затем наберите
date hh:mm:00 |
напишите время на одну минуту вперед и нажмите ввод, когда опять услышите сигнал. Для графы hh
поставьте местное время. Итак, вы установили системное время. Теперь наберите:
clock -w |
эта команда поставит правильное время в ЧРВ. Напишите:
date +%j |
(или "date +%s" в случае прежде описанном)
Теперь у вас есть все для того, чтобы определить величину коррекции.
Как вычислить величину коррекции
Когда вы запускаете "date", определите, забежали ли ваши часы вперед, или они отстают? Если забежали, то придется вычесть несколько секунд, то есть написать их со знаком минус. Если они отставали, то вам придется добавить секунды, то есть записать их с положительным знаком.
Теперь вычтите одну дату из другой. Если использована команда "date +%j", то числа - это дни в году (1-365, или 1-366 в високосном). Если вы использовали команду "date +%s" , то это число в секундах, и вы должны разделить его на 86400, чтобы получить дни.
Если у вас уже есть величина коррекции в /etc/adjtime, то откорректируйте ее в зависимости от полученного результата. Умножьте старую величину на количество дней и прибавьте новую величину.
Затем разделите количество секунд на дни, и получите новую величину коррекции, которую надо записать вместо старой в /etc/adjtime. Запишите количество дней для следующего раза.
/etc/adjtime выглядит примерно так:
-9.600000 845082716 -0.250655 |
(заметьте, 9.6 секунд в день это почти 5 минут в месяц!)
Проверка настроек
Проверьте ваши загрузочные файлы на наличие команд типа "clock -a" или "clock -ua". В зависимости от дистрибутива, они могут находиться в /etc/rc.local, или /etc/rc.d/rc.sysinit или где-нибудь рядом.
Если в строке написано "clock -s" или "clock -us", смените "s" на "a", и посмотрите, есть ли у вас файл /etc/adjtime, который содержит строку типа:
The Clock Mini-HOWTO
Ron Bean
rbean@execpc.com
Перевод: Михаил Корепанов, ASPLinux
Установка часов компьютера и поддержка их работы.
WWV и "Most Accurate Clock"
Возможно, вы уже слышали о Heathkit's "Most Accurate Clock", которые получают и расшифровывают сигнал с WWV и имеют дополнительный последовательный порт для подключения к компьютеру. Heathkit давно перестал их продавать, но их еще можно было приобрести до 1995 года. Если желаете окунуться в атмосферу Heathkit, загляните на http://www.heathkit-museum.com. Компания Heathkit до сих пор существует и продает образовательную литературу. Взгляните на http://www.heathkit.com.
По информации Dave Mills, патент Heathkit на "Most Accurate Clock" скоро закончится, и, возможно, кто-то захочет сделать нечто подобное на отдельной микросхеме.
На сайте NTP находится DSP-программа (и файл PDF, ее описывающий) http://www.eecis.udel.edu/mills/resource.htm
, которая расшифровывает сигналы точного времени с WWV, используя коротковолновой радиопередатчик и TAPR/AMSAT DSP-93. Это очень редкий DSP-прибор. Он основан на микросхеме Texas Instruments TMS320C25 DSP. Веб-сайт TAPR находится по адресу http://www.tapr.org
и содержит много информации по системам такого рода.
Ntpd
также и драйвер для кодов точного времени IRIG-B и IRIG-E , использующий /dev/audio на Sun SPARCstation, с пометкой, что эта программа вполне подходит для других систем. WWV использует код IRIG-H.
WWV используется NIST, вебсайт которых находится по адресу http://www.boulder.nist.gov/timefreq/index.html. Этот сайт содержит текст "Special Publication 432", который описывает их службу точного времени, расположенную по адресу http://www.boulder.nist.gov/timefreq/pubs/sp432/sp432.htm. WWV вещает на 2.5, 5, 10, 15, и 20 Mhz.
Xntpd и ntpd: сетевой протокол времени (Network Time Protocol)
Xntpd
(NTPv3) заменено на ntpd (NTPv4); более ранние версии не поддерживаются.
Ntpd
является стандартной программой, при помощи которой синхронизируют время в сети. Она поставляется со списком серверов проверки времени. Ее сложнее установить, чем другие программы, описанные здесь, но если вам это интересно, то я бы советовал взглянуть на нее. Домашняя страница ntpd
расположена по адресу http://www.eecis.udel.edu/~ntp/. Там есть ссылки на все виды интересующего вас программного обеспечения, связанного с точным временем (включая программы для других ОС). ntpd входит в состав некоторых дистрибутивов.
Сравнительно новая особенность ntpd - это "моментальный режим", спроектированный для машин с ограниченным dial-up доступом к сети .
Ntpd включает в себя драйвера к нескольким видом радио-часов. Большинство радио-часов предназначены для коммерческого использования и стоят тысячи долларов, но есть и несколько дешевых видов (о них мы поговорим позже). NIST поддерживает PDF-файл, в котором находится список производителей радио-часов. Он находится по адресу http://www.boulder.nist.gov/timefreq/links.htm
(в самом конце страницы). Так же на сайтах http://www.eecis.udel.edu/ntp/hardware.htm и http://www.eecis.udel.edu/~mills/ntp/refclock.htm
можно найти ссылки на этих производителей. Любой из этих списков может устареть :-). Список драйверов ntpd находится на http://www.eecis.udel.edu/ntp/ntp_spool/html/refclock.htm..
В состав Ntpd входят несколько драйверов некоторых служб точного времени для работы через dial-up. Это все - очень дальние (скорее всего, международные) звонки, поэтому сначала подсчитайте во сколько вам это обойдется :-).