Linuxで時計をあわせる (clockspeed)

(2001.12.23の日記ほかに加筆、修正し、2006.8.12 ページを独立。)

ネットワークを使っていると、システムの時刻が正しくないと不具合が起こりやすい。どうやって時計を正しい状態に保つか。

UNIXでのうるう秒の取り扱い

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のインストール

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サーバを使ってみる。

  • ntp1.jst.mfeed.ad.jp (210.173.160.27)
  • ntp2.jst.mfeed.ad.jp (210.173.160.57)
  • ntp3.jst.mfeed.ad.jp (210.173.160.87)

時刻を表示する。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 &