Синхронизация времени RTC не работает (CONFIG_RTC_SYSTOHC)

У меня есть опция CONFIG_RTC_SYSTOHC включенная в моем ядре:

 Device Drivers ---> [*] Real Time Clock ---> [*] Set the RTC time based on NTP synchronization 

Помощь говорит:

 CONFIG_RTC_SYSTOHC: If you say yes here, the system time (wall clock) will be stored in the RTC specified by RTC_HCTOSYS_DEVICE approximately every 11 minutes if userspace reports synchronized NTP status. 

Однако мои аппаратные часы не синхронизируются. У меня RTC_HCTOSYS_DEVICE установлен правильно:

 CONFIG_RTC_HCTOSYS_DEVICE="rtc0" 

В приведенной выше ссылке говорится, что синхронизация работает, если «если пользовательское пространство сообщает о состоянии синхронизации NTP». Что это значит? Я использую ntpdate чтобы регулярно синхронизировать свое время (каждые 4 часа) с помощью cron.

Как я могу сообщить своей системе, что я синхронизирован ntp и что я хочу, чтобы мои аппаратные часы были синхронизированы?

  • Разрешение имени домена в моих IP-таблицах
  • Разница между хронидом и ntpd
  • Как обновить NTP, не отключив демон NTP?
  • Замена sntp для аргумента -P (подсказка)
  • Сервер RedHat обновляет свое время каждую минуту
  • тайм-аут, ничего не получено на ntpdc> loopinfo?
  • Скрипт для проверки состояния ntp и синхронизации времени системы
  • dhcp3-сервер и странные серверы DNS / NTP
  • 3 Solutions collect form web for “Синхронизация времени RTC не работает (CONFIG_RTC_SYSTOHC)”

    Запуск ntpdate из cronjob будет настраивать системное время каждый раз, когда он запускается, но это не означает, что ваша система «синхронизирована NTP» (часы могут дрейфовать между периодическими синхронизациями), и ядро ​​не будет автоматически синхронизировать RTC.

    Есть ли какая-то конкретная причина, по которой вы используете ntpdate из cronjob, а не запустите ntpd ? ntpd будет хранить гораздо более точное время, имеет большую проверку ошибок (так что ошибочный сервер времени не вызовет хаоса для вас), и дисциплинирует тактовую частоту системы, чтобы компенсировать дрейф осциллятора.

    Кроме того, он будет сообщать о «синхронизированном статусе NTP» в ядро, которое затем будет периодически устанавливать hwclock.

    На странице man ntpdate :

    ntpdate можно запускать вручную по мере необходимости, чтобы установить часы хоста, или его можно запустить из сценария запуска хоста, чтобы установить часы во время загрузки. Это полезно в некоторых случаях для установки часов перед запуском NTP-демона ntpd. Также можно запустить ntpdate из cron-скрипта. Однако важно отметить, что ntpdate с надуманными cron-скриптами не заменяет демона NTP, который использует сложные алгоритмы, чтобы максимизировать точность и надежность при минимизации использования ресурсов. Наконец, поскольку ntpdate не дисциплинирует тактовую частоту хоста, как и ntpd, точность с использованием ntpdate ограничена.

    В общем, лучше использовать ntpd чтобы синхронизировать часы, если у вас нет особых причин (например, удаленная или изолированная система, где передача данных очень дорога).

    Поскольку вы уже ввели ntp обновления времени через ntpupdate почему бы не просто добавить аппаратную синхронизацию к этому cron (или сделать второй)? Я использовал тот же самый метод в некоторых действительно действительно старых RHEL 3 и 4 ящиках моей компании, чтобы синхронизировать их часы.

     0 */4 * * * ntpdate mytimeserver.com && ( hwclock --adjust; hwclock -w ) 

    Этот cron обновит аппаратные часы до времени системы, если ntpdate будет успешным. Дополнительная информация о hwclock commands .

    Добавлено примечание:

    mytimeserver.com для меня – это внутренняя версия с несколькими серверами времени для избыточности. Если у вас нет доступа к одной и той же вещи, вы должны изменить ntp сервер на разные пулы ntp, чтобы каждая система не зависела от одного и только одного сервера ntp.

    Сервер 1:

     0 */4 * * * ntpdate 0.pool.ntp.org && ( hwclock --adjust; hwclock -w ) 

    Сервер 2:

     0 */4 * * * ntpdate 1.pool.ntp.org && ( hwclock --adjust; hwclock -w ) 

    ntpdate не STA_UNSYNC флаг STA_UNSYNC когда он корректирует системное время. Таким образом, ядро ​​считает, что системное время недействительно и не обновляет RTC. Он не очищает STA_UNSYNC потому что он использует adjtime() для установки системного времени вместо adjtimex() .

    Чтобы использовать функцию CONFIG_RTC_SYSTOHC , вы должны использовать инструмент, который очищает флаг STA_UNSYNC , т. STA_UNSYNC .

    Может быть, проблема должна быть сообщена разработчикам ntpdate .

    Linux и Unix - лучшая ОС в мире.