時計の覚え書き
どういったものか、時計というものが定期的に分からなくなるのだった。まあ、ほとんどPCを動かしっぱなしだからというのは、その要因の一つに入れてもまずくはないだろう。
で、時計のことだがハードウェアとしてのPCがどういう時刻を保持しているかと、その上で動いているOSがどういう時刻を保持しているかは別ものである。とはいえ、てんでバラバラということもなく、保持しているのはその地域での時刻か、そうでなければUTCというのが一般的だろう。
OSが保持している時刻というのは…… いや、これはこれで考え始めると頭が痛くなってくるのだが、とりあえずはデスクトップに表示されている時刻、dateコマンドで表示される時刻、くらいの認識でよいだろう。
それに対してPCが保持しているのがどういう時刻か。これを調べるにはどうするとよいだろうか。
確実なのはPCを再起動するなり他の手段をとるなりしてBIOS(この言い方は不適切かもしれない)から読み取ること。だが、これにはめんどうが多い。では他に手がないのかというと、実はhwclock
というコマンドがある。このコマンドは--show
オプション(短い形なら-r
オプション)を与えて実行するとハードウェアの時刻を表示してくれる。
% sudo hwclock -r
2013年07月13日 19時08分00秒 -0.747195 秒
ただし。ここで表示されるのは常にその地域の時刻に変換されたものなのだ。表示された時刻が正しいとき(といっても普通は正しい時刻が表示される)、ハードウェアの時刻が正しく地域時刻を保持しているか、あるいは正しくUTCを保持しているかのどちらかである。つまり、そのどちらであるかを表示内容からは判別できない。
ハードウェアの時計には、その時計がどういう時刻を刻んでいるのかを記録しておく機能はない。ではhwclock
はどうやって正しい時刻を表示してみせているのか。それは、そのOS上で時計の設定が行われた際のことを記録したファイルを参照してるのである。そのファイルというのはadjtime
ファイルであり、通常は/etc
に置かれている。
adjtime
ファイルはテキストファイルであり、その内容についてはhwclock(8)に説明がある。三行の記述からなっており、いま注目すべきなのはそのうちの三行目だ。
% cat /etc/adjtime
0.004013 1361405357 0.000000
1361405357
UTC
この部分はUTCまたはLOCALのどちらかとなる。UTCならばハードウェアの時計がUTCを、LOCALならば地域の時刻を、それぞれ保持していた(のを前提に前回ハードウェアの時計を設定した)ことを示している。よって、この三行目を確認すればハードウェアの時計がどういう時刻を保持しているかを判別できる。
ところで、hwclock
にはadjtime
ファイルを使うかわりに、実行時にハードウェアの時計が保持している時刻を指定するオプションが用意されている。--utc
および--localtime
である。--utc
を与えて実行すれば、ハードウェアの時計がUTCを保持しているつもりになってその内容を解釈し、さらにそれをOSの都合に合わせた地域の時刻に変換して表示してくれる。--localtime
であれば、ハードウェアの時計が地域の時刻を保持しているとして同様に動作する。
したがってオプション指定とハードウェアの時計の内容がマッチしていればhwclock
は正しい時刻を表示し、そうでなければ間違った時刻を表示する。上に示した例でいえば--utc
オプションを指定すれば正しく表示し、--localtime
オプションを指定すれば間違って表示する。
% date
2013年 7月 13日 土曜日 19:38:16 JST
% sudo hwclock -r --utc
2013年07月13日 19時38分24秒 -0.734444 秒
% sudo hwclock -r --localtime
2013年07月13日 10時38分28秒 -0.598571 秒
以上の通りである。
ちなみに、hwclock
コマンドによる時刻の表示における日時に続く「秒数」はhwclock
コマンドが起動された直後あたりから、実際にハードウェアの時計を読み取ろうとしたあたりまでに経過した時間だ。すぐ上の実行例についていうと2013年07月13日 10時25分16秒
というのはコマンド実行開始から0.115103 秒
後にハードウェアの時計を読み取った(読み取り始めた)結果を表示しているということになる。