NTP 시스템 시간이 하드웨어 시간과 다름

NTP 시스템 시간이 하드웨어 시간과 다름

Centos 6.5 서버에서 방금 다음을 사용하여 ntp를 실행했습니다.

service ntpd start

시스템 시간은 고정되어 있지만 하드웨어 시간은 여전히 ​​잘못되었습니다. 이게 정상인가요? 어떻게 해결할 수 있나요?

ntpstat 보고서:

unsynchronized
polling server every 64s

답변1

우선: Linux 시스템의 하드웨어 시간은 UTC로 저장되므로 시간대와 관련된 오프셋이 예상됩니다. 그리고 그렇습니다. 이중 부팅 시 문제가 발생합니다.

게다가 Linux 시스템은 NTP 시간을 RTC("하드웨어 시계")에 항상 즉시 전파하지는 않지만 적어도 종료 시에는 전파해야 합니다.

답변2

NTP가 실제로 시간을 수정하고 있을 가능성이 있지만 속도가 느립니다. 이는 일반적으로 프로그램이 1초도 안 되는 시간에 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. 그래도 작동하지 않으면 하드웨어 문제가 있을 수 있습니다.

두 시계를 동기화하는 것이 중요합니까? 실행 중인 소프트웨어에 따라 다릅니다. 하드웨어 시계는 시작 시 sysclock을 설정하는 데 사용됩니다. 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 */

관련 정보