■問題を解く鍵【3】【4】
【3】ハードウェアクロックとシステムクロックの時刻設定/表示コマンドの使い方を把握しておく
dateコマンドでシステムクロックの時刻を表示/設定できます。
dateコマンドは表示形式を書式指定できます。書式指定を「+」で始めると現在の時刻を完全な日付で表示します。また基準日からの相対的な日数での指定や表示もできます。
%H→ 時 (00−23)
%M→ 分 (00−59)
%S→ 秒 (00−60)
%s→ 1970-01-01 00:00:00 UTC からの秒数
%T→ 時刻、24 時間 (hh:mm:ss)
%d→ 月内通算日数 (01−31)
%b→ ロケールの省略形の月名 (Jan−Dec)
%B→ ロケールの完全表記の月名 (January−December)
$ date
2008年 10月 29日 水曜日 07:08:41 JST
システムクロックを読み取り、/etc/localtimeを参照して、UTCをローカルタイムに変換して表示します。
$ date --utc
2008年 10月 28日 火曜日 22:08:46 UTC
$ date '+%s'
1225321405
$ unset LANG
$ date '+%b %d %T'
Nov 04 04:00:30
$ unset LANG
$ date '+%B %d %H:%M:%S'
November 04 04:02:01
# date 1028093008
引数に月日時分年を2けたずつで指定します。年は下2けたです。現在と同じ年であれば、年の指定は省略できます。/etc/localtimeを参照し、ローカルタイムをUTCに変換してシステムクロックを設定します。
adjtimexコマンドでシステムクロックの時刻をカーネル変数に格納された値のまま表示できます。
$ adjtimex -p | grep raw
raw time: 1225321652s 14872us = 1225321652.014872
adjtimexコマンドはCentOS 5.2ではadjtimexパッケージに含まれています。adjtimexコマンドはシステムコールadjtimex()を発行して、システムクロック時刻の設定/表示、NTPサーバを利用した時刻のずれの計測、周波数補正、漸次的な時刻合わせなどを行うことができます。
hwclockコマンドでハードウェアクロックの時刻を表示できます。
# hwclock -r または hwclock --show
2008年10月29日 07時14分35秒 -0.000855 秒
引数に--utcあるいは--localtimeを指定したときは、ハードウェアクロックの時刻を指定された標準時で設定されているものと見なします。例8のように指定しなかった場合は/etc/adjtimeを参照して、そこに記録された標準時が設定されているものと見なします(既述したとおり、/etc/adjtimeには最後に実行したhwclockで指定した標準時が記録されています)。ハードウェアクロックがUTCでもローカルタイムでも、表示はローカルタイムになります。
hwclockコマンドで、ハードウェアクロックの時刻をシステムクロックに設定します。
# hwclock -s またはhwclock --hctosys
引数に--utcあるいは--localtimeを指定したときは、ハードウェアクロックの時刻を指定された標準時で設定されているものと見なします。例9のように指定しなかった場合は/etc/adjtimeを参照して、そこに記録された標準時が設定されているものと見なします。
ハードウェアクロックがローカルタイムで設定されている場合は、/etc/localtimeを参照してUTCに変換してから、システムクロックの時刻を設定します。
hwclockコマンドで、システムクロックの時刻をハードウェアクロックに設定します。
# hwclock -w またはhwclock --systohc
引数に--utcあるいは--localtimeを指定したときは、ハードウェアクロックの時刻を指定された標準時で設定します。例10のように指定しなかった場合は/etc/adjtimeを参照して、そこに記録された標準時で設定します。ハードウェアクロックをローカルタイムで設定する場合は、/etc/localtimeを参照して、システムクロックのUTCをローカルタイムに変換してから設定します。
(注5)Windowsはハードウェアクロックをローカルタイムで設定しています。PCをWindowsとのマルチブートにしている場合は、時刻の互換性を保つためにローカルタイムで設定するのがよいでしょう。
【4】NTPによる時刻管理の仕組みを把握しておく
NTP(Network Time Protocol)はコンピュータが、ネットワーク上のほかのコンピュータの時刻を参照して時刻の同期を取るためのプロトコルです。NTPでは時刻をstratumと呼ばれる階層で管理します。原子時計、GPS、標準電波が最上位の階層stratum0になり、それを時刻源とするNTPサーバがstratum1となります。stratum1のNTPサーバから時刻を受信するコンピュータ(NTPサーバあるいはNTPクライアント)はstratum2となります。最下位の階層stratum16まで階層化できます。
NTPでは1900年1月1日0時0分0秒からの経過秒数(整数部32bit、小数部32bitの符号なし固定小数点)をUTCの時刻(Timestamp)で配信します。
LinuxではNTPプロジェクトが開発/配布するntpパッケージを使用しています。ntpパッケージにはntpdateコマンドやntpdデーモンが含まれています。
●ntpdateコマンド
NTPにより時刻(システムクロック)を設定するコマンドです。引数にNTPサーバを指定します。
(注6)NTPバージョン4対応のntpdデーモンにはntpdateコマンドの機能が組み込まれており、-qオプションを指定することにより利用できます。ntpdateコマンドはいずれなくなるようです。
# ntpdate -q ntp.nict.jp
server 133.243.238.243, stratum 1, offset -16.539696, delay 0.09422
31 Oct 04:38:09 ntpdate[15473]: step time server 133.243.238.243 offset -1
6.539696 sec
-q(query)オプションを指定します。NTPサーバに情報通信研究機構(NICT)の公開サーバを指定しています。
“offset -16.539696 sec”の表示はシステムクロックのオフセットの表示であり、NTPサーバの時刻から16.539696秒進んでいることを表しています。
# ntpdate ntp.nict.jp
31 Oct 05:45:55 ntpdate[16283]: step time server 133.243.238.163 offset -1
6.593086 sec
# ntpdate -q ntp.nict.jp
31 Oct 05:46:14 ntpdate[16285]: adjust time server 133.243.238.164 offset -0.000199 sec
NTPサーバと同期を取った後、-qオプションを付けて確認すると、オフセットが-0.000199秒となって、時刻のずれは1ms以内になったことが分かります。
ntpdateコマンドが時刻を同期する方法にはstepとslewの2種類あります。
stepによる同期:時刻のずれが0.5秒以上の場合はシステムコールsettimeofday()により1回でNTPサーバの時刻に合わせます。
slewによる同期:
時刻のずれが0.5秒以内の場合はライブラリ関数adjtime()により徐々にNTPサーバの時刻に合わせていきます。-Bオプションの指定により、時刻のずれが0.5秒以上の場合もこの方法で同期を取ることもできます。
ntpdデーモン:
ntpdはNTPにより時刻の同期を取るデーモンです。設定ファイル/etc/ntp.confで指定された1台以上のサーバに、指定された間隔でポーリングを行い、メッセージを交換することにより時刻の同期を取ります。またNTPクライアントに時刻を配信します。
ntpdデーモンが時刻を同期する方法にはntpdateコマンドと同様、stepとslewの2種類あります。
slewによる同期:
NTPサーバとの時刻のずれが128m以内の場合は、徐々に時刻を合わせていきます。ntpdで同期を取っている場合、通常は時刻のずれは128ms以内に収まります。
stepによる同期:
システム起動時の特別な場合や、ネットワークの状態が悪いなどの原因で128ms以上のずれがある場合は、1回で時刻を合わせます。
CentOS 5.2の場合、次のコマンドでntpdを起動できます。
# /etc/init.d/ntpd start
ntpd を起動中: [ OK ]
# ps -ef | grep ntpd
root 14512 1 0 18:42 ? 00:00:00 ntpd -u ntp:ntp -p /var/run/ntpd.pid -g
デフォルトでは起動時に1000秒以上のずれがある場合はntpdは終了します。-g オプションを付けた場合は、ずれがどのような値でも、時刻を合わせます。ntpdはデフォルトでは最小64秒、最大1024秒の間隔で、参照するサーバにポーリングを行います。
ntpd起動時は64秒ですが、周波数のずれが調整されて小さくなるに従い、最大値の1024秒まで間隔を延ばします。周波数のずれ(drift:ドリフト)が31ppm(parts-per-million:0.0001%)にまで小さくなると、最大の間隔の1024秒になります。最小値と最大値は設定ファイルのminpoll、maxpollの指定でデフォルト値から変更できます。
●/etc/ntp.conf
ntpdデーモンの設定ファイルです。参照するNTPサーバの指定やポーリング間隔、アクセス制御の設定などを記述します。
#
restrict default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
#
server 0.centos.pool.ntp.org
server 1.centos.pool.ntp.org
server 2.centos.pool.ntp.org
#
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
#
driftfile /var/lib/ntp/drift
●ntp.confの主なコマンド
restrict:
access control list(ACL)の指定です。アドレスフィールドがdefault(アドレス0.0.0.0、マスク0.0.0.0)と書かれている行がデフォルトのエントリで、restrict行の最初のエントリとなります。上記の/etc/ntp.confの記述例では、フラッグnomodifyで状態の変更の禁止、noqueryで問い合わせの禁止を指定しています(時刻のサービスは行います)。アドレスにローカルホスト127.0.0.1を指定したエントリのように、フラッグを指定しない場合はすべてのアクセスを許可します。
server:
リモートサーバのIPアドレスあるいは参照クロックのアドレス(127.127.x.x)を指定します。
fudge:
serverコマンドで参照クロックを指定した直後の行で、クロックドライバについてのstratumなどの追加情報を指定します。
driftfile:
ntpdデーモンが計測した、NTPサーバの参照時刻からのインターバルタイマーの発振周波数のずれ(drift:ドリフト)をPPM(parts-per-million:0.0001%)単位で記録するファイルです。
ntpdデーモンが起動時に参照し、タイマー補正の初期値として使用します。起動時にこのファイルがない場合は、ntpdは20分の間隔を置いて2回計測し、その値から算出してファイルを作成します。その後は1時間ごとに更新されます。
2006年6月、NICTのNTPサーバが公開サーバ(stratum1)となりました。
NICTのNTPサーバはFPGA(Field Programmable Gate Array)と呼ばれるICを使って開発され、毎秒100万リクエスト以上を処理できる世界最高性能のサーバとのことです。Webページ掲載のQ&Aでは、個人ユーザーがアクセスしてもOK、日本中のパソコンユーザーからアクセスが集中しても大丈夫とのことで、これまでは福岡大学の公開NTPサーバにアクセスが集中して過負荷状態になっていたことを考えると、画期的に状況が改善されたことになります。ただ、ネットワークのトラフィックを減少させるという意味でも、プロバイダや自組織にNICTのサーバを上位サーバとするstratum2のサーバがあれば、それを利用するのがよいでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.