CLOCK(8)

名前
hwclock - ISA ハードウェア・クロック (RTC) の読み取りと設定を行う

書式
hwclock --show
hwclock --set --date=newdate
hwclock --systohc
hwclock --hctosys
hwclock --getepoch
hwclock --setepoch --epoch=year
hwclock --adjust
hwclock --version

その他のオプション:

--utc --directisa --test --debug

すべてのオプションは他と区別がつく範囲において短縮することができる

また同じ機能を持つオプションとして -r, -w, -s, -a, -v, -u, -D を指定することもできる。これは "clock" プログラムとの互換性のため に用意されたものである。

説明
hwclock はハードウェア・クロックにアクセスするためのツー ルである。現在の時刻 の表示、指定した時刻へのハードウェア・クロックの設定、ハードウェア・ク ロックをシステム時刻に合わせる (およびその逆)、といった機能を持つ。

また hwclock を定期的に実行し、ハードウェア・クロックの時間を増減して、時計の規則的 なずれ (systematic drift: 放っておかれたときに、経過時間に比例して時刻 がずれる現象) を補償することもできる。

オプション
以下のオプションは hwclock にどの機能を実行するかを伝えるもので、必ず一つだけを指定する。

--show
    ハードウェア・クロックを読んで時刻を標準出力に表示する。

--set
    ハードウェア・クロックを --date オプションによって指定した時刻に設定する。

--hctosys
    システム・クロックをハードウェア・クロックに合わせる。このオプションは システムの起動スクリプトで用いると良いだろう。

--systohc
    ハードウェア・クロックを現在のシステム・クロックに合わせる。

--adjust
    最後にハードウェア・クロックを合わせた時点からの経過時間に対して生じ る、時計の規則的なずれを補償するために、一定の時間をハードウェア・クロッ クの時刻から増減する。詳細は以下の議論を参照のこと。

--getepoch
    標準出力に、カーネルが保持しているハードウェア・クロックの起源年 (epoch value) を表示する。これは西暦の何年が、ハードウェア・クロックの 0 年として参照されるかを示す数値である。例えば、ハードウェアクロックの 年カウンタに 1952 年以降の経過年数を用いている場合には、カーネルでのハー ドウェア・クロック起源年は 1952 でなければならない。
    この起源年の値は hwclock がハードウェア・クロックを読み書きするとき、 常に用いられる。

--setepoch
    カーネルのハードウェア・クロック起源年の値を --epoch オプションで指定した値に設定する。詳細は --getepoch オプションの説明を見よ。

--version
    hwclock のバージョンを標準出力に表示する。

--set オプションを指定した場合は次のオプションも指定しなければ ならない( --set オプションが指定されていなければ無視される)。

--date=date_string
    ハードウェア・クロックを合わせる時刻を指定する。このオプションに与える 値は date(1) プログラムの引数と同じである。例えば以下のようにする。

    hwclock --set --date="9/22/96 16:45:05"

--setepoch オプションを指定した場合は次のオプションも指定しなければならない。

--epoch=year
    ハードウェア・クロックの起源年を指定する。すなわち西暦年のいつが、ハー ドウェア・クロックの年カウンタの 0 に対応するかを指定する。 例えば以下のようにする。

    hwclock --setepoch --epoch=1952

次のオプションはほとんどの機能と同時に用いることができる。

--utc
    このオプションを指定すると、ハードウェア・クロックは協定世界時 (Universal Coordinated Time: UTC) に合わされていることになる。時計を UTC にするか地方時 (Local Time) にするかは自由であるが、時計の内部には どちらを選択したかを記録する場所はない。したがって、ユーザーはこのオプ ションで自分の選択を hwclock に伝える必要がある。 設定や問い合わせの際、 --utc を指定すべき場合にしなかったり、またその逆をすると、 ハードウェア・クロックはめちゃめちゃになってしまうかも知れない。

--directisa
    これは ISA マシンでのみ意味を持つ。他のマシンでは効果がない。このオプ ションは hwclock に指令して、ハードウェア・クロックへのアクセスに陽な (explicit な) I/O 命令を用いるようにさせる。このオプションを指定しないと、 hwclock は /dev/rtc デバイスを用いようとする (/dev/rtc が rtc デバイスドライバ で駆動されていることを仮定する)。デバイスを読み込みオープンできない場 合は、いずれにせよ陽な I/O 命令を用いる。 rtc デバイスドライバは Linux リリース 2 から現れた。

