サーバ管理 - NTP
鯖はCentOS4/5だから、な!
初稿:2007-10-05
ntpdate
0時回ってもコンテンツが自動更新されないのでおかしいなと思ったら20分近く狂ってた(遅れてた)。慌ててntpdateコマンドを叩く。
# ntpdate ntp1.jst.mfeed.ad.jp 5 Oct 00:22:01 ntpdate[*]: adjust time server 210.173.160.27 offset 1034.428 sec
サーバの時刻というのは非常に重要である。大きなズレはログの信憑性を著しく損なうことになる。確か2ヶ月くらい前に調整しているのでどうも1日15秒くらいはズレてるようだ。これではちょっと話にならない。ntpdateをcronでブン回すのもいいが、ntpdで時刻調整させることにした。
ntpd
確認するとすでにパッケージでインストールされてるようなので、サービスレベル2~5あたりをonにするだけで済みそう。
# chkconfig --list | grep ntpd ntpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off # chkconfig --level 2345 ntpd on # service ntpd start
rc.local
OS起動時に時間合わせをする参考設定。まずntpdateで大雑把に修正し、その後はntpdで微調整。
[# vi /etc/rc.d/rc.local (略) echo "Starting NTP daemon" # synchronyzed by ntpdate/usr/local/bin/ntpdate -s -b ntp1.jst.mfeed.ad.jp
# 5 second later , start ntpdsleep 5 /usr/local/bin/xntpd
(略)
ntp.conf
デフォルトでいくつか同期(参照)するNTPサーバが登録されているが、設置場所が国内なら同期サーバも国内に変更しておくほうがよかろう。福岡大学は非推奨、MFEEDあたりにしておくのが無難。なおNTPの標準ポートは123/TCP。
# vi /etc/ntp.conf fudge 127.127.1.0 stratum 15 # 控えめなオレ server ntp1.jst.mfeed.ad.jp server ntp2.jst.mfeed.ad.jp server ntp3.jst.mfeed.ad.jp
ntpdate+cronと比較してntpdを使うメリットは、複数のNTPサーバを参照できるので耐障害性で有利なこと、またそれぞれのdrifttimeを照らし合わせて遅延などによる誤差を最適化できること。
デーモンの動きを確認してみる。
# ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *ntp1.jst.mfeed. 210.173.160.86 2 u 479 1024 377 142.330 -2.594 0.310 +ntp2.jst.mfeed. 210.173.160.86 2 u 551 1024 377 142.545 -2.197 5.609 +ntp3.jst.mfeed. 210.173.160.86 2 u 584 1024 377 142.271 -2.496 0.540 LOCAL(0) LOCAL(0) 10 l 20 64 377 0.000 0.000 0.004
- remote
- リモートホスト名
- *
- sys.peer、同期中であると宣言されたTimeサーバ
- +
- candidat、接続テストに合格し、いつでも参照可能なTimeサーバ
- -
- outlyer、クラスタリング検査で捨てられたTimeサーバ
- x
- falsetick、falseticker検査で捨てられたTimeサーバ
- .
- excess、参照サーバーが多くて捨てられたTimeサーバ
- #
- selected、同期距離が遠いが参照可能なTimeサーバ
- o
- pps.peer、同期中であると宣言されたTimeサーバ
- 無印
- reject、距離が遠くて捨てられたTimeサーバ
- refid
- 参照ID
- st
- 階層レベル
- t
- 階層タイプ、l:local、u:unicast、m:multicast、b:broadcast
- when
- 最後のパケットを受け取ってからの時間(sec)
- poll
- ポーリング間隔(sec)
- reach
- 到達可能なレジスタ(8進数表現)
- delay
- ポーリングインターバルの遅延見積もり(ms)
- offset
- 階層のオフセット(ms)
- jitter
- 階層の分散(ms)
BIOSとの同期
Linux(に限らないだろな)はOS起動時の時刻設定を、いい加減にもほどがあるBIOSから引っ張ってくる。ntpd/ntpdateで補正した時刻はそのままだとBIOSには反映されないのでclock -w
で同期してやる。
# clock Fri 5 Oct 2007 10:17:34 PM JST -0.272105 seconds # date Sat Oct 6 05:17:37 JST 2007 # clock -w # clock Sat 6 Oct 2007 05:18:06 AM JST -0.975052 seconds # date Sat Oct 6 05:18:07 JST 2007
いちおう起動時にntpdateで大雑把に調整するようにはしているが、念のためBIOSとの同期をcronで行っておくことにする。あるいはshutdownスクリプトに組み込んでもよし。
# crontab -e 0 5 * * * /sbin/clock -w
クライアントレベルならSNTPでの時刻同期( XPのWindows TimeもSNTPクライアントだ)で構わんだろう。
参考
Windows Timeがデフォルトで参照するNTPサーバ、“time.windows.com”はただでさえ日本からだと遠いしデフォルトゆえにトラフィック過多になりやすい。変更するにはレジストリをいぢらないといけないので、不安ならWindows Timeサービスを無効にして桜時計やtclockで国内のNTPサーバを指定するとよい。
Active Directoryに参加しているWindowsクライアントの場合、同期先を変更するとKerberos認証で用いるタイムスタンプがズレてActive Directoryに参加できなくなる恐れがある。クライアントの時刻にズレがあるとすればドメインコントローラの時刻同期に問題がある可能性が高い、というわけでサーバ管理者にその旨伝えるのがよい。
タイムゾーンの変更
新鯖を借りることになりシコシコとセットアップ。海外鯖の場合、たいていタイムゾーンは日本になってないので変えてやらないといけない。
# date Thu Oct 11 18:05:03 EDT 2007
うみゅ。EDTは東部アメリカ時間だっけかな。これを日本のJSTに変更。/usr/share/zoneinfoの中にいろんなタイムゾーン設定がいらっしゃるので、JapanもしくはAsia/Tokyoを/etc/localtimeにコピーしてやればよいのだが、念のためオリジナルをバックアップし、シンボリックリンクを張ることにする。
# mv /etc/localtime /etc/localtime.org # ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
では確認。
# date Fri Oct 12 07:07:41 JST 2007
なんか大幅にずれてるので最初に戻る。
雑感
次項でも多少触れるが、個々の端末がそれぞれStratum 1や2のホストと同期を取るよりも、サブネット内のノードの同期を保つことのほうが大事ではないかというのが私見。その概念の延長が、ISPレベルでのNTPサーバ運用及び公開である。みんなが同じサーバを参照したら絶対トラフィックが飽和するんだよ、福岡大学みたいにさ。だからISPがStratum2クラスのNTPサーバを複数運用し、ラウンドロビンか何かで参照先を変えてやれば負荷は減るはず。