The Clock Mini-HOWTO

Ron Bean

rbean@execpc.com

JF Project - 日本語訳

JF@linux.or.jp

v2.1, November 2000

コンピュータに正確な時間を設定して、時計が狂わないようにする方法。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Table of Contents
1. はじめに
   
    1.1. ほんとは何時なんだい？
    1.2. ソフトウェアの入手先：著名なアーカイブ
    1.3. 謝辞
   
2. Linux はどのように時間を計っているのか
   
    2.1. 基本的な仕組み
    2.2. コンフリクトの可能性
    2.3. RTC にはローカルタイムか UTC のどちらを使うべきか？ DST って何
        ？
    2.4. タイムゾーンの設定について
    2.5. どの程度の精度が必要か
   
3. ソフトウェア
   
    3.1. clock(8) と hwclock(8)
    3.2. Adjtimex(8)
    3.3. xntpd と ntpd - ネットワークタイムプロトコル
    3.4. chrony プログラム
    3.5. clockspeed プログラム
   
4. 電波時計
   
    4.1. CHU と「Gadget Box」
    4.2. WWV と「Most Accurate Clock」
    4.3. GPS と「Totally Accurate Clock」
    4.4. 長波タイムシグナル： DCF77, MSF(Rugby), WWVB
   
5. 日本語訳について

1. はじめに

1.1. ほんとは何時なんだい？

PC マザーボード上のリアルタイムクロック (Real-Time-Clock, RTC) チップの
不正確さは有名です。たいてい早すぎたり遅すぎたりするので、毎日少しずつ
時計が狂っていきます [1]。しかし、Linux にはソフトウェア上でこれを修正
する簡単な方法があります。その方法を使えば、外部の時報ソースに頼らずと
も時計を非常に正確に保つことができます。ただ、その設定方法を知る人があ
まりいないのは、(おそらく) 以下のような理由があるからだと思われます。

 

 ・ Linux の設定全般を解説した文書ではほとんどこれに触れられておらず、
    (外部の時報ソースを利用する場合以外は) 自動的に設定されることもない
    ので、デフォルトでは利用されないこと。
   
 ・ man clock とコマンドを打つと clock (3) が表示されますが、これには全
    然別の事柄が記載されていること。man 8 clock もしくは man 8 hwclock
    を試してください (セクションを指定せずに man page を検索した場合、
    一般のディストリビューションではセクションの若い方が先に表示される
    ようになっています。/etc/man.config で指定した順に検索するディスト
    リビューションもあります)。
   
 ・ そもそも時間自体を気にしていない人が多いらしいこと。
   
 ・ 時計の時間を気にするひとは、ネットワークタイムサーバ (netwok time
    server) や電波時計 (radio clock) といった外部の時報ソースにシステム
    クロックを同期 (sync) させている人が大半であること。この場合、RTC
    が正確かどうかは(ほとんど) 関係がなくなります。
   
 

この mini-HOWTO では、ローテクな方向からアプローチします (それだけで、
時計は非常に正確になります)。また、もっと洗練された方法で時間調整したい
人のために、各種の情報源も紹介しています。後者の場合、その手の文書の解
説はおおむねしっかりしているので、本書では詳解しません。

本書の前バージョンでは、古いシステムをいまも使っている人のために旧式の 
clock (8) プログラムについて詳しく説明していましたが、今回はそのセクシ
ョンを省略しました。現在多くのディストリビューションが clock (8) にかえ
て hwclock (8) を採用しており、hwclock (8) プログラムに関する文献の方が
ずっと優れているからです。clock (8) の解説文が必要な場合は、著者にメー
ルで知らせてください。ただ、その場合は、先ず hwclock (8) についての章を
読んでからにしてください。

    注意: RTC やシステムクロックを修正するプログラムを実行するには
    "root" でログインしなければなりません。この文書で述べるプログラムの
    大半は、root 権限が必要です。普段からグラフィカルインターフェイスし
    か使っていない場合は、基本的な UNIX のシェルコマンドをいくつか学ぶ
    必要があるかもしれません。
   
    注意: マシン上で複数の OS を使っている場合は、そのうちひとつだけで
    RTC の設定を行い、他の OS との間で時間が食い違うことがないようにす
    る必要があります。ただ、年に 2 度の夏時間の調整については別です (詳
    しくは、 DST のセクションをご覧ください)。
   
デュアルブートシステムで主に Windows を使っているなら、Linux 版ではなく
、Windows 版のクロックソフトウェアについて調べたいと思うかもしれません
。その場合は、次の NTP ウェブサイトの説明をご覧ください。http://
www.eecis.udel.edu/~ntp/software.html。本書での電波時計の説明の多くは、
Windows 用ソフトウェアに関するものも含まれています。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1.2. ソフトウェアの入手先：著名なアーカイブ

