Перейти к содержанию

16.2 Поддержание системного времени (Maintaining System Time)

Вспомните: при первоначальной настройке Linux-системы вас приглашали задать системное время и часовой пояс. Возможно, вы не придали этим параметрам особого значения — я знаю многих системных администраторов, которые так и не уделили им должного внимания. Часы на их системах постоянно спешат или отстают, и это крайне меня раздражает!

Между тем при работе с Linux точность системного времени имеет вполне практическое значение — особенно если система предоставляет сетевые службы. Необходимо обеспечить точность временны́х меток файлов. Если система участвует в какой-либо службе каталогов или является сервером баз данных, то поддержание правильного системного времени абсолютно критично. Например, каждое изменение, передаваемое в сервер базы данных от клиентских систем, должно иметь точную временну́ю метку. Представьте, какие проблемы могут возникнуть, если изменения в базе данных применяются не в той последовательности из-за недостоверных временны́х меток. Целостность данных окажется под угрозой!

В главе 5 мы рассмотрели настройку часового пояса при изучении параметров локали. В этой главе мы разберём следующие темы:

  • Настройка аппаратных часов с помощью hwclock
  • Синхронизация времени с помощью netdate
  • Синхронизация времени с помощью NTP

Начнём с управления временем посредством hwclock.

Настройка аппаратных часов с помощью hwclock

Вспомните из главы 5, что в Linux-системе используются два источника времени:

  • Аппаратные часы (Hardware clock) Эти часы встроены в CMOS-микросхему материнской платы вашей Linux-системы. Они работают всё время, даже когда система выключена.
  • Системное время (System time) Этот источник времени функционирует программно — внутри самого ядра Linux. Он управляется прерыванием таймера ISA. Системное время измеряется в секундах, прошедших с 00:00:00 1 января 1970 года UTC.

Главное, что необходимо помнить: аппаратные часы и системное время могут не совпадать. При управлении Linux-системой нас больше интересует системное время, нежели показания аппаратных часов. Роль аппаратных часов довольно проста: хранить время, пока система выключена. При запуске операционной системы Linux системное время синхронизируется с временем аппаратных часов. После загрузки Linux использует только системное время; аппаратные часы не принимаются во внимание.

Для управления аппаратными часами системы используется команда hwclock, вводимая в командной строке. Она умеет выполнять следующие действия:

  • Отображать текущее время.
  • Устанавливать время аппаратных часов.
  • Синхронизировать аппаратные часы с системным временем.
  • Синхронизировать системное время с аппаратными часами.

Примечание

В некоторых дистрибутивах Linux текущее время аппаратных часов можно просмотреть, изучив содержимое файла /proc/driver/rtc.

С командой hwclock на большинстве дистрибутивов Linux можно использовать параметры, перечисленные в таблице 16-3.

Параметр hwclock Описание
-r или --show Считывает текущее время аппаратных часов и отображает его на экране.
--set --date=строка_даты Устанавливает аппаратные часы на время, заданное параметром --date. Например, hwclock --set --date="9/16/11 08:00:00" установит дату 16 сентября 2001 года и время 8:00. Аргумент задаётся в местном времени, даже если аппаратные часы хранят время в UTC.
-s или --hctosys Устанавливает системное время по текущему времени аппаратных часов.
-w или --systohc Устанавливает аппаратные часы по текущему системному времени.
--utc или --localtime Указывает, что аппаратные часы настроены на использование UTC или местного времени.

Таблица 16-3. Параметры команды hwclock

Как видите, функциональность hwclock ограничена локальной компьютерной системой. В сети может потребоваться обеспечить синхронизацию системного времени на всех Linux-системах. Для этого можно воспользоваться утилитой netdate. Рассмотрим, как это делается.

Синхронизация времени с помощью netdate

Команда netdate позволяет синхронизировать время на локальной системе со временем на сервере времени через сеть. Синтаксис: netdate сервер_времени, где сервер_времени — это IP-адрес или DNS-имя другой Linux-системы в сети, на которой запущена служба времени. По умолчанию эта служба ожидает запросы на UDP-порту 37. Сервер времени может быть внутренним узлом вашей локальной сети или общедоступным поставщиком времени в Интернете.

Примечание

С командой netdate можно указать несколько серверов времени одновременно. В таком случае время, полученное от разных серверов, будет сравниваться. Наиболее часто встречающееся значение будет считаться наиболее точным и применяться в качестве системного времени.

После синхронизации системного времени с помощью netdate рекомендуется синхронизировать системное время с аппаратными часами командой hwclock --systohc, которую мы рассматривали ранее.

Важно понимать, что netdate выполняет синхронизацию лишь один раз. Если системное время уходит (а оно уходит), возможно, потребуется периодически запускать netdate (и, вероятно, hwclock --systohc) по расписанию, чтобы время не сбивалось. Это можно автоматизировать с помощью задания cron. Однако это не лучший способ. Более надёжным решением для регулярной синхронизации времени является протокол NTP (Network Time Protocol). Рассмотрим, как работает NTP.

Синхронизация времени с помощью NTP

