other versions
other sections
HWCLOCK(8) | System Manager's Manual | HWCLOCK(8) |
名前¶
hwclock - ハードウェア・クロック (RTC) の読み取りと設定を行う書式¶
hwclock -r or hwclock --show説明¶
hwclock はハードウェア・クロックにアクセスするためのツールである。 現在の時刻の表示、指定した時刻へのハードウェア・クロックの設定、 ハードウェア・クロックをシステム時刻に合わせる (およびその逆)、 といった機能を持つ。 hwclock を定期的に実行し、ハードウェア・クロックの時間を増減して、 時計の規則的なずれ (systematic drift) を補償することもできる (systematic drift とは、クロックが放っておかれたとき、 経過時間に比例して時刻がずれる現象のこと)。オプション¶
以下のオプションは hwclock にどの機能を実行するかを伝えるもので、必ず一つだけを指定する。- --show
- ハードウェア・クロックを読んで時刻を標準出力に表示する。
ここで表示される時刻は常にローカル・タイムである。
ハードウェア・クロックを協定世界時にしていても表示はローカル・タイムである。
--utc
オプションの部分を参照すること。
- --set
- ハードウェア・クロックを --date オプションによって指定した時刻に設定する。
- --hctosys
- システム・クロックをハードウェア・クロックに合わせる。
- --systohc
- ハードウェア・クロックを現在のシステム・クロックに合わせる。
- --adjust
- 最後にハードウェア・クロックを合わせた時点からの経過時間に対して生じる、 時計の規則的なずれを補償するために、 一定の時間をハードウェア・クロックの時刻から増減する。 詳細は以下の議論を参照のこと。
- --getepoch
- 標準出力に、カーネルが保持しているハードウェア・クロックの紀元年
(epoch value) を表示する。
これは西暦の何年が、ハードウェア・クロックの
0
年として参照されるかを示す数値である。
例えば、ハードウェアクロックの年カウンタに
1952
年以降の経過年数を用いている場合には、
カーネルでのハードウェア・クロック紀元年は
1952
でなければならない。
- --setepoch
- カーネルのハードウェア・クロック紀元年の値を --epoch オプションで指定した値に設定する。 詳細は --getepoch オプションの説明を見よ。
- --version
- hwclock のバージョンを標準出力に表示する。
- --date=date_string
- --set
オプションを指定した場合は、このオプションも指定しなければならない。
--set
オプションが指定されていなければ、このオプションは無視される。
ハードウェア・クロックを合わせる時刻を指定する。
このオプションに与える値は
date(1)
プログラムの引数と同じである。例えば以下のようにする。
- --epoch=year
- ハードウェア・クロックの紀元年を指定する。
すなわち西暦年のいつが、
ハードウェア・クロックの年カウンタの
0
に対応するかを指定する。
このオプションは、--setepoch
オプションとともに使った場合、
カーネルの概念であるハードウェア・クロックの紀元年を設定する。
--setepoch
オプションとともに使わない場合は、
直接 ISA
アクセスに用いられる紀元年を指定する。
- --utc
- --localtime
- ハードウェア・クロックを協定世界時
(Universal Coordinated Time: UTC) と
ローカルタイムのどちらにするか
(しているか)
を指定する。 UTC
にするかローカルタイムにするかはユーザの選択しだいだが、
時計の内部にはどちらを選択したかを記録する場所はない。
したがって、ユーザーはこのオプションで自分の選択を
hwclock
に伝えなければならない。
- --noadjfile
- /etc/adjtime
によって提供される機能を無効にする。
このオプションを使うと、
hwclock は /etc/adjtime
の読み込みも書き込みもしない。
このオプションを使うときは、
--utc または --localtime
を指定しなければならない。
- --directisa
- このオプションは、ISA
マシンまたは (hwclock
から充分 ISA
マシンに見える程度
ISA の仕様を実装した)
Alpha
マシンでのみ意味を持つ。
他のマシンでは効果がない。
このオプションは
hwclock
に指令して、ハードウェア・クロックへのアクセスに
直接 I/O
命令を用いるようにさせる。このオプションを指定しないと、
hwclock は /dev/rtc
デバイスを用いようとする
(/dev/rtc が rtc
デバイスドライバ
で駆動されていることを仮定する)。デバイスを読み込みオープンできない場
合は、いずれにせよ直接
I/O 命令を用いる。
- --badyear
- ハードウェア・クロックが、1994-1999
年の外側の年を保持できないことを示す。
ある種の BIOS
には問題があり (4/26/94
から 5/31/95
の間に生産されたほとんどの
Award BIOS がそうである)、 1999
年以降の年を扱うことができないのである。世紀内の年の部分を
94 未満
(場合によっては 95
未満)
に設定しようとすると、
実際には 94 (または 95)
が設定されてしまう。
このようなマシンでは、
hwclock は年を 1999
以降に設定できず、またクロックの値を
通常のように正しい値としては用いることができない。
- --srm
- このオプションは --epoch=1900 と等しく、 SRM コンソールの Alpha で最も一般的な紀元年を指定するのに使われる。
- --arc
- このオプションは --epoch=1980 と等しく、 ARC コンソールの Alpha で最も一般的な紀元年を指定するのに使われる (ただし Ruffians では 1900 を紀元年にしている)。
- --jensen
- --funky-toy
- これら 2
つのオプションは、
使っている Alpha
マシンがどのような種類のものであるか指定する。
Alpha
以外では無効だし、Alpha
でも
実際には指定しなくても良いだろう。
hwclock
は自分が動作しているマシンの種類を自分で決定できるはずである
(最低でも /proc
がマウントされていれば)。
(hwclock
が正しく動作しないことがわかった場合には、
メンテナに連絡して、あなたのシステムを自動検知できるように
プログラムを改良できないか相談してみてほしい。
`hwclock --debug' と `cat /proc/cpuinfo'
の出力が役立つかもしれない。)
- --test
- 実際のハードウェア・クロックの更新 (およびそれに類する) 作業をのぞき、 すべての動作を行う。 このオプションは --debug と組み合わせると hwclock の動作を理解する上で有用であろう。
- --debug
- hwclock
が内部で行っている動作に関して大量の情報を表示する。
一部の機能は複雑であるが、この出力はプログラムの動作を
理解する上で助けになるだろう。
注意¶
Linux システムにおける時計¶
Linux システムには主要な時計が 2 つ存在する。 ハードウェア・クロック: これは CPU 内部で動作しているすべてのコントロールプログラムから 独立しており、マシンの電源が OFF のときにも動作している。hwclock がハードウェア・クロックへアクセスする方法¶
hwclock はハードウェア・クロック時刻の取得や設定に、いろいろな方法を用いる。 もっとも普通のやり方は、デバイススペシャルファイル /dev/rtc に対して I/O を行う方法である。 しかしこの方法が常に利用できるとは限らない。 そもそも rtc ドライバが Linux へ追加されたのは比較的最近のことである。 古いシステムには存在しない。 DEC Alpha で動作する rtc ドライバもあるが、 このドライバが使えない Alpha マシンもたくさんあるようである (症状としては hwclock がハングする)。 古いシステムでは、ハードウェア・クロックへのアクセス方法は システムのハードウェアに依存している。 ISA システムでは、 hwclock は時計を構成していた「CMOS メモリ」のレジスタに直接アクセスすることができた (ポート 0x70 と 0x71 に I/O を行う)。 これを行うには hwclock の実効ユーザー ID がスーパーユーザーでなければならない。 (Jensen Alpha の場合は、このような I/O 命令を hwclock に実行させることはできない。 したがってこの場合はデバイススペシャルファイル /dev/port が用いられる。 これは I/O サブシステムへの低レベルインターフェースの ほとんどを与えるものである。)時刻合わせ機能¶
通常ハードウェア・クロックはそれほど正確なものではない。 しかし、その「不正確さ」は完全に予測できるものである。 すなわち、時計は一日あたり同じ時間だけ進む(あるいは遅れる)のである。 これを規則的なずれ (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 ファイルに書き込む。 (--set または --systohc を用いて) 時計を合わせるごとに、 hwclock は規則的なずれを再計算する。 このときには、最後に時計合せが行われた時点からの経過、 途中で行われた補正で用いられていたずれの量、 最後に補正を行った時刻からの経過時間などが参照される。 hwclock が時計を設定するときには、常に小さなずれが生じる可能性がある。 これが 1 秒に満たない場合には、時計の補正量からは切り捨てられる。 後に再び補正を行う際に、このずれが蓄積して 1 秒を越えていれば、 その分はその時に補正される。 システムの起動時に (あるいはシステムの動作中に cron で定期的に) hwclock --hctosys を行う時には、常にその前に hwclock --adjust を行うと良いだろう。 adjtime ファイルは、当初は修正量 (adjustments) だけを目的と していたためにこの名前がつけられたが、現在では他の情報も書き込まれており、 hwclock が一度起動され、次に起動されるまでにその情報を保持する。 adjtime は ASCII ファイルであり、フォーマットは以下の通り: 一行目は三つの数値からなり、それぞれ空白で区切られる: 1) 一日あたりに生じる時刻ずれを秒で表したもの (浮動小数点型 10 進): 2) 最後に時計合わせあるいは補正を行った時刻を 1969 UTC からの経過秒数で表したもの (10 進整数): 3) ゼロ (clock(8) との互換性のためのもの) 二行目: 数値が一つ: 最後に時計を合わせた時刻を 1969 UTC からの経過秒数で表したもの。 時計合わせが一度もされていなかったり、以前の時計あわせに問題があった (例えばその時計あわせ以降にハードウェア・クロックの 時刻が不正なことがわかったとか) 場合には 0 が入る。 これは 10 進の整数である。 三行目: "UTC" または "LOCAL"。ハードウェア・クロックが 協定世界時かローカルタイム化を示す。 この値は hwclock にコマンドラインを指定すればいつでも上書き可能である。 以前 clock(8) で使っていた adjtime ファイルは hwclock でもそのまま使うことができる。カーネルによるハードウェアクロックの自動合わせ¶
ハードウェアクロックを正しい値に同期させるのに、 別法が取れるようなシステムもある。 Linux カーネルには、11 分ごとにシステムクロックを ハードウェアクロックにコピーするようなモードが存在する。 これは、何らかの洗練された方法 (ntp など) でシステムクロックを 同期できている時には、よいモードであろう。 (ntp とは、ネットワークのどこかにあるタイムサーバーか、システムに付属した 電波時計にシステム・クロックを同期させる手法である。RFC 1305 を見よ。)ISA ハードウェア・クロックの「世紀値 (Century value)」¶
その手の標準の中には、ISA マシンの CMOS 50 バイト目を、 現在の世紀の指標として定義しているものがある。 hwclock は、このバイトの読み書きを行わない。 なぜならこのバイトをそのようには利用していないマシンが存在するし、 いずれにしてもこれは実際には必要ないからである。 年の世紀の部分を使えば、現在の世紀を特定するには充分である。環境変数¶
TZファイル¶
/etc/adjtime /usr/share/zoneinfo/ (古いシステムでは /usr/lib/zoneinfo) /dev/rtc /dev/port /dev/tty1 /proc/cpuinfo関連項目¶
adjtimex(8), date(1), gettimeofday(2), settimeofday(2), crontab(1), tzset(3)著者¶
hwclock は 1996 年 9 月に Bryan Henderson (bryanh@giraffe-data.com) が clock をもとに書いた。 clock は Charles Hendrick, Rob Hooft, Haraid Koenig によって書かれた。 完全な履歴と謝辞はソースに書かれている。02 March 1998 |