--test
    実際のハードウェア・クロックの更新 (およびそれに類する) 作業をのぞき、 すべての動作を行う。このオプションは --debug と組み合わせると hwclock の動作を理解する上で有用であろう。

--debug
    hwclock が内部で行っている動作に関して大量の情報を表示する。 一部の機能は複雑であるが、この出力はプログラムの動作を 理解する上で助けになるだろう。

参考情報

Linux システムにおける時計

Linux システムには２つの主要な時計が存在する。

ハードウェア・クロック: これは CPU 内部で動作しているすべてのコントロールプログラムから独立し ており、マシンの電源が OFF のときにも動作している。 ISA システムでは、このクロックは ISA 規格の一部として定義されている。 コントロールプログラムはこの 時計に対して 1 秒単位で読み書きできるが、秒針の変化を検出することもで きるので、実際には仮想的に無限大の精度を持っていることになる。

この時計は一般にハードウェア・クロック、リアルタイム・クロック、 RTC、 BIOS クロック、 CMOS クロックなどと呼ばれる。 hwclock では「ハードウェア・クロック (原文では Hardware Clock)」を用いる。他の 名前は不正確だったり誤解のもとになるからである。

システム・クロック: これは Linux カーネルの内部に存在している時計で、タイマー割り込みによっ て駆動されている (ISA システムでは、タイマー割り込みは ISA 標準の一部 である)。すなわち Linux が起動している間しか動作しない。システム時刻は UTC 1970/01/01 00:00:00 からの経過秒数である (より簡単に言えば 1969 年 以後の経過秒数である)。しかしシステム時刻は整数ではなく、仮想的に無限 大の精度を持っている。

Linux ではシステム・クロックがすべての基準となる時計である。 ハードウェア・クロックの基本的な役割は、システムが動いていない間にも 時計を動かしつづけることである。 Linux システムは起動時に一度だけハードウェア・クロックを参照し、システ ム・クロックを設定する。その後はハードウェア・クロックは用いない。 ISA システムの設計対象であったDOS においては、ハードウェア・クロックがただ 一つの実時間時計であることに注意すること。

システム・クロックには不連続が存在してはならない。これはシステムが走っ ている間に date(1L) プログラムを実行して時計を合わせるような場合でも同様である。一方ハード ウェア・クロックには、システムの実行中にでも何を行ってもよい。次回 Linux が起動したときに、ハードウェア・クロックからこの調整された時間が 使用される。 システムが走っている間にシステム・クロックをスムースに修正するには adjtimex(8) を用いることもできる。

hwclock におけるハードウェア・クロックへのアクセス方法

hwclock はハードウェア・クロック時刻の取得や設定に、いろいろな方法を用いている。 もっとも通常の方法は、デバイススペシャルファイル /dev/rtc に対して I/O を行うやり方である。しかしこの方法が常に利用できるとは限らない。そ もそも rtc ドライバが Linux へ追加されたのは比較的最近のことである。古 いシステムには存在しない。

古いシステムでは、ハードウェア・クロックへのアクセス方法はシステムのハー ドウェアに依存している。

ISA システムでは、 hwclock は時計を構成していた「CMOS メモリ」のレジスタに直接アクセスすることが できた (ポート 0x70 と 0x71 に I/O を行う)。これを行うには hwclock の実効ユーザー ID がスーパーユーザーでなければならない。 これは時計にアクセスする方法としては実に情けない方法である。ユーザー空 間のプログラムでは、このように直接 I/O を叩いたり、割り込みを禁止し たりすることは通常想定されていないのだから。 hwclock でこれが使えるように してあるのは、古い Linux カーネルで ISA マシンを使う場合には、これが唯 一の方法だからである。

m68k システムでは、 hwclock はコンソールドライバとデバイススペシャルファイル /dev/tty1 を通して時 計にアクセスすることができる。

