閏秒対応と時刻合わせツールの設定をする

OpenBSD は、デフォルトでは、 閏秒 に対応していません(POSIX 仕様)。 実社会で使われている時刻を正しく取り扱うことが出来ないのは気に入らないので、 閏秒を扱えるように設定しました。 また、ネットワーク経由で自動的に時計を合わせる設定もしてみました。

閏秒を扱えるように設定すると、時刻データを扱うアプリが誤動作する場合があります。 例えば、PostgreSQL(確認したのは 7.2.3版)では時刻データを扱う関数が正常に動作しません。 正確な時刻を扱う必要がない(1秒ぐらいの誤差は気にしない)のであれば、 POSIX仕様のままにしておくほうが良いでしょう。 私のマシンもPOSIX仕様に戻してあります。

閏秒対応の確認

  1. 以下のプログラムは、 日本時間で 1999/01/01 09:00:00 の前に挿入された閏秒の前後の時刻を表示します。 これを cc でコンパイルします。
    #include <stdio.h>
    #include <time.h>
    #include <sys/types.h>
    
    main(){
        time_t t = (time_t)915148820;
        printf("08:59:59 - %s", ctime(&t)); t++;
        printf("08:59:60 - %s", ctime(&t)); t++;
        printf("09:00:00 - %s", ctime(&t));
    }
    
  2. このプログラムを実行した結果、 以下のように、表示する秒が 59-60-00 と変化する場合には、閏秒に対応しています。
    08:59:59 - Fri Jan  1 08:59:59 1999
    08:59:60 - Fri Jan  1 08:59:60 1999
    09:00:00 - Fri Jan  1 09:00:00 1999
    
    秒が 20-21-22 というように、22秒進んで表示された場合には、閏秒に対応していません。 この中間の表示になった場合には、 閏秒には対応しているが、閏秒のテーブルが正しくメンテナンスされていないと考えられます。

閏秒対応の設定

  1. 閏秒対応の設定には、OS のソースが必要です。 インストールしていない場合には、CD-ROM や Anonymous CVS によりインストールしてください。
  2. /usr/src/share/zoneinfo/Makefile の中の REDO の値を right_only に変更します。
    # If you always want time values interpreted as "seconds since the epoch
    # (not counting leap seconds)", use
    #       REDO=           posix_only
    # below.  If you always want right time values interpreted as "seconds since
    # the epoch" (counting leap seconds)", use
    #       REDO=           right_only
    # below.  If you want both sets of data available, with leap seconds not
    # counted normally, use
    #       REDO=           posix_right
    # below.  If you want both sets of data available, with leap seconds counted
    # normally, use
    #       REDO=           right_posix
    # below.
    
    REDO=           right_only
    
  3. 以下のようにして変更を反映します。
    # cd /usr/src/share/zoneinfo
    # make install
    

時刻合わせツール

  1. 時刻合わせのプログラムとしては David L. Mills さんによる ntp が有名ですが、必要以上に高機能で大規模なプログラムと思われました。 SNTP レベルの機能で十分なので、簡易なツールが無いか探したのですが、 Windows 用には沢山あっても、UNIX の世界には適当なものが見つかりませんでした。 それならば、ということで自分で作成してみました。
    ツールのインストールと設定については、 sntpd - SNTP daemon を参照してください。