Linuxの時間管理の仕組み

Pocket

Linuxの時間管理の仕組みについてまとめメモ。
考え始めたキッカケは9時間ずれるという良くある問題を根本的に理解したいと何故か思ってしまったから_(:3」∠)_
今思えば止めておけばよかったと思ってたり思ってなかったり・・・。

勘違いを含む間違いや、不足部分もあると思うので随時更新します。

スポンサードリンク


UTCとローカルタイム(日本:JST)

UTC
協定世界時(参考:wikipedia)。世界各地の時刻を決める上で基準となっている時間。
ローカルタイム
各地の時間。UTCに+9時間すると日本時間となる。コンピュータの世界でも基本的にUTCを基準として、それをタイムゾーンに合致した日時に修正して表示する。

ハードウェアクロックとシステムクロック

ハードウェアクロック
CMOS(参考:wikipedia)で保持している時間。それがUTCなのかローカルタイムなのかの情報はCMOS(BIOS)では保持していない。OSは起動時にはこのハードウェアクロックを取得しシステムクロックとする。
システムクロック
OSが保持する時間。OS起動時にハードウェアクロックから取得する。OS起動後はNTPサーバを参照するなり、手動で設定するなりして変更が可能。OSはシャットダウン時にシステムクロックをハードウェアクロックにコピーしてから停止する。

Linuxにおける時間管理の手順

  1. Linux起動時にBIOSからハードウェアクロックを取得。その際/etc/adjtimeを参照し、BIOSから受け取った時間がUTCなのかローカルタイムなのかを判断
  2. /etc/sysconfig/clockを参照しUTC=trueとなっていればUTC、UTC=falseとなっていればローカルタイムとして扱う事を決定。

    • ローカルタイムの場合はタイムゾーン(/etc/localtime)を参照しシステムクロックとする
      ※/etc/localtimeは/usr/share/zoneinfo内のファイルのコピー、またはリンク。
       日本の場合は/usr/share/zoneinfo/Asia/Tokyo
    以下の表はタイムゾーンがAsia/Tokyoの場合の例です。
    /etc/adjtime/etc/sysconfig/clockシステムクロック備考
    UTCUTC=trueUTC特記なし
    UTCUTC=falseローカルタイム(Asia/Tokyo)*通常ではあり得ない
    LOCALUTC=trueUTC*通常ではあり得ない
    LOCALUTC=falseローカルタイム(Asia/Tokyo)特記なし

    *最近のUNIX/Linuxは基本的にシャットダウン時の処理として「/etc/sysconfig/clock」の「UTF=trueまたはfalse」の部分を「/etc/adjtime」に反映させます。なので、次回起動時には「/etc/sysconfig/clock」と「/etc/adjtime」に設定上の矛盾は生じない訳です。正常な手順でシャットダウンを行っている限り2列目と3列目はあり得ないと思われます。(古いバージョンはそういう仕組みが無かったとか噂では聞きますが・・・)

    あり得るとしたら、OS/カーネルのバージョンアップ等でどちらか一方が変えられてしまったり、各ファイルの変更後に停電等が起きた後の起動時ですかね・・・。その次の起動時には前回のシャットダウン時に上記の通り設定ファイル上の矛盾は解消されますが、時刻は狂ってそうです。

  3. ntpdなどのプログラムによりNTPサーバーと同期。より正確な日時でシステムクロックを更新する。あまりにも実日時とかけ離れていた場合、NTPサーバーが更新を拒否するケースがある。(参考:Linux:ntpdを動かしていても日付がずれる場合に確認すること
  4. シャットダウン時に「/etc/sysconfig/clock」の「UTF=trueまたはfalse」の部分、およびシステムクロックをハードウェアクロックに反映させる。


お役に立てましたか?

ブックマークをどうぞ!

スポンサード リンク

コメントを残す