Как мне навсегда синхронизировать системные часы с аппаратными часами?

Как мне навсегда синхронизировать системные часы с аппаратными часами?

У меня запущен cronjob, который проверяет наличие обновлений на сервере, устанавливает их одно за другим, а затем проверяет, нужна ли перезагрузка. Если нужна перезагрузка, скрипт выполнит перезагрузку rebootсервера.

Аппаратные часы используются во время загрузки. Требуется минута, прежде чем будут использованы системные часы.

До переключения на системные часы журналы показывают, что сервер отстает примерно на час. Когда сервер переключается с аппаратных часов на системные, журналы перескакивают примерно на час вперед, что запускает демон cron, который замечает, что время для скрипта обновления сервера уже прошло, и выполняет его снова.

Что запускает цикл перезагрузки, поскольку скрипт должен был выполняться только один раз в неделю.

Выполнение hwclock --systohcсинхронизирует системные часы с аппаратными часами, но это не постоянно. После перезагрузки разница во времени снова исчезает.

Мой вопрос:

Как мне навсегда синхронизировать системные часы с аппаратными часами?

выход timedatectl status:

      Local time: Tue 2018-08-28 12:05:37 CEST
  Universal time: Tue 2018-08-28 10:05:37 UTC
        RTC time: Tue 2018-08-28 10:05:37
       Time zone: n/a (CEST, +0200)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: yes
      DST active: yes
 Last DST change: DST began at
                  Sun 2018-03-25 01:59:59 CET
                  Sun 2018-03-25 03:00:00 CEST
 Next DST change: DST ends (the clock jumps one hour backwards) at
                  Sun 2018-10-28 02:59:59 CEST
                  Sun 2018-10-28 02:00:00 CET

Warning: The system is configured to read the RTC time in the local time zone.
         This mode can not be fully supported. It will create various problems
         with time zone changes and daylight saving time adjustments. The RTC
         time is never updated, it relies on external facilities to maintain it.
         If at all possible, use RTC in UTC by calling
         'timedatectl set-local-rtc 0'.

  • CentOS Linux релиз 7.5.1804 (ядро)
    • Это VPS-сервер.
  • Европа/Амстердам

решение1

В соответствии с вашей timedatectl status:

  • Ваши аппаратные часы (RTC) установлены на время UTC ( RTC time),
  • Ваша система настроена на оценку аппаратных часов как местного времени ( RTC in local TZ).

В результате при загрузке системные часы устанавливаются на один час позже (ваш часовой пояс без учета летнего времени).

От man hwclock:

Системы POSIX, такие как Linux, спроектированы так, чтобы системные часы работали в шкале времени UTC.

Вы можете легко исправить это, выполнив:

timedatectl --adjust-system-clock set-local-rtc 0

Корень всех зол в том, что RTC не запоминает TZ, который он установил. Обратите внимание, что эта RTC timeстрока не имеет указания TZ. Когда вы храните время в аппаратной части, а TZ в файле ( /etc/adjtimeкак@mr.spuratic(как отмечено), легко потерять синхронизацию между двумя данными.

Для полноты картины, IMHO, единственная ситуация, в которой следует сохранять локальные аппаратные часы, — это машина с двойной загрузкойОкна.

Связанный контент