本書ではソフトウェアをダウンロードできる場所としていくつかのサイトを挙
げましたが、CD-ROM 版が手に入らない場合は Linux システム全体をそこから
ダウンロードすることもできます。昔は、そのようなサイトは
sunsite.unc.edu の ftp アーカイブと各国のそのミラーサイトであると相場が
決まっていましたが、現在 sunsite は http://metalab.unc.edu/linux/ と改
名されています (訳注： 2001年10月現在では ibiblio http://
www.ibiblio.org/pub/linux/ という名称に変更されています)。ディストリビ
ューションの中には独自のウェブサイトを持っているものもあり、そのなかに
はこの文書で扱うソフトウェアが含まれている場合もあります。

最近では Linux を CD で入手する人がほとんどであり、そうした CD にはデフ
ォルトでインストールされないような各種ソフトウェアもたいてい含まれてい
るので、自分では意識していなくとも本書で述べるプログラムが既に手元にあ
る場合が多いと思われます。

この mini-HOWTO の最新バージョンは、Linux Documentation Project のホー
ムページにあります。LDP のホームページは、現在 http://www.linuxdoc.org/
です (上述した metalab サイトからも入手が可能です)。古いリンクを指定し
た場合でも必ず現在のサイトに forward されるようになっていると思います。

すべての HOWTO 文書は SGML で記述されており、規格に基づいた変換プログラ
ムを使って各種フォーマットに変換されています。たいていの人は HTML 形式
で読むと思われます。HTML 版は、 http://www.linuxdoc.org/HOWTO/mini/
Clock.html です。改訂履歴は SGML ソースにコメントとして記載しています。
大部分のディストリビューションでは、全 HOWTO 文書が /usr/doc/HOWTO/ と
/usr/doc/HOWTO/mini/ にインストールされています。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1.3. 謝辞

この mini-HOWTO は、1996年の初版以来、著者にメールを送ってくれた多くの
方々のおかげで大幅に改善されてきました。中には、質問を受け取ったはずな
のに、結局こちらがいろいろと教えていただいたことも何度かありました。残
念ながら、著者はまだそれらの方の氏名のリストを作成していません (次回の
改訂では多分記載できると思います)。心当たりのある方は、ご自分のことだと
お分かりになると思います :)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

2. Linux はどのように時間を計っているのか

2.1. 基本的な仕組み

Linux システムには 2 種類の時計があります。ひとつは、バッテリー駆動のリ
アルタイムクロック(RTC や CMOS クロックもしくはハードウェアクロックとも
呼ばれています)であり、これはシステムの電源がオフの時にも動いていますが
、システムの稼働中は使われません。もうひとつは、システムクロック
(System Clock, カーネルクロックもしくはソフトウェアクロックとも呼ばれま
す) であり、これはタイマ割り込みに基づくソフトウェア・カウンタ(software
counter)です。システムクロックはシステムの稼働中以外には存在しないので
、起動時に RTC (もしくはそれ以外の外部時計) によって初期化される必要が
あります。ntpd の付属文書で「クロック」を参照するという場合、RTC ではな
くシステムクロックの参照を意味しています。

それら 2 種類の時計のズレ具合は異なっているので、両者は徐々に食い違って
いき、双方ともだんだんと実際の正確な時間から離れていきます。これらを正
確に保つ上で最も簡単な方法は、時間がズレる割合を計算してソフトウェア上
でそれを修正することです。RTC はシステムの稼働していない時だけ使用され
るものなので、RTC の修正は、起動時に時刻を読み込む際に clock(8) か 
hwclock(8) を使って行います。システムクロックの修正は、タイマ割り込みに
よりシステム時間が進む際に adjtimex(8) を使ってズレを修正することにより
実施します。

adjtimex(8) の代わりに cron を使って clock(8) か hwclock(8) を定期的に
実行し、システムクロックを(正確に調整した)RTC に同期させるという方法も
ないわけではありません。これは clock(8) のマニュアルページで推奨されて
いますし、ある程度頻繁に同期させることで両者の時間のズレを小さくしてシ
ステムクロックの時刻が大幅に「ジャンプ」することがなければ問題なく機能
しますが、adjtimex(8) を使って調整した方がエレガントです。アプリケーシ
ョンのなかには、時間調整で時計を遡らせた場合にはエラーになるものがある
かもしれません。

時間調整の方法としては、他にも ntpd というプログラムを使ってネットワー
クタイムサーバや電波時計から定期的に時間を読み込んで継続的にシステムク
ロックの誤差を調整することで、システムクロックの時刻の大幅な「ジャンプ
」を避ける方法もあります。もし起動時に必ずネットワークコネクションを張
ることが出来るなら、RTC を完全に無視し、ntpdate (これは ntpd パッケージ
に付属しています) を使って LAN 内のローカルマシンやインターネット上のリ
モートマシンにあるタイムサーバによりシステムクロックを初期化することも
できます。しかし、もし必ずしもネットワークコネクションを張れないときが
ある場合や、起動中に正確な時間を取得した後にネットワークに繋がなければ
ならない場合は、 RTC の時間も調整しておく必要があります。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

