ハードウェアクロック(RTC)についてメモ

時刻設定からの yak shaving でハードウェアクロック(リアルタイムクロック, RTC, BIOS クロック, CMOS クロック, etc) を調べたので、忘れないうちにつらつらと書いてみる。

Linux の2種類のクロック

  • ハードウェアクロックは、マザーボード上のICによって提供される時計。電源が入っていなくても時刻を刻み続ける。Linxu では hwclock コマンドで表示できる。
  • システムタイムは Linux カーネル内で動作する時計。Linux では date コマンドで表示できる。

ハードウェアクロックとシステムタイム間の同期

OS 起動時にハードウェアクロックをシステムタイムに設定する。($ hwclock --hctosys)

RHEL は6までは OS 停止時にシステムタイムをハードウェアクロックに同期していた。($ hwclock --systohc)
7 からは同期しなくなった。

In Red Hat Enterprise Linux 6, the hwclock command was run automatically on every system shutdown or reboot, but it is not in Red Hat Enterprise Linux 7.
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Configuring_the_Date_and_Time-hwclock.html

ハードウェアクロックを確認

hwclock コマンドを使う

] # hwclock --show
Sat 27 Dec 2014 09:41:55 PM JST  -0.047512 seconds

RHEL 7 以降 では timedatectl コマンドでシステムタイムやタイムゾーンなども含めた時刻情報を確認できる。

] # timedatectl
      Local time: Sat 2014-12-27 09:49:50 EST
  Universal time: Sat 2014-12-27 14:49:50 UTC
        RTC time: Sat 2014-12-27 14:49:49
        Timezone: America/New_York (EST, -0500)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: no
 Last DST change: DST ended at
                  Sun 2014-11-02 01:59:59 EDT
                  Sun 2014-11-02 01:00:00 EST
 Next DST change: DST begins (the clock jumps one hour forward) at
                  Sun 2015-03-08 01:59:59 EST
                  Sun 2015-03-08 03:00:00 EDT

ハードウェアクロックのタイムゾーン

Linux のハードウェアクロックは UTC またはローカルタイムゾーンのどちらかを選択できる。(デフォルトはUTC)。

Ubuntu

/etc/default/rcS の次の箇所を no に修正。
via https://help.ubuntu.com/community/UbuntuTime

# assume that the BIOS clock is set to UTC time (recommended)
UTC=yes

RHEL 7 以前

次の /etc/adjtime の3行目を UTC から LOCAL に修正

-0.000015 1419698646 0.000000
1419698646
UTC

RHEL 7 以降

timedatectl set-local-rtc コマンドで操作

] # cat /etc/adjtime
0.0 0 0.0
0
UTC
]# timedatectl set-local-rtc 1 # set hardware clock to local timezone
# timedatectl
      Local time: Sat 2014-12-27 10:17:21 EST
  Universal time: Sat 2014-12-27 15:17:21 UTC
        RTC time: Sat 2014-12-27 10:17:21
        Timezone: America/New_York (EST, -0500)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: yes  <- local timezone
      DST active: no
 Last DST change: DST ended at
                  Sun 2014-11-02 01:59:59 EDT
                  Sun 2014-11-02 01:00:00 EST
 Next DST change: DST begins (the clock jumps one hour forward) at
                  Sun 2015-03-08 01:59:59 EST
                  Sun 2015-03-08 03:00:00 EDT

Warning: The RTC is configured to maintain time in the local timezone. This
         mode is not fully supported and will create various problems with time
         zone changes and daylight saving adjustments. If at all possible use
         RTC in UTC, by calling 'timedatectl set-local-rtc 0'.

最後の Warning メッセージを読めばわかるように、ハードウェアクロックをローカルタイムにするとタイムゾーンの移動やサマータイムなどめんどくさい計算が絡んでくるので “at all possible use RTC in UTC” と全力でローカルタイムゾーンを使わないように警告している。

Linux も含めて多くの OS が ハードウェアクロックを UTC にしている一方で Windows はローカルタイムゾーンを採用している。
MS-DOS 時代からの後方互換性とBIOS画面でユーザが UTC ではなくローカルタイムを設定した場合の混乱を回避するためらしい。

Why does Windows keep your BIOS clock on local time? – The Old New Thing – Site Home – MSDN Blogs

References

Advertisements
Tagged with: , ,
Posted in linux

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
%d bloggers like this: