clockadj

はじめに

何らかの方法で相互に接続されているコンピュータが、互いに異なる 時刻を示していると色々と不都合な事が起こります。
フロッピーディスクを手渡しでファイル交換する様な環境なら、1分も合って いれば十分かなぁと言う気もしますが、現在の様な、高速な回線で世界中が 繋がろうと言う時代では、最低でも秒のオーダでシステムクロックが合っている 必要があると考えます。
高速な ethernet を使ったネットワークで問題解決の作業を経験した方なら、 接続されたコンピュータのシステムクロックがずれている事によりログの解析 で苦労した経験のある方もいるかもしれません。
また、有名な所では、NFS で共有している home ディレクトリで、make コマンド 等、時刻とファイルのタイムスタンプに依存するプログラムで、トラブルに 遭遇した経験のある方もたくさんいるに違いありません。
そこで、現在、性能はほどほどで良いので、お手軽に時刻合わせの出来る プログラムを開発中です。興味のある方は、 ここから
ダウンロードしてお試し下さい。

使用するにあたって、 この資料に書いてある程度の基礎知識を身に付けて置いて下さい。

現在、色々と試している所で、今後大幅な仕様変更があると思います。

本プログラムの概要

インストール

ソースをダウンロードして、適当なディレクトリに展開して。

make

ルートになって、

make install

/usr/local/clockadj 以下にインストールされるので、アンインストールは

rm -rf /usr/local/clockadj

現在テスト中ですのでこのようになっていますが、最終的には、/usr/local/sbin, /usr/local/bin, /usr/local/etc, /var/clockadj にインストールされるように なるつもりです。

/usr/local/clockadj/bin 以下にインストールされるのは一般ユーザの権限で 実行できるコマンド。
/usr/local/clockadj/sbin 以下にインストールされるのは、実行にルート権限 が必要な物。ここにインストールされる clockadj コマンドに対して、 set-user-ID ビットを立ててはいけない。現状では、clockadj が 呼び出す基準時刻取得プログラムは、コマンドラインオプションにより 任意のコマンドが実行可能であるため。 設定ファイルは /usr/local/clockadj/etc/clockadj.conf

使い方(ntpを利用)

/usr/local/clockadj/etc/clockadj.conf で、各種設定をして、
/usr/local/clockadj/sbin/clockadj を実行する。
デフォルトの設定は、ntp2.jst.mfeed.ad.jp から時刻を取得する設定 になっているので、既に、インターネットに接続していて、途中の ファイアーウォール等で、ntp のポートが閉じられていなければ、 そのまま実行可能。
ファイアーウォール等で、ntp のポートが閉じられているが、 ファイアーウォールの内側に ntp サーバが用意されているなら、 その ntp サーバを利用するように clockadj.conf を変更。

clockadj_ntp_host="ntp2.jst.mfeed.ad.jp"

の部分に、ホスト名または、IPアドレスで。

準備が出来れば、clockadj を実行。常時稼働、常時接続の環境なら、 cron で、1時間 〜 2時間に一回程度実行するようにしておくと良い。

10 */2 * * * /usr/local/clockadj/sbin/clockadj >/dev/null 2>&1

/usr/local/clockadj/clockadj.log に、実行結果が記録される。[W], [E] の マークの付いた表示に注意。

時々ネットワークに接続するマシン、APM 等で、サスペンドする可能性の あるマシンでは、1〜2 日程度、常時接続, 常時稼働の状態を作って、 上記手順を行い周波数調整を行えば、その後は、不定期に clockadj を 実行する事で、少しはましな状態になるはず。

常時接続は出来ないマシンでは、常時稼働の状態を作って、

ネットワーク接続
clockadj 実行
ネットワーク切断

1〜2 時間以上待つ

ネットワーク接続
clockadj 実行
ネットワーク切断

2〜3 時間以上待つ

ネットワーク接続
clockadj 実行
ネットワーク切断

24 時間以上待つ

ネットワーク接続
clockadj 実行
ネットワーク切断

という手順で周波数調整を行い、以降は不定期で良いので、時々 clockadj を実行 して下さい。また、clockadj 実行直後に hwclock --systohc を実行 しておいて下さい。

使い方(手入力)

不幸にもネットワーク接続が出来なくて、毎日 date コマンドで、時計の 修正を行っている環境では、以下の方法を試して下さい。

/usr/local/clockadj/sbin/clockadj -r "/usr/local/clockadj/bin/clockadj-con"

プロンプトがでれば、時刻を次の様なフォーマットで入力して下さい。

2004/08/09 09:00:00

ここまで入力したら、例えば 117 を聞きながら、9時ちょうどに、[enter] キー を押して下さい。プッ、プッ という音でタイミングを取りながら、ポーン という音が聞こえる直前に [enter] を押して下さい。私は、運動神経は 良くない方ですが、0.2秒程度の精度が得られています。
これを毎日繰り返せば、三日目くらいから良い感じになるでしょう。

各ファイルに付いて、

/usr/local/clockadj/etc/clockadj.conf

設定ファイル。

/usr/local/clockadj/sbin/clockadj

メインのプログラム。実行にはルート権限が必要。設定ファイルの

clockadj_refcmd="/usr/local/clockadj/bin/clockadj-ntp -l /usr/local/clockadj/clockadj.log"

で、基準時刻取得に使用するコマンドを指定可能。

clockadj_threshold=0.1

の値は、時刻の修正量の積算値がどのくらいになると、周波数調整を行うか、 決める。常時接続で、1〜2時間に一度程度 ntp サーバに問い合わせが出来る 環境なら、0.01 程度で良いでしょう。質の良くない ntp サーバに問い合わせ なければならない環境では 0.1 程度が良いと思います。現在調査中。

/usr/local/clockadj/sbin/ntpd

簡易 ntp サーバ。実行にはルート権限が必要。システムクロックを リファレンスとして動作する。家庭内 LAN 上のコンピュータに、 時刻を知らせるための物。ntp サーバとしての機能を全て備えている 訳ではないので、公開サーバとして使用したり、インターネットから 見える場所に置いてはいけない。小規模オフィス内でも、不完全な ntp サーバである事周知徹底できる環境なら、使用しても良いかも知れません。
インターネット接続のゲートウェイとして動作するマシン等で使用したい時 は、設定ファイルの

ntpd_addr="0.0.0.0"

を書き換えて、このマシンのLAN側のアドレスが 192.168.0.254 ならば、

ntpd_addr="192.168.0.254"

のようにして使用して下さい。起動後 netstat 等で、開いているポートの 確認は忘れないで下さい。

/usr/local/clockadj/bin/clockadj-ntp

ntp サーバとの時刻比較を行う。ユーザー権限で実行可能。

clockadj-ntp hostname

で実行。hostname を省略した時、設定ファイルで指定したホストに問い合わせる。 -c オプションで、数値を指定する事で、測定回数を指定できる。省略時は、設定 ファイルの

clockadj_ntp_count=3

で指定した値となる。結果は標準出力に次のように出力される

1092036348.127726 0.000758 0.000003 0.000274 0.000010

全て単位は秒。最初の桁は、時刻比較を行った時刻。使用するシステムでの gettimeofday で得られる値に準拠する。同じ時刻でも、UTC 対応システムと そうでないシステムで値が異なる。
2 桁目は、ntpサーバと、このマシンのシステムクロックの時刻の差(offset)。 正の値だと、基準時刻に対して遅れている状態。
3 桁目は、offset の標準偏差。-c 1 で、一度しか問い合わせなかった時は、 0 になる。
4桁目は delay。ntpサーバとの間で、パケットの往復に要した時間。
5桁目は delay の標準偏差。
ntp プロトコルでは、パケットの上り下りに要する時間が等しい事を 前提としているので、ADSL 等、非対称な回線では、delay の値の半分程度 の誤差は含まれていると考えるべきである。

/usr/local/clockadj/bin/clockadj-con

手入力で、基準時刻を入力する。NTT の 117 サービス程度しか、基準時刻を 知る事の出来ない不幸な環境のためのプログラム。
ntp 以外の方法で、基準時刻を取得するプログラムを作成する際のサンプル プログラムと考えて下さい。

/usr/local/clockadj/bin/pclock

一秒毎に、現在時刻を標準出力に出力するプログラム。
通常付属している X の時計プログラム等では、必ずしも、正秒に 更新されるとは限らない。このプログラムは、出来るだけ正秒に 表示を更新する。よほど、過負荷な環境でない限り、標準的な人間の 認識範囲で、正秒に表示が更新されると思います。

clockadj-ntp の補足事項

clockadj-ntp を -v オプションを併用する事で、デバッグ情報を 出力します。

clockadj-ntp -v -c 5 hostname.of.ntpserver

のように実行してみて下さい(一般ユーザーの権限で実行できます)。 適当な ntpserver を知らないなら、

ntp1.jst.mfeed.ad.jp
ntp2.jst.mfeed.ad.jp
ntp3.jst.mfeed.ad.jp

が利用できます。最初の方のうるさい出力はとりあえず無視して、 最期の方の、

------------------------------------

0: 1093932057.502171 -0.001261 ( -5.949) 0.053969 ( -3.024)
1: 1093932057.559515 -0.000500 ( -0.017) 0.054611 ( -1.021) **
2: 1093932057.617307 -0.000440 ( 0.452) 0.055468 ( 1.653) **
3: 1093932057.674416 -0.000700 ( -1.578) 0.054801 ( -0.429) **
4: 1093932057.731807 -0.000351 ( 1.142) 0.054873 ( -0.203) **

------------------------------------

という表示に注目して下さい。
clockadj-ntp では、-c オプションで指定した回数 ntpサーバに問い合わせ、 結果を平均して出力しますが、この表示は平均化する前の個別の結果です。 各項目は、「連番」、「時刻比較を行った時刻」、「オフセット」、 「オフセットの平均値からのずれ」、「ディレイ」、 「ディレイの平均値からのずれ」となります。平均値からのずれは、標準偏差 でスケールした値。その他の単位は秒になります。
この例では、一回めの時刻比較だけ結果が妙にずれている事に気が付くでしょう。 これは、ネットワーク機器に依存すると思うのですが、NAT を使用している、 一般家庭のネットワーク環境では、このような現象が発生していないか 確認しておく必要があります。もしこのような現象が発生するネットワーク 環境では、ntpd を普通に動作させるだけでは、見掛け上同期がとれている ようで、実際にはそれほどでも無い可能性があります。そうはいっても、 ADSL 等、非対称な帯域による影響に比べれば些細な事かも知れませんが。
上記表示の一番右に ** という記号が付いている行と付いていない行が ありますが、** が付いているものだけ、平均化して結果として出力して います。** が付いていない行は、平均値からあまりにも離れている データで、捨てられた物です。

運用結果1

実際に運用した結果その1

ダウンロード

ダウンロード


このページに関する、ご意見、感想、苦情はこちらまで 松本 徳真 / matsu@netfort.gr.jp