2.2. コンフリクトの可能性

ntpd のようなプログラムを使っているなら、RTC を (調整済みの)システムク
ロックに同期させようと思うかもしれません。しかし、これはシステムが数分
以上に渡って遮断される可能性がある場合には予想通りに上手くはいきません
。起動時に RTC を調整するプログラムと干渉してしまうからです。

システムが土日なしで 24 時間稼働し、電源が遮断された場合でもすぐに再起
動するようになっているなら、システムクロック時間に基づいて再起動直前に
RTC を設定することは可能です。その際は RTC にはリブート中の経過時間の範
囲内でしか誤差が生じないので、RTC のズレ具合を知る必要もなくなります。

もちろんシステムには予想外の障害が付きものです。そこで、システムクロッ
クが何らかのプログラムによって正確に調整されている場合、カーネルのバー
ジョンによっては RTC を 11 分ごとにシステムクロックに同期させるものがあ
ります。通常 11 分間のうちに RTC がシステムクロックと大きく食い違うこと
はありませんが、システムが長時間ダウンして RTC 時間が大きくズレた場合は
問題が生じます。なぜなら RTC の誤差を調整するプログラムは、自分が RTC
を最後にリセットした時刻を正確に記憶している必要があるのですが、カーネ
ルにはそのような情報は記録されていないからです。

UNIX の伝統を重んじる人の中には、Linux システムはもともと 24 時間連続稼
働させるものなのだと思っている方もいることでしょう。しかし、デュアルブ
ートで時々は別の OS を実行しているユーザもいますし、ラップトップで
Linux を使っているユーザは電源を落とすことで使用中以外の時間でのバッテ
リーの消耗を防いだりもしています。それ以外にも、単に使っていないマシン
を長時間実行させっ放しにするのを好まない人もいます (むろん、電源を入れ
たままにする方が良いという議論は充分承知はしていますが)。そのような場合
、 11 分ごとに同期を行う機能は非常に不都合な機能ということになります。

この(場合によっては不都合な)機能は、カーネルのバージョンが異なると振る
舞いも異なるようです (おそらく xntpd や ntpd のバージョンが異なる場合も
、振る舞いが変わるようです)。それゆえ、もし ntpd と hwclock の両方を実
行しているなら、予めテストを行って、その機能が実際にどういう振る舞いを
するのか確認する必要があるでしょう。もしカーネルが RTC をリセットするの
を止めさせることができない場合は、RTC に対する時間調整を一切行わないよ
うにする必要があるでしょう。

こうしたことを制御しているのは、カーネル内の /usr/src/linux-2.0.34/arch
/i386/kernel/time.c です (パス中のバージョン番号は、お手持ちのカーネル
のバージョン番号に置き換えてください)。変数 time_status が TIME_OK に設
定されると、カーネルはシステム時間を 11 分ごとに RTC に書き込もうとし、
それ以外の値だと RTC には干渉しません。(例えば、ntpd や timed を使って)
adjtimex(2) を呼び出すことで、これをオンにすることができます。
settimeofday (2) を呼べば、time_status を TIME_UNSYNC に設定することが
できます。これは、カーネルに RTC の調整をしないよう指示するものです。こ
の辺りのことを詳しく説明した文書を著者は知りません。

カーネルのバージョンによっては、CPU への電源供給を遮断してバッテリーを
長持ちさせる sleep 機能に問題があるものがあるという報告を受けています。
最良の解決策は、カーネルを常に最新の状態に更新してゆくことであり、カー
ネルの管理者に問題を報告するようにすることです。

RTC の狂い方が妙な場合は、ハードウェア上の問題かもしれません。RTC チッ
プにはリチウム電池が内蔵されていますが、この電池が切れたのかもしれませ
ん。また、マザーボードによっては外部バッテリーを使えるように設計された
ものもあります(ジャンパの設定を確認してください)。 CMOS RAM も RTC と同
じ電池で動いているのですが、時計の方が電力の消費が激しいのでたいてい先
に動かなくなります。システムクロックの表示がおかしい場合は、割り込みに
問題があるかもしれません。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

2.3. RTC にはローカルタイムか UTC のどちらを使うべきか？ DST って何？

Linux のシステムクロックが実際にカウントしているのは、1970年1月1日から
の経過秒数であり、時刻は必ず協定世界時 (UTC, Coodinated Universal Time)
を使います (UTC は GMT (Greenwich Mean Time) とほぼ同義です。両者は技術
的には別物ですが非常に似通っているので、一般のユーザは同じ意味で使うこ
とが多いようです)。UTC は、夏時間 (DST, Daylight Saving Time) が必要な
場合でも変更されることはありません。変わるのは、UTC とローカルタイムと
の間での変換方法だけです。ローカルタイムへの変換は、アプリケーションプ
ログラムにリンクされたライブラリ関数によって実行されます。 (訳注：DST
(いわゆるサマータイム)については、いまのところ日本では関係ありません。)