Главная проблема с использованием netdate в задании cron для синхронизации времени заключается в том, что netdate корректирует время резко. Он не изменяет время постепенно, стремясь к синхронизации: время просто устанавливается равным тому, что показывает сервер. Кроме того, netdate может переводить время как вперёд, так и назад в зависимости от того, как ушли часы локальной системы. Это нарушает временны́е метки ваших файлов и может приводить к сбоям отдельных служб Linux.

Более предпочтительным вариантом для сетевой синхронизации времени является использование NTP (Network Time Protocol) — протокола сетевого времени. NTP управляет временем значительно изящнее, чем netdate. Если между поставщиком времени и потребителем (вашей локальной системой) обнаруживается рассогласование, NTP постепенно корректирует время небольшими приращениями, пока синхронизация не будет достигнута.

NTP также широко поддерживается большинством операционных систем. netdate работает только со службой времени на Linux/UNIX-сервере. NTP, напротив, позволяет синхронизировать время в гетерогенных сетевых средах. Он поддерживается следующими операционными системами:

  • Linux
  • Windows
  • OSX
  • UNIX

NTP несколько сложнее, чем netdate. Поэтому для его развёртывания необходимо разобраться в следующем:

  • Как работает NTP
  • Настройка NTP

Как работает NTP

Для синхронизации времени с другим NTP-сервером в Linux используется демон ntpd. Система, на которой запущен ntpd, может одновременно выступать и потребителем, и поставщиком времени. Протокол NTP работает на IP-порту 123. Потребитель времени отправляет запрос синхронизации поставщику на порт 123. Поставщик отвечает своим временем, и системное время потребителя корректируется в соответствии с алгоритмом NTP.

Совет

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

Ниже приведены ключевые концепции NTP, с которыми необходимо быть знакомым.

  • Страта (Stratum) NTP использует понятие «страты» для определения иерархии NTP-серверов:

    • Страта 1 Серверы страты 1 получают время от эталонного источника — например, атомных часов ВМФ США (подробнее на tycho.usno.navy.mil).
    • Страта 2 Серверы, получающие время от серверов страты 1.
    • Страта 3 Серверы, получающие время от серверов страты 2.
    • Страта n Серверы NTP могут образовывать иерархию глубиной до 256 страт.

    Серверы страты 1 доступны в Интернете, однако доступ к ним, как правило, закрыт. Многие серверы страты 2 являются общедоступными. Чтобы не перегружать эти серверы, стоит настроить минимальное количество систем внутренней сети для синхронизации с ним. На практике многие организации разворачивают единственный сервер страты 3, получающий время от публичного сервера страты 2 в Интернете, а все внутренние узлы настраивают на синхронизацию с ним. В крупных сетях может потребоваться несколько серверов страты 4 для снятия нагрузки. Это показано на рис. 16-11.

  • Ступенчатая и плавная подстройка (Stepping and slewing) Изначально NTP синхронизирует время между потребителем и поставщиком примерно раз в минуту. По мере достижения синхронизации интервал увеличивается до одного раза в 17 минут. Крупные отклонения устраняются быстро, небольшие корректируются реже.

    Если расхождение между поставщиком и потребителем невелико (менее 128 миллисекунд), NTP корректирует время постепенно — это называется плавной подстройкой (slewing). При значительном расхождении время на потребителе корректируется быстрее — это называется ступенчатой подстройкой (stepping).

  • «Безумное» время (Insane time) Если расхождение между поставщиком и потребителем превышает 17 минут, демон NTP (ntpd) считает время «безумным» и отказывается его корректировать.

Рис. 16-11. Иерархия страт NTP.

Рис. 16-11. Страты NTP.

  • Дрейф (Drift) NTP измеряет и компенсирует случайные ошибки частоты тактового генератора (называемые дрейфом). Текущее значение частоты записывается в файл ntp.drift в каталоге /var/lib/ntp/drift/. При перезапуске демона NTP частота тактового генератора инициализируется из этого файла, что избавляет ntpd от необходимости заново определять ошибку частоты. Пример содержимого файла ntp.drift:

    openSUSE:/var/lib/ntp/drift # cat ./ntp.drift
    0.000
    

  • Джиттер (Jitter) Джиттер — это расчётное расхождение времени между потребителем и поставщиком с момента последнего запроса.

Настройка NTP

Чтобы использовать NTP для настройки системного времени от NTP-сервера, сначала необходимо установить демон ntpd в Linux-системе. Это можно проверить командой rpm –q ntp:

openSUSE:~ # rpm -q ntp
ntp-4.2.6p5-15.5.1.i586

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

server 127.127.1.0 # local clock (LCL)
fudge 127.127.1.0 stratum 10 # LCL is unsynchronized

Эти директивы указывают демону ntpd получать время от локальных часов, если ни один из настроенных NTP-серверов недоступен.

Далее добавьте в файл записи с адресами сетевых поставщиков времени. Синтаксис:

server IP_адрес_или_DNS_имя_сервера_времени

