連載
» 2008年12月26日 00時00分 公開

実践でも役立つLPICドリル(8):Linux時刻管理の仕組みと設定 (1/4)

本連載は、Linux 認定試験 LPICに対応しています。一般的なLinuxユーザーレベルのトピックは省略し、システム管理とサーバ管理の内容を取り上げています。また、LPIC対策だけでなく、関連するトピックについて系統的な理解を問う問題も出題しています。連載の特徴は、対象となるプログラムのバージョンを可能な限り明記していること、比較的新しくまとまった解説がまだ少ないトピック、重要だが理解しにくいトピックを優先して取り上げていることです。問題を解き、その解説を読むことにより実践でLinuxを活用できる力を身に付けます。

[大竹龍史,ナレッジデザイン]

今回のディストリビューション:CentOS 5.2

問題を解く鍵 【1】【2】

 このトピックに関連した設定や試験問題を解く際には、以下の項目がポイントになります。

【1】ハードウェアクロックとシステムクロックによる時刻管理の仕組みを把握しておく

 時刻を管理するハードウェアには、ハードウェアクロックとインターバルタイマーとシステムクロックがあります。

ハードウェアクロック

 ハードウェアクロックは、マザーボード上のICによって提供される時計です。このICはバッテリーのバックアップがあるので、PCの電源を切っても時計が進みます。RTC(Real Time Clock)あるいはCMOSクロックとも呼ばれます。

 このICはCMOSメモリ上に各1バイトで次のデータを保持します。

秒(0−59)、分(0−59)、時間(0−12am/pmまたは0−23)、曜日(0−6)、日(1−31)、月(1−12)、年(BCDの場合0−99、バイナリの場合0-255)


 値はバイナリかBCDかをプログラマが選択できます。1バイトの値として、年は10進数で255までしか保持できません。このため年はepochと呼ばれる基準年からの経過年数を使用します。Linuxの場合はepochとして1900年を使用しているので、2008年の場合は、2008−1900=108が年の値として保持されます。

(注1)BCDはBinary Coded Decimalの略。2進化10進数。4ビットの2進数を0−9の値の範囲で使用します。


(注2)WindowsでもepochをLinuxと同じく1900年にしているようなので、PCをWindowsとのマルチブートにしている場合でも、この点は問題ないようです。


 最近のPCで広く使われているインテルの82801シリーズのICH(I/O Controller Hub)と呼ばれるICなどに組み込まれています。BIOSの設定画面から表示/設定ができます。

 割り込みベクタはIRQ8を使用します。

 ハードウェアクロックの時刻はLinuxシステム立ち上げ時にhwclockコマンドで読み取られ、システムクロックに設定されます。また、システムの停止時に、hwclockコマンドによってシステムクロックの時刻がハードウェアクロックに設定されます。

インターバルタイマー

 インターバルタイマーはマザーボード上のICで、割り込みベクタIRQ0を使用して、周期的に割り込みを発生させ、システムクロックの時刻を進めます。

(注3)割り込みの周期はカーネルコンフィグレーション時にparam.hの中のマクロ HZの値で定義されます。毎秒1000回(1msごと)あるいは100回(10msごと)が一般的です。ハードウェアクロックと同じく、インテルの82801シリーズのICHなどのICに組み込まれています。


システムクロック

 システムクロックはLinuxカーネルのメモリ上に次の2つのデータとして保持され、インターバルタイマーの割り込みにより、時計を進めます。

  • 1970年1月1日からの経過秒数
  • 現在秒からの経過ナノ秒数

(注4)システムクロックの周期(tick)はカーネルコンフィグレーション時にparam.hの中のマクロUSER_HZの値で定義されます。毎秒100回(10msごと)が一般的です。システムクロックの表示/設定はdateコマンドにより行うことができ、adjtimexコマンドで表示、設定、補正をすることができます。また、NTP(Network Time Protocol)を利用して、ntpdateコマンドあるいはntpdデーモンにより、設定できます。


図1 Linuxの時刻管理 図1 Linuxの時刻管理

【2】2種類の時刻、UTC(協定世界時)とローカルタイム(地域標準時)について把握しておく

 UTC(Coordinated Universal Time:協定世界時)は原子時計を基に定められた世界共通の標準時で、天体観測を基にしたGMT(グリニッジ標準時)とほぼ同じです。

 ローカルタイムは国や地域に共通の地域標準時であり、日本の場合はJST(Japan Standard Time:日本標準時)となります。UTCとJSTでは9時間の時差があります(JSTがUTCより9時間進んでいる)。

 この時差情報は/usr/share/zoneinfoディレクトリの下に、ローカルタイムごとにファイルに格納されています。Linuxシステムのインストール時に指定するタイムゾーンによって、対応したファイルが/etc/localtimeファイルにコピーされて使用されます。

 タイムゾーンに「アジア/東京」を選んだ場合は、/usr/share/zoneinfo/Asia/Tokyoが/etc/localtimeにコピーされ、ローカルタイムはJSTとなります。システムクロックはUTCを使用します。値は1970年1月1日0時0分0秒からの経過秒数です。

 ハードウェアクロックをUTCにするかローカルタイムにするかは、hwclockコマンドの引数で指定します(hwclockの使用法については後述)。ハードウェアクロック自体にはUTCかローカルタイムかの情報を保持する領域はありません。

 システム起動時とシステム停止時に実行されるhwclockの引数で、ハードウェアクロックをUTCかローカルタイムのどちらにするかを設定できます。Red Hat系Linuxの場合/etc/sysconfig/clockファイルで指定できます。

 UTCにする場合は、

UTC=true あるいは UTC=yes

と記述します。それ以外はローカルタイムとなります。

 最後に実行されたhwclockコマンドの引数にUTCを指定したか、ローカルタイムを指定したかの情報は/etc/adjtimeファイルに記録され、hwclockコマンドを引数なしで実行した場合は、/etc/adjtimeに記録された方がデフォルト値として使用されます。

       1|2|3|4 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。