これは、結果的に二つの意味を持ちます。まず第一に、アプリケーションがロ
ーカルタイム知る必要がある場合は、DST が有効であるか否かに関わらず、同
時にユーザのタイムゾーンも知る必要があるということです (タイムゾーンに
ついては、次章を参考にしてください)。第二に、DST が問題になる場合でも、
UTC 自体に変更はないので、カーネルはシステムクロックや RTC を変更する必
要がないということです。それゆえ Linux しか走らせないマシンの場合、 RTC
はローカルタイムではなく UTC に設定すべきです。

しかしながら、RTC がローカルタイムを表示していることを前提にした OS を
同居させて、デュアルブートシステムにしている人は多いと思います。その場
合、 hwclock は RTC がローカルタイムか UTC であるかを知る必要があり、さ
らにその時刻を 1970年1月1日 (UTC) からの経過秒数へと変換する必要があり
ます。ただ、これは RTC に対する夏時間調整までは行わないことから、夏時間
への変更は Linux 以外の OS 側で実行する必要があります (これは RTC の時
間を変更する際は単一プログラムを使い、重複した変更を行わないというルー
ルの例外に当たります)。

残念ながら、RTC や CMOS RAM にはローカルタイムの表示に関して標準時間か
DST なのかを区別するためのフラグがないので、OS は、おのおの他の OS から
は分からない場所にその情報を保存しています。つまり、夏時間の始期や終期
の前後に Linux 以外の OS を起動して時間調整していない場合であっても、 
hwclock は、RTC がいつも正しいローカルタイムを表示していると仮定しなけ
ればならないわけです。

夏時間調整の始期や終期の前後に Linux が動いていた場合、システムクロック
自体は影響を受けないわけですし、アプリケーションも正しい時刻変換をする
でしょう。しかし、何らかの理由で Linux を再起動しなければいけない場合、
システムクロックは RTC 時間に合わせて設定されます。その場合、システムク
ロックは他の OS (通常は Windows) が実行されるまで時刻が 1 時間狂ってし
まいます。

これに対処する方法はないのですが、Linux はめったなことではクラッシュし
ないので、デュアルブートシステムでリブートをかけるのはたいてい Linux か
ら他の OS に切り替えるためです。しかし、もし長時間コンピュータを使わな
いときに電源を切るタイプの人なら、つまり夏時間調整の変更があっても他の
OS を使う機会がなかったなら、他の OS を走らせるまで RTC は一時間狂うこ
とになるのを忘れないでください。

解説書のなかには、RTC を UTC に設定することで Linux が DST を上手く扱え
るようになると説明しているものがあります。これは全くの間違いではないで
すが、不正確です。リブートをしない限り、(RTC のバッテリーが切れていた場
合でも、) RTC がどちらの時間を表示しているかは問題になりません。Linux
は、リブートがかかるまではいずれかの方法で正しい時間を表示しているわけ
です。理論的には、もし一年に一回しかリブートしないなら(これは、Linux の
場合、特に珍しいことではありません)、DST が問題になる場合でもシステムク
ロックはずっと正確な時間を伝えているので、RTC が狂ったとしても何ヶ月も
気付かないでしょう。しかし、いつリブートをするかということは予め予測が
付かないので、ローカルタイムを必要とする OS を使っていない場合は、 RTC
を UTC に設定した方がいいでしょう。

Dallas Semiconductor の RTC チップ (これは、Motorola チップの代わりに
IBM AT 機やその互換機に搭載されるようになったチップです) は、実際にチッ
プ自体に UTC を DST に変換する能力が備わっていますが、変更すべき日付が
あらかじめハード的に固定されていてそれをソフト的に変えることができない
ので、この機能は使われていません。最新のバージョン更新が 2000年4月の第
一日曜日と 10月の最終日曜日に実施されましたが、それ以前のバージョンのチ
ップでは、それぞれ異なった日時が使われています。 (また、これは(合衆国
と)違う日付を使っている国では、明らかに機能しません。) さらに、RTC は
(単体のチップではなく) マザーボードのチップセットの中に組み込まれている
場合も多くなっているので、それらすべてがこの能力を持っているかどうか著
者には分かりません。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

2.4. タイムゾーンの設定について

おそらく Linux インストールの際に、読者はタイムゾーンを正しく設定してい
ると思います。しかし、もし何らかの理由でそれを変更しなければならない場
合、もしくは DST に関する自国の法律が変更された場合(こういう法律変更が
頻繁に起こる国もあります)、タイムゾーンを変更する方法を知る必要が生じる
でしょう。システム時間がきっかり数時間ずれているようなときは、タイムゾ
ーン (もしくは、DST) の設定に問題があります。