Здесь можно указать IP-адрес или DNS-имя любого NTP-поставщика:

  • NTP-сервер в вашей сети
  • Публичный NTP-сервер в Интернете Список публично доступных NTP-серверов находится по адресу http://support.ntp.org/bin/view/Servers/WebHome. Также можно воспользоваться пулом NTP-серверов: домен pool.ntp.org применяет DNS round-robin для случайного выбора из числа добровольно участвующих серверов, чтобы ни один из них не оказывался перегруженным. Для использования пула добавьте следующую директиву в дополнение к записи для локальных часов:
    server pool.ntp.org
    

После внесения изменений сохраните файл и закройте его. Перед запуском демона ntpd необходима одноразовая предварительная синхронизация с NTP-сервером. Проблема здесь в «безумном» времени: если системное время уже отстаёт от сервера более чем на 17 минут, необходимо сначала сблизить эти значения.

Совет к экзамену

На практике «безумное» время — это проблема номер один при настройке NTP. Администраторы правильно устанавливают и настраивают NTP, но потом не могут понять, почему синхронизация не происходит после запуска демона.

Устранить проблему «безумного» времени позволяет команда ntpdate адрес_сервера_времени, которая выполнит начальную синхронизацию перед запуском демона. При большом расхождении команду может потребоваться запустить несколько раз.

Совет

Перед запуском ntpdate демон ntpd необходимо остановить!

В более новых версиях NTP на современных дистрибутивах предусмотрен параметр ntptimeset для самого демона ntpd. Вместо start, stop или restart в сценарии init вводится /etc/init.d/ntp ntptimeset или rcntp ntptimeset. При этом выполняется быстрая синхронизация с поставщиком времени:

ws1:/ # rcntp ntptimeset
Time synchronized with pool.ntp.org

После этого запустите демон ntpd с помощью соответствующего сценария init. Если система использует rc-сценарии, достаточно ввести rcntp start:

ws1:/ # rcntp start
Time synchronized with pool.ntp.org
Starting network time protocol daemon (NTPD)                      done

Настройте автоматический запуск ntpd при каждой загрузке системы командой insserv ntp. После запуска демона просмотрите журнал ntp командой tail, чтобы убедиться в отсутствии ошибок.

Если ваш дистрибутив использует systemd, для управления ntpd применяется команда systemctl. Например, для запуска демона введите systemctl start ntp. Убедиться в успешном запуске можно командой systemctl status ntp. Состояние демона отображается, как показано на рис. 16-12.

Рис. 16-12. Просмотр состояния демона NTP.

Рис. 16-12. Просмотр состояния демона NTP.

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

  • ntpq –p Выводит состояние демона ntpd. Пример:

    openSUSE:~ # ntpq –p
         remote           refid      st t when poll reach   delay   offset jitter
    ==============================================================================
    *LOCAL(0)        .LOCL.          10 l   14   64    3    0.000    0.000   0.001
     helium.constant 18.26.4.105      2 u   12   64    1   96.614 -31.777    0.001
    
    Столбцы вывода означают следующее:

    • remote — имя хоста или IP-адрес поставщика времени.
    • refid — тип эталонного источника.
    • st — страта поставщика времени.
    • when — число секунд с момента последнего опроса.
    • poll — интервал между опросами в секундах.
    • reach — признак того, был ли сервер доступен в последнем опросе. При каждом успешном опросе поле увеличивается на 1.
    • delay — время (в миллисекундах), за которое поставщик времени ответил на запрос.
    • offset — разница (в миллисекундах) между локальными часами и поставщиком времени.
    • jitter — размер временны́х расхождений (в миллисекундах).
  • ntptrace Утилита ntptrace отслеживает путь получения времени от поставщика. Выводит имя поставщика, его страту и смещение относительно системных часов локальной системы.

Упражнение 16-2. Настройка NTP

В этом упражнении вы настроите NTP для получения времени от us.pool.ntp.org. Для работы упражнения ваша Linux-система должна иметь доступ к Интернету. Используйте виртуальную машину из комплекта книги; запустите снимок 16-2 для корректно настроенной среды.

Выполните следующее:

  1. Откройте терминальный сеанс и переключитесь в учётную запись root командой su –.
  2. В командной строке убедитесь, что пакет ntp установлен, введя rpm –q ntp.
  3. Введите vi /etc/ntp.conf.
  4. Прокрутите файл до строк:
    server         127.127.1.0 #local clock (LCL)
    fudge          127.127.1.0 stratum 10 #LCL is unsynchronized
    
  5. Нажмите Insert и удалите символ комментария (#) в начале каждой из этих двух строк.
  6. Добавьте новую строку после строки fudge.
  7. Введите следующую директиву в новой строке:
    server us.pool.ntp.org
    
    Эта директива настраивает службу NTP для синхронизации времени с публичным NTP-сервером в Интернете.
  8. Нажмите Esc, затем введите :exit.
  9. Выполните одноразовую синхронизацию: ntpdate us.pool.ntp.org.
  10. Запустите службу NTP: systemctl start ntp.
  11. Настройте автозапуск демона NTP при загрузке: systemctl enable ntp.
  12. Проверьте состояние демона NTP: systemctl status ntp.

На этом настройка NTP завершена. В следующем разделе рассмотрим управление электронной почтой в Linux.