Системное время NTP отличается от аппаратного времени

Системное время NTP отличается от аппаратного времени

на сервере centos 6.5 я только что выполнил ntp с:

service ntpd start

Он исправил системное время, но аппаратное время все еще неправильное. Это нормально? Как это исправить?

Отчеты ntpstat:

unsynchronized
polling server every 64s

решение1

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

Кроме того, система Linux не всегда и не сразу передает время NTP на RTC («Аппаратные часы»), но она должна делать это, по крайней мере, при завершении работы.

решение2

Возможно, что NTP на самом деле корректирует время, но медленно. Обычно он делает это, чтобы избежать беспокойства программ о том, что они прошли N секунд за долю секунды. Многие программы используют время для внутреннего упорядочивания своей работы.

Таким образом, часы изменяются, чтобы немного увеличивать или уменьшать секунды, скажем, на 0,1 секунды каждую секунду (или даже меньше). Синхронизация обоих часов может занять некоторое время.

Проверьте разницу во времени и посмотрите, уменьшается ли она со временем.

Если разница сохраняется после «упорядоченного» выключения питания (т. е. выключения, а не аппаратного выключения), вам следует проверить, правильно ли запрограммирована система. В моей системе это делается в командном файле, запущенном при выключении:

/etc/rc.d/rc.0 содержит:

# Save the system time to the hardware clock using hwclock --systohc.
if [ -x /sbin/hwclock ]; then
  # Check for a broken motherboard RTC clock (where ioports for rtc are
  # unknown) to prevent hwclock causing a hang:
  if ! grep -q -w rtc /proc/ioports ; then
    CLOCK_OPT="--directisa"
  fi
  if grep -q "^UTC" /etc/hardwareclock 2> /dev/null ; then
    echo "Saving system time to the hardware clock (UTC)."
    /sbin/hwclock $CLOCK_OPT --utc --systohc
  else
    echo "Saving system time to the hardware clock (localtime)."
    /sbin/hwclock  $CLOCK_OPT --localtime --systohc
  fi
fi

Вы можете попробовать выполнить команду вручную: sudo hwclock --systohc. Если это не сработает, у вас могут быть проблемы с оборудованием.

Важность синхронизации обоих часов? Зависит от того, какое программное обеспечение вы используете. Аппаратные часы используются для установки системных часов при запуске. Пока не включится NTP, ваша машина использует это время. Любой файл, используемый в течение этого промежутка времени, помечается неправильным временем. Это может быть важно для некоторых...

решение3

Поскольку существующие ответы упускают из виду самый важный факт, я говорю вам: NTP корректируетсистемные часы(программные часы). Однако настройка системных часов в Linuxненастроить аппаратные часы(На самом деле я написал патч около 20 лет назад, исправляющий эту проблему, но его так и не приняли).

Текущие системы обычно обновляют аппаратные часы с системного времени либо во времячистыйвыключение или периодическая работа.

Проблема с обновлением аппаратных часов заключается в том, что ядро ​​не знает, установлены ли аппаратные часы на локальное время или на UTC, поэтому ему приходится применять неизвестное смещение при обновлении аппаратных часов. Другая проблема заключается в том, что в Linux был какой-то сломанный код (я не проверял последние 20 лет) для обновления минут и секунд аппаратных часов с системных часов, если последние отмечены как «синхронизированные».

Древний кодекс когда-то был таким:

     * If we have an externally synchronized Linux clock, then update
     * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
     * called as close as possible to 500 ms before the new second starts.
     */
    if ((time_status & STA_UNSYNC) == 0 &&
        xtime.tv_sec > last_rtc_update + 660 &&
        xtime.tv_usec >= 500000 - ((unsigned) tick) / 2 &&
        xtime.tv_usec <= 500000 + ((unsigned) tick) / 2) {
        if (set_rtc_mmss(xtime.tv_sec) == 0)
            last_rtc_update = xtime.tv_sec;
        else
            last_rtc_update = xtime.tv_sec - 600; /* do it again in 60 s */

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