タイムゾーンや DST の情報は、/usr/share/zoneinfo (もしくは /usr/lib/
zoneinfo) に保存されています。ローカルなタイムゾーンは、/etc/localtime
から上記のファイル群のひとつにシンボリックリンクを張ることで決定されて
います。タイムゾーンを変更するには、そのリンクを張り替えましょう。もし
DST の日付が変わらない場合は、そのファイルを編集する必要があります。

また、環境変数 TZ を使って現在のタイムゾーンを変更することもできます。
これは異なるタイムゾーンにある遠隔マシンにログインしている場合には、便
利な方法です。詳しくは、tzset と tzfile のマニュアルページをご覧くださ
い。

これについては、次のサイトで分かり易く説明されています。 http://
www.linuxsa.org.au/tips/time.html

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

2.5. どの程度の精度が必要か

ミリ秒単位での正確さが不要なら、hwclock(8) と adjtimex(8) だけでおそら
く充分です。タイムサーバや電波時計等に夢中になったとしても無理はありま
せんが、著者は古い clock(8) プログラムだけでここ数年すばらしい結果を得
ています。他方、LAN 上に複数のマシンがある場合は、互いに時計を自動的に
同期させることができれば便利です(あるいは、それが不可欠な場合もありま
す)。それ以外にも、特に必要がなくても使ってみて面白いツール類もあります
。

Linux だけしか走らせないマシンならば、RTC を UTC (もしくは GMT) に設定
しましょう。RTC をローカルタイムに設定する必要のあるデュアルブートシス
テムの場合は、注意すべき点があります。もし夏時間の変更前後に Linux をリ
ブートしなければならないときは、時計が暫定的に一時間ずれてしまうことが
あるということです。その状態は、もう一つの OS を起動するまで続くことに
なります。3 つ以上の OS が載っている場合は、そのうちひとつの OS だけで
DST を調整するよう気を付けてください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

3. ソフトウェア

3.1. clock(8) と hwclock(8)

どのようなディストリビューションでも古い clock(8) か新しい hwclock(8)
のどちらかはインストールされます ( 時間の調整は自分でする必要がありま
す)。adjtimex(8) もインストールされるか、オプションとして CD に同梱され
ているでしょう (adjtimex は通常の Linux アーカイブサイトからダウンロー
ドすることもできます)。ディストリビューションによっては X Window 上でグ
ラフィカルにクロックを設定するプログラムを含んでいたりしますが、それら
はあくまでインタラクティブな使い方をするようになっているので (自動設定
ができないので)、clock(8) や hwclock(8) もインストールされ初期化スクリ
プトで自動設定が出来るようになっています。

clock の場合、時間調整のための数値は手動で計算しなければなりません。他
方 hwclock の場合、そのコマンドを使って RTC をリセットするたびごとに調
整率を自動で計算してくれます (両方を交互に使って RTC を設定すると時間調
整が狂ってしまうので、調整の際は必ずどちらか一方を使うようにしてくださ
い)。もし clock しか入っていない古いシステムを使っていてアップグレード
したい場合は、 hwclock は util-linux パッケージのバージョン 2.7 以降に
含まれています。詳しくはマニュアルページをご覧ください。

    Note: hwclock(8) のマニュアルページは、下位互換性を保つために clock
    のコマンド名で呼び出す設定になっていることがあるので、両方のコマン
    ド名を試してください。hwclock は clock 用のコマンドにも反応はします
    が、その場合処理結果は clock の時とは異なるかもしれません。特に 
    hwclock -a は、clock -a とはかなり異なっています。もし hwclock にア
    ップグレードしているなら、初期化スクリプト内で clock 用コマンドを使
    っている部分はすべて hwclock のネイティブコマンドに差し替えることを
    おすすめします。
   
初期化スクリプトはディストリビューションごとに異なるので、多少調べない
とクロックを設定している場所が見つからないかもしれません。典型的な場所
は /etc/rc.local や /etc/rc.d/rc.sysinit、/etc/rc.d/boot などです。

RTC の時間調整用の数値は、/etc/adjtime に保存されています。Red Hat の場
合 etc/sysconfig/clock にスクリプトがあり、そのスクリプトで hwclock の
オプションを制御しています。

クロックの設定で時計の規則的なズレを調整する場合は、電話での時報が正確
ではない場合があり得ることを念頭に置いてください (訳注：まあ、アメリカ
での話だと思います)。短波ラジオや GPS レシーバを持っていないときは、
(303)499-7111 に電話をして、 WWV から時報を聞くこともできます(これは、
コロラドのボルダーへの長距離電話になります)。3 分で自動的に切れますが、
クロックの設定には充分です。USNO やカナダの CHU も時報サービスをしてい
ますが、著者は WWV のほうがいいと思います。時間のアナウンスと時報音の間
隔が長いからです。他にも ntpd 付属の ntpdate を使ってネットワークタイム
サーバから時刻を得ることもできますし、 www.time.gov <http://
www.time.gov/> には javaclock もあります。

