ADJTIMEX Я буду считать, что вы уже прочитали страничку man по adjtimex :-) ВВЕДЕНИЕ Возможно, вы уже знаете, что в вашем компьютере имеются двое часов - "часы реального времени" (RTC - Real Time Clock), которые идут все время, и системные часы, которые идут только при включенном компьютере. Точность выше у системных часов (примерно 1 uсек), но у RTC, возможно, лучше стабильность на длительном промежутке (long-term stability). adjtimex предназначен для приблизительной коррекции ухода системных часов. RTC являются удобными опорными часами adjtimex --compare показывает время, разницу между двумя часами, первое различие (как сильно спешат или отстают системные часы по сравнению с последней сверкой с RTC), и два временных параметра ядра: tick и сдвиг частоты. После первых двух сравнений он также выводит рекомендуемые значения тиков и сдвига частоты, которые подрегулируют системные часы с приблизительным значением RTC. Конечно, RTC могут имеют собственную систематическую ошибку. clock(8) или hwclock(8) используют файл /etc/adjtime для записи коэффициента ухода (drift rate) и времени после последней установки RTC. adjtimex также сверяется с этим файлом и использует коррекцию ко времени RTC. Кроме того, adjtimex может записывать время обоих часов и дополнительное опорное (reference) время, в лог. Затем это сравнивается с записанным временем и рассчитываются величины ухода (drift rates). УСТАНОВКА Для конфигурирования наберите "./configure", для компиляции - "make", затем "make install" для копирования бинарника в /usr/local/bin, а страницы man в /usr/local/man/man8. Если вы хотите установить программу в /usr вместо /usr/local, начните с "./configure --prefix=/usr". КРОМЕ ТОГО Для выполнения большинства нижеследующих действий вы должны войти как root. Стандартное ядро не будет трогать RTC, пока не будет устанавливаться один из временных параметров (например, с помощью adjtimex). Затем, предполагая, что ntpd регулирует системное время, запускает "коррекцию" RTC примерно каждые одиннадцать минут. adjtimex предотвращает это установкой времени после изменения любого параметра. В действительности время не изменится. ИСПОЛЬЗОВАНИЕ Создайте /etc/adjtime, который используется clock(8) и hwclock(8) для коррекции систематической ошибки в RTC. Установите его, как описано в странице man, для каждой программы. clock включается (вместе с множеством других полезных утилит) в коллекцию Рика Фэйта (Rik Faith): sunsite.unc.edu:pub/Linux/system/Misc/util-linux-1.10.tar.gz Если ваш RTC уже достаточно точен для вас, просто создайте файл /etc/adjtime, содержащий только одну первую строчку: '0.0 0 0.0'. Сначала я объясню ручную процедуру. Скомпилируйте и запустите adjtimex с ключом --compare. Ожидаемые результаты примерно такие: # adjtimex --compare 794625929 -0.597638 -0.597638 ... 794625939 -0.602050 -0.004412 ... ^^^^^^^^^ Это число сообщает, что системные часы отстают более чем на 4 миллисекунды за 10 секунд по сравнению с RTC, или 4 части на 10000. Следовательно, мы увеличиваем параметр tick до 10004 и повторяем сравнение: # adjtimex --tick 10004 # adjtimex --compare 794626037 -0.644860 -0.644860 ... 794626047 -0.645259 -0.000399 ... Теперь системные часы отстают примерно на 39.9 частей на миллион. Для коррекции этого мы можем изменить сдвиг частоты (frequency offset). Вспомните, что сдвиг частоты - это в частях на миллион, с точкой деления в центре (по 16 бит с каждой стороны). Следовательно, мы устанавливаем сдвиг в 39.9*65536 = 2614886: # adjtimex --frequency 2614886 # adjtimex --compare 794626313 -0.652147 -0.652147 ... 794626323 -0.652247 -0.000100 ... Видно, что есть еще разница около 10 ppm, поэтому мы увеличим сдвиг на 10*65536, до 3270246: # adjtimex --frequency 3270246 # adjtimex --compare 794627233 -0.795221 -0.795221 ... 794627243 -0.795231 -0.000009 ... Таким же образом высчитываются значения в колонке "suggested" ("Рекомедновано"). Применение ключа --adjust автоматизирует процесс - периодически устанавливая "рекомендуемые" значения. Кстати, использование опций --offset или --singleshot кажется имеют длительное действие на часы. Я рекомендую вам определить значения tick и частоты до применения других опций. У вас уже может быть запись, подобная этой, в /etc/rc.d/rc.S, /etc/init.d/boot или одном из других стартовых файлов: # Adjust CMOS clock based on /etc/adjtime, then set system clock. # Add -u switch if your system keeps GMT. if [ -x /sbin/clock ]; then /sbin/clock -a fi Просто добавьте запись типа этой: # Regulate the sytem clock if [ -x /sbin/adjtimex ]; then /sbin/adjtimex --tick 10004 --frequency 3270246 fi ПРОДОЛЖИТЕЛЬНЫЕ СРАВНЕНИЯ adjtimex можно использовать для записи значений времени CMOS и системы, и дополнительного опорного (reference) времени, чтобы можно было определить коэффициент ухода за длительные периоды. Для ручного ввода опорного времени используйте # adjtimex --log --watch adjtimex попросит вас нажать клавишу, когда вы знаете время, затем спросит время и приблизительную точность. Затем спросит был ли сбой каких либо часов с момента последней записи в логе. Время вы можете взять с точных часов, радиомаяка времени типа WWV или CHU и т.д. Если у вас установлен ntpdate (часть пакета xntp) и компьютер подключен к сети, используйте # adjtimex --log --host www.xxx.yyy.zzz и adjtimex будет использовать ntpdate для запроса времени с указанного хоста. (Уточните у своего провайдера, имеет ли он сервер времени NTP, или какой он может предложить.) После того, как вы сделаете несколько записей в log, вы можете заставить adjtimex просмотреть лог с помощью # adjtimex --review Он возьмет каждую пару записей лога в цикле и вычислит для них коэффициент ошибки в частях на миллион (ppm) с заданной точностью. Также будут найдены усредненные ошибки и предложены значения параметров для корректировки ухода. Проверьте согласованность результата. Одна неправильная запись опорного времени может погубить все вычисления. ДАЛЬНЕЙШАЯ ИНФОРМАЦИЯ Авторитетную документацию по программе времени ядра смотрите сдесь, все написано David L. Mills : [MIL92a] Mills, D.L. Network Time Protocol (Version 3) specification, implementation and analysis, RFC 1305, University of Delaware, March 1992, 113 pp. [MIL92c] Mills, D.L. Simple Network Time Protocol (SNTP), RFC 1361, University of Delaware, August 1992, 10 pp. [MIL94a] Mills, D.L. A kernel model for precision timekeeping. ARPA Network Working Group Report RFC-1589, University of Delaware, March 1994. 31 pp. README.kern, который можно найти на louie.udel.edu:/pub/ntp/kernel.tar.Z. БЛАГОДАРНОСТИ Дэвиду Миллсу (David Mills) за код сохранения времени ядра, и Стивену Дику (Steven Dick) за первоначальное написание adjtimex. (Я сильно изменил код. Любые проблемы - моя ответственность.) Благодарность также Микаэлю Мескесу (Michael Meskes) , чей инсталляционный скрипт в Debian вдохновил на опции "--compare" и "--adjust". Наслаждайтесь! - Jim Van Zandt