- 締切済み
Linuxの時刻同期の仕組みについて
Linuxにはハードウェアクロックとソフトウェアクロックがありますが、BIOS クロックやCMOS クロックからハードウェアクロックが取得できない場合、UNIXエポックの1970年1月1日真夜中(午前0時0分0秒)で起動して、その後、NTPサーバーとの時刻同期ができない場合、ソフトウェアクロックは、UNIXエポックの1970年1月1日真夜中(午前0時0分0秒)のままという認識でよろしいでしょうか。 お手数をおかけしますがご教示を頂けますようお願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- notnot
- ベストアンサー率47% (4900/10358)
>BIOSの時刻は正しいが、ハードウェアクロックを取得できない場合、カーネルがそのマザーボードのBIOSクロックへアクセスがサポートしていないため、ハードウェアクロックが取得できないということはありえますでしょうか。 理論的にはあり得る(そういうマザーボードを設計することは可能)ですが、現実的にはあり得ない。 >様々なマザーボードがありますが、Linuxがすべてのマザーボードをサポートしているとは思えず、サポートされていないマザーボードの場合、ハードウェアクロックが取得できないのではと考えております。 ハードウェアクロックは初期のPCからずっとあるので、それにLinuxやWindowsなど汎用OSがアクセスできないとうことはありません。 IBM PCアーキテクチャじゃ無いもの、Macなどではクロックデバイスのアドレスが違うかもしれませんが。 >ハードウェアクロックが壊れている場合はOSがまともに動かないと思われるとのことですが、仮にOSが起動できたとしても、正常な動作をしない可能性があり得るという認識であっておりますでしょうか。 インターバルタイマー割り込みが掛からない状態だと、OSの起動すらままならないと思います。
- notnot
- ベストアンサー率47% (4900/10358)
補則に書かれている無いようでおおむね合ってると思いますが、微妙に違います。 ntpdは時刻のずれの補正で、時刻合わせはntpdateです。 カーネル起動時にソフトウェアクロックはゼロ(1970-1-1)から始まる。カーネル起動の中でハードウェアクロックから時刻を取得してそれにソフトウェアクロックを合わせる。 ソフトウェアクロックはタイマー割り込みで一定時間ごとに更新され、進んでいく。 カーネル起動完了後に、各種プロセスが順次起動していくがその中のntpdateが起動したときに、外部のNTPサーバーに時刻をもらいに行き、得られればソフトウェアクロックをその値に合わせる。 その後ntpdが起動して、一定時間ごとにNTPサーバーから時刻をもらい、ずれがあればソフトウェアクロックを少しずつ調整する。 ハードウェアクロックが壊れている場合は、タイマー割り込みが掛からずにソフトウェアクロックが進まないと言うこともあるかと思いますが、時刻合わせ以外でもタイマー割り込みは使っているので、OSがまともに動かないかと思います。 起動時のハードウェアクロック値取得だけ失敗して、その後のタイマー割り込みだけ正常に行われるというのは考えにくいです。あるとすると、クロック用バッテリーが切れているために、ハードウェアクロックが止まっていて、電源オンで、ゼロからカウントアップされて行くということですね。その場合は、カーネルがハードウェアクロック取得をする時点で、ゼロから数秒~数分進んでいるかと思います。 また、OSシャットダウン時には、ソフトウェアクロックの値をハードウェアクロックに書き込みに行きます。これはソフトウェアクロックの方が、NTP等で時刻合わせされており、正確な可能性が高いからです。
補足
詳細な説明を頂きありがとうございます。 BIOSの時刻は正しいが、ハードウェアクロックを取得できない場合、カーネルがそのマザーボードのBIOSクロックへアクセスがサポートしていないため、ハードウェアクロックが取得できないということはありえますでしょうか。 様々なマザーボードがありますが、Linuxがすべてのマザーボードをサポートしているとは思えず、サポートされていないマザーボードの場合、ハードウェアクロックが取得できないのではと考えております。 ハードウェアクロックが壊れている場合はOSがまともに動かないと思われるとのことですが、仮にOSが起動できたとしても、正常な動作をしない可能性があり得るという認識であっておりますでしょうか。
- t_ohta
- ベストアンサー率38% (5238/13705)
Linuxは基本的にソフトウェアクロックで動作しています。 OS起動後からカウントを続けているので、ハードウェアクロックやNTPで補正が出来なければ起動時を1970-01-01 00:00:00 として、起動からの経過時間を加算した時間を現在時刻として動作します。
補足
ありがとうございます。 「CMOSクロック」が「2015/1/9 00:00:00」でNTPサーバーが正しい時刻の場合、下記の認識であっておりますでしょうか。 ブートローダによってカーネルがロードされ、BIOS クロックやCMOS クロックと同期されるまでは時刻は1970-01-01 00:00:00で、 そのときにBIOS クロックやCMOS クロックと同期できれば、 時刻はCMOSクロックから取得した時刻2015-01-09 00:00:00から開始される。 その後、ntpdが起動してNTPサーバーと時刻同期できれば、NTPサーバーから取得した時刻から開始される。 BIOS クロックやCMOS クロックから時刻同期できず、NTPサーバーとも時刻同期できない場合は、1970-01-01 00:00:00から時刻開始される。 BIOS クロックやCMOS クロックから時刻同期できず、NTPサーバーとも時刻同期できた場合は、NTPサーバーから取得した時刻から開始される。
- wormhole
- ベストアンサー率28% (1626/5665)
それなりに経過はしますから1970年1月1日真夜中(午前0時0分0秒)のままということはないです。
補足
ありがとうございます。 UNIXエポックの1970年1月1日真夜中(午前0時0分0秒)から開始されるでしょうかという質問をしようとしたのですが、誤ってそのままでしょうかという質問になってしまいました。
補足
ありがとうございます。 WindowsとLinuxのデュアルブート環境で、Windowsは正しい時刻を取得ができますがLinuxは1970-01-01 00:00:00から開始された時間を示しています。 Linuxは起動はされていますが、その場合、考えられる原因はどのようなことがありますでしょうか。