どれを使った場合でも設定するのはシステムクロックであり、RTC ではありま
せん(date コマンドのマニュアルページを見て、どういうフォーマットを使う
のか確認してください)。そして、 hwclock を使用して RTC を設定し、規則的
なズレの割合を計算します。手動でやる場合、1 秒か 2 秒以内の誤差に設定し
て、一週間後におよそのズレの率を確認するようにしてください。そして 
adjtimex を実行し、システムクロックを調整してください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

3.2. Adjtimex(8)

adjtimex コマンドは、カーネルの時間変数の調整ができるので、それによって
システムクロックのスピードを変更するようになっています(実行の際には
root でログインする必要があります)。hwclock は設計が秀逸であり、システ
ムクロックと RTC の時刻を比較する際に /etc/adjtime に保存された、clock
でも hwclock でも使える同一の調整数値を使うようになっています。それゆえ
RTC の規則的ズレを直してしまえば、システムクロックを調整するのも非常に
簡単です。一旦クロックが正しいスピードで動くように出来たなら、初期化ス
クリプトに設定行を追加して起動時にカーネル変数を適切に設定することがで
きます。adjtimex は clock でも hwclock でも使えるように設計されているの
で、前述した「11 分ごと」のバグも回避できるようになっています。

adjtimex のインストールが済んだら、設定に関する詳しい情報を得るには man
8 adjtimex とタイプするか (設定以外の情報に関する adjtimex のマニュアル
ページもあります)、/usr/doc/adjtimex-1.3/README の README ファイルを読
むかしてください (ディレクトリパス上のバージョン番号は、adjtimex の最新
バージョンの番号となります)。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

3.3. xntpd と ntpd - ネットワークタイムプロトコル

xntpd (NTPv3) は、ntpd (NTPv4) に置き換わりました。古いバージョンは現在
メンテナンスの対象外となっています。

ntpd は、ネットワーク越しに時計を同期させる標準的なプログラムであり、プ
ログラムには接続可能なパブリックタイムサーバのリストが付属しています。
設定については本書で述べているようなプログラムよりもやや複雑かもしれま
せんが、この種の事柄に興味があるならまずざっと眺めてみることをおすすめ
します。

ntpd に関する情報は NTP のウェブサイトである http://www.eecis.udel.edu/
~ntp/ に集約されています。またここには、時間に関連する様々な事柄 (他の
OS 用のソフトウェアも含む) へのリンクが掲載されています。ディストリビュ
ーションによっては ntpd が CD に収められている場合もあります。パブリッ
クタイムサーバのリストは、 http://www.eecis.udel.edu/~mills/ntp/
clock2.html をご覧ください。

ntpd の比較的新しい機能に、「バーストモード(burst mode)」があります。こ
れはダイアルアップで時々しかインターネットに接続しないマシン用に設計さ
れた機能です。

ntpd には、電波時計用ドライバも数多く含まれています (ただ、なかにはあま
り性能の良くないのもありますが)。電波時計の大部分は商用として作成されて
いて、数千ドルの値段が付いたりしますが、それにかわる安価な手段も存在し
ます (これについては後ほど解説します)。以前はほとんどが WWV や WWVB レ
シーバでしたが、現在では大部分が GPS レシーバとなっています。NIST のウ
ェブサイトには PDF ファイル形式での電波時計の製造元一覧表があります。 
http://www.boulder.nist.gov/timefreq/links.htm (ページの末尾です)。また
NTP ウェブサイトにも電波時計の製造会社へのリンクが多数掲載されています
。 http://www.eecis.udel.edu/~ntp/hardware.htm および http://
www.eecis.udel.edu/~mills/ntp/refclock.htm。どちらのリストも、随時更新
されたりされなかったりのようです :-)　 ntpd のドライバは、 http://
www.eecis.udel.edu/~ntp/ntp_spool/html/refclock.htm にあります。

ntpd には、ダイアルアップ用のタイムサービスについてのドライバも含まれて
います。これらはすべて長距離電話を使うので、プログラムを使う前に電話料
金がどれくらいになるか計算するのを忘れないでください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

3.4. chrony プログラム

xntpd はもともとネットワークタイムサーバか電波時計に常時接続できるマシ
ン用に作られていました。理論的には時々しか接続しないマシンでも使えるの
ですが、Richard Curnow は思い通りの方法で xntpd を動かすことができなか
ったため、chrony というプログラムを作成し、ISP にダイアルアップで接続す
るときしかネットワークにアクセスしないユーザ向けに別の手段を提供してく
れました (これは ntpd が新機能である burst mode で解決しようとしたのと
同じ問題です)。chrony の現在のバージョンには、長時間電源をオフにするマ
シン用に RTC の規則的ズレを解消する機能も含まれています。 

