2014年5月6日火曜日

RTC (ハードウェアクロック) とか、システムクロックとか

RTC とかシステムクロックについて調べたことをまとめときます。

環境

Ubuntu Ja 14.04 Desktop Amd64

Ubuntu が RTC をどのように扱うか

RTC に設定された時刻を UTC、ローカルタイムのどちらとして扱うかは /etc/default/rcS の UTC の値で決まります。

$ cat /etc/default/rcS
... snip ...

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

... snip ...

UTC=no なので、RTC に設定された時刻はローカルタイムとして扱われます。今回は Windows とのデュアルブート環境なので RTC にはローカルタイムを設定してます。

UTC=yes だと RTC に設定された時刻は UTC として扱われます。

/proc/driver/rtc で RTC に設定された時刻を確認

RTC に設定されている時刻がそのまま表示されます。

$ cat /proc/driver/rtc
rtc_time        : 19:42:29
rtc_date        : 2014-05-05
... snip ...

RTC に設定された時刻は 2014/05/05 19:42:29 でした。

hwclock で RTC に設定された時刻を確認

man ページに書かれているとおり、hwclock では時刻は必ずローカルタイムに変換されて表示されます。

$ man hwclock
... snip ...
       -r, --show
              Read  the  Hardware Clock and print the time on standard output.
              The time shown is always in local time, even if  you  keep  your
              Hardware  Clock  in  Coordinated  Universal Time.  See the --utc
              option.  Showing the Hardware Clock time is the default when  no
              function is specified.
... snip ...

-- localtime オプションで RTC に設定された時刻をローカルタイムとして扱い、 --utc オプションで RTC に設定された時刻を UTC として扱います。

つまり、以下に例示したとおり、 RTC に設定された時刻がローカルタイムの場合は -- localtime を付けて hwclock を実行し、UTC の場合は --utc を付けて hwclock を実行しないとうまく時刻を確認できません。

RTC がローカルタイムで設定されている場合は -- localtime を付けると RTC に設定された時刻をそのままローカルタイムとして正しく表示します。

$ cat /proc/driver/rtc | head -n 2
rtc_time        : 22:48:32
rtc_date        : 2014-05-05

$ grep ^UTC /etc/default/rcS
UTC=no

$ date
2014年  5月  5日 月曜日 22:48:34 JST

$ sudo hwclock --localtime
2014年05月05日 22時48分37秒  -0.234889 秒

RTC がローカルタイムで設定されているのに --utc を付けると UTC として解釈してしまい、それをローカルタイムに変換した時刻が表示されます。

$ cat /proc/driver/rtc | head -n 2
rtc_time        : 22:48:39
rtc_date        : 2014-05-05

$ grep ^UTC /etc/default/rcS
UTC=no

$ date
2014年  5月  5日 月曜日 22:48:40 JST

$ sudo hwclock --utc
2014年05月06日 07時48分44秒  -0.989131 秒

結果として、hwclock では現在時刻より 9時間進んだ時刻がローカルタイムとして表示されます。

RTC が UTC で設定されている場合は --utc を付けると RTC に設定された時刻を UTC として正しく解釈し、ローカルタイムに変換された時刻を正しく表示します。

$ cat /proc/driver/rtc | head -n 2
rtc_time        : 13:50:08
rtc_date        : 2014-05-05

$ grep ^UTC /etc/default/rcS
UTC=yes

$ date
2014年  5月  5日 月曜日 22:50:09 JST

$ sudo hwclock --utc
2014年05月05日 22時50分13秒  -0.969169 秒

RTC が UTC で設定されているのに -- localtime を付けるとローカルタイムとして解釈してしまい、そのまま表示されます。

$ cat /proc/driver/rtc | head -n 2
rtc_time        : 13:50:15
rtc_date        : 2014-05-05

$ grep ^UTC /etc/default/rcS
UTC=yes

$ date
2014年  5月  5日 月曜日 22:50:16 JST

$ sudo hwclock --utc
2014年05月05日 13時50分20秒  -0.984840 秒

結果として、hwclock では現在時刻より 9時間前の時刻 (つまり UTC) がローカルタイムとして表示されます。

おまけ

hwclock に -- localtime--utc も付けない場合は、/etc/adjtime の状態により RTC の解釈が異なります。

/etc/adjtime が存在し、このファイルの中身の最後の行が LOCAL になっている場合は RTC はローカルタイムとして解釈されます。( -- localtime を付けた場合と同じ結果になります。)

/etc/adjtime が存在し、このファイルの中身の最後の行が UTC になっている場合は RTC は UTC として解釈されます。( --utc をつけた場合と同じ結果になります。)

/etc/adjtime が存在しない場合も RTC は UTC として解釈されます。


0 件のコメント:

コメントを投稿