NTP システム時刻がハードウェア時刻と異なる

NTP システム時刻がハードウェア時刻と異なる

Centos 6.5 サーバーで、次のコマンドを使用して ntp を実行しました:

service ntpd start

システム時間は修正されましたが、ハードウェア時間はまだ間違っています。これは正常ですか? どうすれば修正できますか?

ntpstat は次のように報告します:

unsynchronized
polling server every 64s

答え1

まず、Linux システムのハードウェア時間は UTC で保存されるため、タイムゾーンに関連するオフセットが予想されます。そして、確かに、デュアルブートの場合にはこれが問題を引き起こします。

さらに、Linux システムは NTP 時間を常に即座に RTC (「ハードウェア クロック」) に伝播するわけではありませんが、少なくともシャットダウン時には伝播するはずです。

答え2

NTP は実際には時間を修正している可能性がありますが、その速度は遅いです。通常、これは、ほんの一瞬で N 秒が経過したことでプログラムが混乱するのを避けるために行われます。多くのプログラムは、時間を使用して内部的に作業を整理します。

つまり、クロックは、1 秒ごとに 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 に設定されているかを知らないため、ハードウェア クロックを更新するときに不明なオフセットを適用する必要があることです。もう 1 つの問題は、システム クロックが「同期済み」とマークされている場合に、システム クロックからハードウェア クロックの分と秒を更新するための壊れたコードが 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 */

関連情報