詳しい情報は Richard Curnow のウェブサイト http://
www.rrbcurnow.freeuk.com/chrony や http://go.to/chrony をご覧下さい。
chrony には二つのメーリングリストがあり、ひとつはアナウンス用、もうひと
つはユーザによる議論の場となっています。詳しくは
<hrony-users-subscribe@egroups.com> か
<chrony-announce-subscribe@egroups.com> にメールを送信してください。

chrony は通常ソースコードのみの配布となっていますが、 Debian では、
unstable のなかにバイナリ版が含まれています。ソースファイルについても、
著名な Linux アーカイブサイトで入手できます。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

3.5. clockspeed プログラム

それ以外の選択肢として、DJ Bernstein による clockspeed というプログラム
があります。これはネットワークタイムサーバから時間を取得して、3 秒ごと
にシステムクロックを再設定するという単純な方法を使うものです。また LAN
上にあるいくつかのマシンを同期させるために使うこともできます。

彼のウェブサイト http://Cr.yp.to/clockspeed.html はときどきトラブルがあ
るようです。もし DNS エラーが出るようなら、再度翌日にアクセスしてみてく
ださい。この部分については詳しい情報が入り次第、更新します。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

4. 電波時計

4.1. CHU と「Gadget Box」

CHU とは、オタワ近郊にあるカナダ短波時報局 (Canadian shortwave time
station) のことであり、合衆国の WWV に類似した組織ですが、両者にはひと
つだけ重要な違いがあります。CHU は英語とフランス語で時報を提供するだけ
でなく、古い "Bell 103" (300 baud) モデムトーンを使って一分間隔で時報を
放送しているという点です。このトーンはデコードが非常に容易であるため、
Bill Rossi はモデム(デコーダ)を使うまでもなく、短波ラジオとサウンドカー
ドで解析できることを発見しました。CHU からの信号を受信できるなら、これ
は最も安上がりな電波時計として使えます。短波の受信状況は一日のうちに何
度か変化しますが、Bill によると、日に二回 (朝と夕方) 周波数を変えればほ
ぼ 24 時間受信できるそうです。CHU の放送は 3.33, 7.335, および 14.670
MHz です。

詳細は Bill Rossi のウェブサイト http://www.rossi.com/chu/ をご覧くださ
い。ソースファイルは著名なアーカイブサイトからも入手できます。 CHU の時
報サービスについては、 http://www.nrc.ca/inms/time/ctse.html を見て下さ
い。

「Gadget Box」というプランが NTP ウェブサイトにあります。これは安価な
300 baud のモデムと適当な短波ラジオを使って CHU の時報をデコードすると
いうものです http://www.eecis.udel.edu/~ntp/ntp_spool/html/gadget.htm。
このプランでは専用の両面プリント基盤に関する PostScript 図を掲載してい
ますが、基盤自体は自分で作らなければなりません (もしくは、作ってくれる
人を探す必要があります)。

ntpd には CHU レシーバ用のドライバ (type 7) が含まれています。これは「
Gadget Box」のようなモデムを使うか、もしくは Sun SPARCstation (あるいは
その互換オーディオドライバを持ったマシン) のマイク入力に直接音声を入力
することで動くようになっています。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

4.2. WWV と「Most Accurate Clock」

Heathkit 社の「Most Accurate Clock」というのを聞いたことがある方もいる
でしょう。これは WWV の時報を受信してデコードし、オプションのシリアルポ
ートを使ってコンピュータに接続するというものです。Heathkit は随分まえに
このキットの販売を止めてしまいましたが、1995年まではこの時計の完成品版
の販売を続けていました (現在は販売していません)。(時計以外の製品を含め
た) Heathkit 社へのノスタルジアを書いたページが http://
www.heathkit-museum.com にあります。Heathkit 社自体は今も健在であり、学
習用の教材を販売しています。詳しくは http://www.heathkit.com をご覧くだ
さい。

Dave Mills によると、Heathkit 社の「Most Accurate Clock」に関する特許は
もうすぐ期限切れになるので、もしかするとそのクローンをシングルチップ IC
として売り出す会社が出てくるかもしれないそうです。

NTP ウェブサイトには DSP プログラム (およびそれを解説した PDF ファイル)
があります http://www.eecis.udel.edu/~mills/resource.htm。これは短波ラ
ジオと TAPR/AMSAT DSP-93 という (現在では販売していない) DSP キットを使
って WWV 時報をデコードするものです。このキットは Texas Instruments の
TMS320C25 DSP チップをベースにしたものです。TAPR のウェブサイト http://
www.tapr.org には自社開発の DSP プログラムに関する情報が豊富にあります
。