Alpha マシンでは、 /dev/rtc が唯一の方法である。 /dev/rtc を持たない Alpha Linux システム、 /dev/port を用いた 直接 I/O に近いやり方でクロックにアクセスするプログラムも存在する (あ るいは存在していた)。しかしながら、これは /dev/rtc を使うのに比べて良 い方法とは言えないし、このようなプログラムはそれほど広く用いられていな いので、 hwclock でこのような物との過去互換性を取るのはやめにした。し たがって hwclock は /dev/port を用いる方法はサポートせず、したがって /dev/rtc のない Alpha システムでは動作しない。

hwclock は /dev/rtc を用いようとする。 /dev/rtc を持たないカーネル向けにコンパ イルされた場合や、 /dev/rtc をオープンできない場合には、 hwclock は他の方法をしかたなく用いる異になる (もちろん可能なら、だが)。 ISA マ シンでは --directisa オプションを指定することにより、 hwclock に CMOS レジスタの直接操作を利用するように強制することもできる。この場 合は /dev/rtc は最初から無視する。

時刻合わせ機能

通常ハードウェア・クロックはそれほど正確なものではない。しかし、その 「不正確さ」は完全に予測できるものである。すなわち、時計は一日あたり同 じ時間だけ進む（あるいは遅れる）のである。これを規則的なずれ (systematic drift) と呼ぶことにする。 hwclock の時刻合わせの機能は、この規則的なずれに対応する補正量を求め、適用する ものである。

以下に動作原理を述べる。 hwclock は /etc/adjtime というファイルを管理し、そこに履歴情報を保管する。 このファイルを adjtime ファイルと呼ぶ。

adjtime ファイルがない状態から話をはじめる。 hwclock --set コマンドを用いてハードウェア・クロックを現在の正しい値に合わせたとする。 このとき hwclock は adjtime ファイルを作成し、そこに現在の時刻を「最後に時計合わせ (calibration) が行われた時刻」として記録する。 五日後に時計は 10 秒進んだとし、それを修正するために再び hwclock --set が実行されたとする。 hwclock は adjtime ファイルを更新し、現在の時刻を最後に時計合わせが行われた 時刻として、また 2 秒/日という値を規則的なずれの値として記録する。 24 時間が経過したときに hwclock --adjust コマンドを実行すると、 hwclock は adjtime ファイルを参照し、放っておかれた時計は一日に 2 秒進むこと、 時計はちょうど一日だけ放置されていたことを読みとる。そこで hwclock はハードウェア・クロックから 2 秒を差し引き、現在の時刻を時計の補正 (adjustment) が行われた時刻として記録する。さらに 24 時間が経過したと きに hwclock --adjust を実行すれば、 hwclock はまた同じことを行う。つまり 2 秒を差し引き、現在の時刻を adjtime ファイルに書き込む。

時計を合わせるごとに、 hwclock は規則的なずれを再計算する。このときには、最後に時計合せが行われた 時点からの経過、途中で行われた補正で用いられていたずれの量、 最後に補正を行った時刻からの経過時間などが参照される。

hwclock が時計を設定するときには、常に小さなずれが生じる可能性があ る。これが 1 秒に満たない場合には、時計の補正量からは切り捨てられる。 後に再び補正を行う際に、このずれが蓄積して 1 秒を越えていれば、その分 はその時に補正される。

システムの起動時に (あるいはシステムの動作中に cron で定期的に) hwclock --hctosys を行う時には、常にその前に hwclock --adujst を行うと良いだろう。

adjtime ファイルのフォーマットは以下の通り:

一行目は三つの数値からなる: 1) 一日あたりに生じる時刻ずれを秒で表したも の (浮動小数点型 10 進): 2) 最後に時計合わせあるいは補正を行った時刻を 1969 UTC からの経過秒数で表したもの (10 進整数): 3) ゼロ ( clock との互換性のためのもの)

二行目: 数が一つ: 最後に時計を合わせた時刻を 1969 UTC からの経過秒数で 表したもの。

以前 clock で使っていた adjtime ファイルは hwclock でもそのまま使うことができる。

ファイル
/etc/adjtime

関連項目
adjtimex(8), date(1), gettimeofday(2), settimeofday(2), crontab(1)

著者
hwclock は 1996 年 9 月に Bryan Henderson (bryanh@giraffe-data.com) が clock をもとに書いた。 clock は Charles Hendrick, Rob Hooft, Haraid Koenig によって書かれた。 完全な履歴と謝辞はソースに書かれている。