こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

締切り済みの質問

Linuxの時刻同期の仕組みについて

Linuxにはハードウェアクロックとソフトウェアクロックがありますが、BIOS クロックやCMOS クロックからハードウェアクロックが取得できない場合、UNIXエポックの1970年1月1日真夜中(午前0時0分0秒)で起動して、その後、NTPサーバーとの時刻同期ができない場合、ソフトウェアクロックは、UNIXエポックの1970年1月1日真夜中(午前0時0分0秒)のままという認識でよろしいでしょうか。

お手数をおかけしますがご教示を頂けますようお願い致します。

投稿日時 - 2016-01-09 15:13:16

QNo.9108581

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(4)

ANo.4

>BIOSの時刻は正しいが、ハードウェアクロックを取得できない場合、カーネルがそのマザーボードのBIOSクロックへアクセスがサポートしていないため、ハードウェアクロックが取得できないということはありえますでしょうか。

理論的にはあり得る(そういうマザーボードを設計することは可能)ですが、現実的にはあり得ない。

>様々なマザーボードがありますが、Linuxがすべてのマザーボードをサポートしているとは思えず、サポートされていないマザーボードの場合、ハードウェアクロックが取得できないのではと考えております。

ハードウェアクロックは初期のPCからずっとあるので、それにLinuxやWindowsなど汎用OSがアクセスできないとうことはありません。
IBM PCアーキテクチャじゃ無いもの、Macなどではクロックデバイスのアドレスが違うかもしれませんが。

>ハードウェアクロックが壊れている場合はOSがまともに動かないと思われるとのことですが、仮にOSが起動できたとしても、正常な動作をしない可能性があり得るという認識であっておりますでしょうか。

インターバルタイマー割り込みが掛からない状態だと、OSの起動すらままならないと思います。

投稿日時 - 2016-01-10 15:39:18

補足

ありがとうございます。

WindowsとLinuxのデュアルブート環境で、Windowsは正しい時刻を取得ができますがLinuxは1970-01-01 00:00:00から開始された時間を示しています。
Linuxは起動はされていますが、その場合、考えられる原因はどのようなことがありますでしょうか。

投稿日時 - 2016-01-10 16:02:03

-広告-

ANo.3

補則に書かれている無いようでおおむね合ってると思いますが、微妙に違います。
ntpdは時刻のずれの補正で、時刻合わせはntpdateです。

カーネル起動時にソフトウェアクロックはゼロ(1970-1-1)から始まる。カーネル起動の中でハードウェアクロックから時刻を取得してそれにソフトウェアクロックを合わせる。
ソフトウェアクロックはタイマー割り込みで一定時間ごとに更新され、進んでいく。

カーネル起動完了後に、各種プロセスが順次起動していくがその中のntpdateが起動したときに、外部のNTPサーバーに時刻をもらいに行き、得られればソフトウェアクロックをその値に合わせる。
その後ntpdが起動して、一定時間ごとにNTPサーバーから時刻をもらい、ずれがあればソフトウェアクロックを少しずつ調整する。

ハードウェアクロックが壊れている場合は、タイマー割り込みが掛からずにソフトウェアクロックが進まないと言うこともあるかと思いますが、時刻合わせ以外でもタイマー割り込みは使っているので、OSがまともに動かないかと思います。
起動時のハードウェアクロック値取得だけ失敗して、その後のタイマー割り込みだけ正常に行われるというのは考えにくいです。あるとすると、クロック用バッテリーが切れているために、ハードウェアクロックが止まっていて、電源オンで、ゼロからカウントアップされて行くということですね。その場合は、カーネルがハードウェアクロック取得をする時点で、ゼロから数秒~数分進んでいるかと思います。

また、OSシャットダウン時には、ソフトウェアクロックの値をハードウェアクロックに書き込みに行きます。これはソフトウェアクロックの方が、NTP等で時刻合わせされており、正確な可能性が高いからです。

投稿日時 - 2016-01-10 10:40:20

補足

詳細な説明を頂きありがとうございます。

BIOSの時刻は正しいが、ハードウェアクロックを取得できない場合、カーネルがそのマザーボードのBIOSクロックへアクセスがサポートしていないため、ハードウェアクロックが取得できないということはありえますでしょうか。
様々なマザーボードがありますが、Linuxがすべてのマザーボードをサポートしているとは思えず、サポートされていないマザーボードの場合、ハードウェアクロックが取得できないのではと考えております。

ハードウェアクロックが壊れている場合はOSがまともに動かないと思われるとのことですが、仮にOSが起動できたとしても、正常な動作をしない可能性があり得るという認識であっておりますでしょうか。

投稿日時 - 2016-01-10 13:54:18

ANo.2

Linuxは基本的にソフトウェアクロックで動作しています。
OS起動後からカウントを続けているので、ハードウェアクロックやNTPで補正が出来なければ起動時を1970-01-01 00:00:00 として、起動からの経過時間を加算した時間を現在時刻として動作します。

投稿日時 - 2016-01-09 21:15:05

補足

ありがとうございます。

「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サーバーから取得した時刻から開始される。

投稿日時 - 2016-01-09 22:32:27

ANo.1

それなりに経過はしますから1970年1月1日真夜中(午前0時0分0秒)のままということはないです。

投稿日時 - 2016-01-09 16:17:02

補足

ありがとうございます。

UNIXエポックの1970年1月1日真夜中(午前0時0分0秒)から開始されるでしょうかという質問をしようとしたのですが、誤ってそのままでしょうかという質問になってしまいました。

投稿日時 - 2016-01-09 22:34:57

-広告-
-広告-
-広告-
-広告-