ntpd パッケージには IRIG-B と IRIG-E タイムコードのドライバ (type 6) も
含まれています。これは Sun SPARCstation の /dev/audio を利用するもので
すが、それ以外のシステムにも移植が可能だそうです。 WWV では IRIG-H タイ
ムコードが使われています。

WWV は NIST により運営されており、ウェブサイトは http://
www.boulder.nist.gov/timefreq/index.html です。このサイトには "Special
Publication 432" という文書があり、これには時間と周波数についての記述が
あります。 http://www.boulder.nist.gov/timefreq/pubs/sp432/sp432.htm.
WWV は 2.5, 5, 10, 15, 20 MHz で放送しています。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

4.3. GPS と「Totally Accurate Clock」

GPS 信号には正確な時間も含まれていて、GPS レシーバのなかにはシリアルポ
ートを備えたものがあります。ntpd には各種 GPS レシーバ用のドライバが同
梱されています。1PPS 機能 ("One Pulse Per Second", これはかなり高精度を
要する場合に使われるものです) は、通常特別なインターフェイスを使ってコ
ンピュータに繋ぐ必要があります。

TAPR (Tuscon Amateur Packet Radio) には TAC-2 ("Totally Accurate Clock"
の略) というインターフェイス用のキットがあります。これはシリアルポート
に差し込んで GPS レシーバと繋ぐためのインターフェイスであり、1PPS の出
力をもつ GPS レシーバならどんなものでも使えます。またこれには回路基盤に
直接載せることができるベアボードモデル (bare board model) もあります。
詳しくは http://www.tapr.org/ のウェブサイトをご覧ください。(1999年6月
時点での) 値段は、GPS レシーバ抜きで 140 ドル前後です。このキットには筐
体や回路基盤取り付け用の部品は含まれていません。

(別の章で述べた) CHU 「Gadget Box」も 1PPS 信号のインターフェイスとして
使うことができます。NTP ウェブサイトにはこれに関する説明が記載されてい
ます http://www.eecis.udel.edu/~ntp/ntp_spool/html/pps.htm。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

4.4. 長波タイムシグナル： DCF77, MSF(Rugby), WWVB

長波放送局では、キャリアのオン・オフ切り替えによってタイムシグナルを放
送しています。放送局ごとに独自のコード方式を使っており、その概要は NTP
ウェブサイトに掲載されています。http://www.eecis.udel.edu/~mills/ntp/
index.htm (このページの最後のほうです)。ドイツの DCF77 では 77.5kHz、イ
ギリスの MSF (ここは所在地にちなんで "Rugby" とも呼ばれています) とコロ
ラドの WWVB はどちらも 60 kHz で放送されています。

WWVB の受信感度は一定していませんが、放送出力を段階的に上げようという計
画があります。その進捗状況については NIST のウェブサイトをご覧ください 
http://www.boulder.nist.gov/timefreq/wwvstatus.html 。

シリアルポートに接続できる安価なレシーバがヨーロッパで入手可能だそうで
す。 ntpd にはいくつかの MSF レシーバ用のドライバが含まれています。

合衆国の多くの会社が WWVB レシーバを組み込んだ比較的安価な時計を販売し
ています (これには壁掛け用の時計もいくつか含まれています)。しかし、著者
の知る限り、コンピュータに接続できるのは 2 機種しかありません。

Ultralink Model 320 という時計は (1999年6月時点で) 120 ドル程度ですが、
これはシリアルインターフェイスと ASCII 文字によるコマンドセットが使える
ようになっています。それゆえ、プログラムを作るのはそれほど難しくないは
ずです。これはシリアルポートから 1 mA の電源を取ります。アンテナはコン
ピュータから 100 フィートまで離すことができ、シグナルが得られない場合に
備えて組み込みの内蔵クロックで時間を測定し続けることができます。
Ultralink ではベアボーン版も 80 ドル程度で販売しています。これは "BASIC
Stamp" シリーズのマイクロコントローラで動くように設計されています。詳し
くは次のウェブページをご覧ください。 http://www.ulio.com/timepr.html.

Arcron Technology は、シリアルポートをオプション装備した卓上時計を約 80
ドルで販売しています。これには Windows 用のソフトウェアも含まれています
。詳しくは次のウェブページをご覧ください。 http://www.arctime.com.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

5. 日本語訳について

誤訳・誤字・脱字については、<JF@linux.or.jp> までお願いします。

翻                                (1997
訳 吉川雅英                       /01) 
：                                     
更                                (2001
新 千旦裕司                       /10/ 
：                                06)  
校                                     
正 高城正平                            
：                                     
   小林雅典                            

Notes

[1] 訳注：コンピュータのクロックがどの程度正確かを教えてくれる、通信情 
    報研究所のページ http://www2.crl.go.jp/pub/jst/index-J.htmlがありま
    す。                                                               

