(2001.12.23の日記ほかに加筆、修正し、2006.8.12 ページを独立。)
ネットワークを使っていると、システムの時刻が正しくないと不具合が起こりやすい。どうやって時計を正しい状態に保つか。
POSIX (SUSv3) では、うるう秒は考慮しない。すなわち、Epochからの秒数(UNIX time)には、うるう秒はカウントしないことになっている。1日で必ず86,400秒進む。
Coordinated Universal Time (UTC) includes leap seconds. However, in POSIX time (seconds since the Epoch), leap seconds are ignored (not applied) to provide an easy and compatible method of computing time differences. Broken-down POSIX time is therefore not necessarily UTC, despite its appearance.
TAI (国際原子時) ライブラリは、うるう秒を考慮した経過秒数を返す。Linuxのglibcは、TAIベースにも設定できる。(が、誤動作のもと。やめよう。)
clockspeedは、システムの時計の進み具合を調整して、システムの時計が正しい時刻を指すように調整する。ある時点でいきなり時刻をあわせると、時計が巻き戻ったりしてシステムのほかの部分に不具合が生じることがある。(例えば、make)
clockspeedは内部でadjtime()を使っている。この関数はPOSIX標準ではない (BSD由来) ので、動かない環境があるかもしれない。
ともかく、まずダウンロードしてきて、アーカイブを展開する。
/opt/src$ tar xzvf clockspeed-0.62.tar.gz $ cd clockspeed-0.62
そのままではコンパイルエラーになるので、パッチを当てる。Patches for djb tools
$ patch -s -p1 < clockspeed-0.62-q2.diff
インストール先ディレクトリは、conf-homeファイルで設定する。/usr/localでいいと思う。次のように、UNIX風のディレクトリ配置になる。
$(auto_home)/etc bin/ clockspeed clockadd clockview sntpclock taiclock taiclockd man/man1/clockspeed.1 /etc/leapsecs.dat <- このファイルは/etc決め打ち
コンパイル、インストール。
$ make $ su # make setup check
公開されているNTPサーバを探す。
インターネットマルチフィード時刻情報サービス for Public のサービス詳細ページにあるNTPサーバを使ってみる。
時刻を表示する。sntpclockコマンドはNTPサーバに時刻を問い合わせる。clockviewコマンドは人間が読めるように表示を整える。
# sntpclock 210.173.160.87 | clockview before: 2004-11-19 23:20:16.972576000000000000 after: 2004-11-19 23:20:39.208465097534179687
いまこの瞬間に時刻を合わせるのは、clockaddコマンドを使う。
# sntpclock 210.173.160.87 | clockadd
もう一度時刻を確認する。
# sntpclock 210.173.160.87 | clockview before: 2004-11-19 23:28:55.549661000000000000 after: 2004-11-19 23:28:55.525947937591552734
clockspeedコマンドを起動する。clockspeedコマンドは、名前つきパイプで現在時刻を受け付け、時計を少しずつ修正する。
# clockspeed & # sntpclock 210.173.160.87 > /usr/local/adjust &
システムの起動時に自動的にclockspeedを起動するには、daemontoolsを使うのがよい。
あとは数ヶ月に1回、現在時刻を clockspeed コマンドに通知する。cronなどで定期的に実行すればいい。
# sntpclock 1.2.3.4 > /usr/local/clockspeed/adjust &