Provided by: manpages-ja_0.5.0.0.20100315-1_all bug

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

      :                    これは                   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) を用いることもでい襦

       Linux
       カーネルは、システムのローカルなタイムゾーンという概念を持っている。
       しかし注意してほしい                                                 --
       「カーネルが自分をどのタイムゾーンにいると思っているか」など、
       誰も気にしていないのである。代わりに、タイムゾーンに関るプログラム
       (おそらくローカルな時間を表示しようとしているもの)                 は、
       ほぼ間違いなく従来用いられてい進法でタイムゾーンを決定する。 つまり TZ
       環曲竸瑤       /usr/share/zoneinfo      ディレクトリを、      tzset(3)
       で説明されているようなやり方で参照するのである。
       しかしカーネルのタイムゾーンの値を見るプログラムも存在するし、
       カーネルの周辺部分  (ファイルシステムなど)  もこちらを参照する。   vfat
       ファイルシステムなどがそうである。カーネルのタイムゾーンの
       値が間違っていると、vfat   ファイルシステムはファイルのタイムスタンプの
       設定・取得を間違ってしまう。

       hwclock--hctosys  オプションでシステム・クロックをセットするとぁ
       カーネルのタイムゾーンも TZ や /usr/share/zoneinfo の値に設定する。

       タイムゾーンの値は実際には  2  つの部分からなる。   1)   tz_minuteswest
       フィールド:        (DST        でない)       ローカルタイムが       UTC
       から何分遅れているかを表す。 2) tz_dsttime: 夏時間 (DST) の形式を表し、
       現在地の現在時刻に影響する。    この    2    番目のフィールドは   Linux
       では用いられず、常に 0 となる。 (settimeofday(2) も参照のこと。)

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          サブシステムへの低レベルインターフェースの
       ほとんどを与えるものである。)

       これは時計にアクセスする方法としては実に情けない方法である。
       ユーザー空間のプログラムでは、このように直接      I/O      を叩いたり、
       割り込みを禁止したりすることは通常想定されていないのだから。    hwclock
       でこれが使えるようにしてあるのは、   古い    Linux    カーネルで    ISA
       マシンを使う場合には、 これが唯一の方法だからである。

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

       hwclock  は /dev/rtc を用いようとする。この機能を持たないカーネル向けに
       コンパイルされていたり、/dev/rtc  をオープンでい覆ぞ豺腓砲蓮   hwclock
       は他の方法を  (可能であれば) 試そうとする。 ISA や Alpha のマシンでは、
       /dev/rtc       を試さずに、最初から       hwclock        に        CMOS
       レジスタを直接操作するように強制することもでい襦  これには --directisa
       オプションを指定する。

能
       通常ハードウェア・クロックはそれほど正確なものではない。
       しかし、その「不正確さ」は完全に予測でい襪發里任△襦
       すなわち、時計は一日あたり同じ時間だけ進む(あるいは遅れる)のである。
       これを規則的なずれ   (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 を見よ。)

       このモード  (「11  分モード」と呼ぶ)  は、何かによって邑にされるまでは
       オフになっている。 例えば ntp デーモンである  xntpd  は  このモードを-
       効にでい襪發里里劼箸弔任△襦
       オフにするのも何かを実行すればよく、例えば      hwclock       --hctosys
       を実行して、システム・クロックを古い方法で設定すれば、11
       分モードはオフになる。

       モードがオンかオフかを調べるには、 adjtimex --print  コマンドを実行して
       "status"  の値を見ればよい。  この数値の第 64 ビットが (2 進数表示で) 0
       ならば、 11 分モードはオンになっている。 それ以外の場合はオフである。

       システムが 11 分モードで動作している場合に hwclock --adjusthwclock
       --hctosys  を実行してはならない。システムをおかしくしてしまう。 hwclock
       --hctosys                          を起動時だけに用いるならかまわない。
       これを用いれば、システム・クロックが外部の値に同期して               11
       分モードが開始されるまで、システムクロックを妥当な値にでい襦

ISA (Century value)hwclock
       は、このバイトの読み書い鮃圓錣覆ぁ
       なぜならこのバイトをそのようには利用していないマシンが存在するし、
       いずれにしてもこれは実際には必要ないからである。
       年の世紀の部分を使えば、現在の世紀を特定するには充分である。

       もしこの     CMOS     の世紀バイトの利用ルーチンを開発した     (したい)
       方がいたら、            hwclock            のメンテナに連絡してほしい。
       オプションを付加することは望ましいことであるから。

       このセクションが意味を持つのは、ハードウェア・クロックに  "direct  ISA"
       によってアクセスしている場合だけであることに注意。

数
       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                      HWCLOCK(8)