• 締切済み

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

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

noname#242248
noname#242248

みんなの回答

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.4

>BIOSの時刻は正しいが、ハードウェアクロックを取得できない場合、カーネルがそのマザーボードのBIOSクロックへアクセスがサポートしていないため、ハードウェアクロックが取得できないということはありえますでしょうか。 理論的にはあり得る(そういうマザーボードを設計することは可能)ですが、現実的にはあり得ない。 >様々なマザーボードがありますが、Linuxがすべてのマザーボードをサポートしているとは思えず、サポートされていないマザーボードの場合、ハードウェアクロックが取得できないのではと考えております。 ハードウェアクロックは初期のPCからずっとあるので、それにLinuxやWindowsなど汎用OSがアクセスできないとうことはありません。 IBM PCアーキテクチャじゃ無いもの、Macなどではクロックデバイスのアドレスが違うかもしれませんが。 >ハードウェアクロックが壊れている場合はOSがまともに動かないと思われるとのことですが、仮にOSが起動できたとしても、正常な動作をしない可能性があり得るという認識であっておりますでしょうか。 インターバルタイマー割り込みが掛からない状態だと、OSの起動すらままならないと思います。

noname#242248
質問者

補足

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

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.3

補則に書かれている無いようでおおむね合ってると思いますが、微妙に違います。 ntpdは時刻のずれの補正で、時刻合わせはntpdateです。 カーネル起動時にソフトウェアクロックはゼロ(1970-1-1)から始まる。カーネル起動の中でハードウェアクロックから時刻を取得してそれにソフトウェアクロックを合わせる。 ソフトウェアクロックはタイマー割り込みで一定時間ごとに更新され、進んでいく。 カーネル起動完了後に、各種プロセスが順次起動していくがその中のntpdateが起動したときに、外部のNTPサーバーに時刻をもらいに行き、得られればソフトウェアクロックをその値に合わせる。 その後ntpdが起動して、一定時間ごとにNTPサーバーから時刻をもらい、ずれがあればソフトウェアクロックを少しずつ調整する。 ハードウェアクロックが壊れている場合は、タイマー割り込みが掛からずにソフトウェアクロックが進まないと言うこともあるかと思いますが、時刻合わせ以外でもタイマー割り込みは使っているので、OSがまともに動かないかと思います。 起動時のハードウェアクロック値取得だけ失敗して、その後のタイマー割り込みだけ正常に行われるというのは考えにくいです。あるとすると、クロック用バッテリーが切れているために、ハードウェアクロックが止まっていて、電源オンで、ゼロからカウントアップされて行くということですね。その場合は、カーネルがハードウェアクロック取得をする時点で、ゼロから数秒~数分進んでいるかと思います。 また、OSシャットダウン時には、ソフトウェアクロックの値をハードウェアクロックに書き込みに行きます。これはソフトウェアクロックの方が、NTP等で時刻合わせされており、正確な可能性が高いからです。

noname#242248
質問者

補足

詳細な説明を頂きありがとうございます。 BIOSの時刻は正しいが、ハードウェアクロックを取得できない場合、カーネルがそのマザーボードのBIOSクロックへアクセスがサポートしていないため、ハードウェアクロックが取得できないということはありえますでしょうか。 様々なマザーボードがありますが、Linuxがすべてのマザーボードをサポートしているとは思えず、サポートされていないマザーボードの場合、ハードウェアクロックが取得できないのではと考えております。 ハードウェアクロックが壊れている場合はOSがまともに動かないと思われるとのことですが、仮にOSが起動できたとしても、正常な動作をしない可能性があり得るという認識であっておりますでしょうか。

  • t_ohta
  • ベストアンサー率38% (5080/13275)
回答No.2

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

noname#242248
質問者

補足

ありがとうございます。 「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% (1621/5656)
回答No.1

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

noname#242248
質問者

補足

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

関連するQ&A

  • エポック秒の基点について

    基礎的な質問ですみません。 ------------------------------------------------- my $time1 = timelocal(0,0,9,1,1-1,1970-1900); my $time2 = timelocal(0,0,10,1,1-1,1970-1900); my @ltime = localtime(0); my $time3 = sprintf("%d年%d月%d日%02d時%02d分%02d秒", $ltime[5]+1900,$ltime[4]+1,$ltime[3],$ltime[2],$ltime[1],$ltime[0]); print<<"EOM"; 1970年1月1日9時00分00秒のエポック秒は $time1 です。 1970年1月1日10時00分00秒のエポック秒は $time2 です。 エポック秒 0 は $time3 です。 EOM ------------------------------------------------ と書きます。結果は、 ------------------------------------------------ 1970年1月1日9時00分00秒のエポック秒は -3600 です。 1970年1月1日10時00分00秒のエポック秒は 3600 です。 エポック秒 0 は 1970年1月1日09時00分00秒 です。 ------------------------------------------------ となります。なぜこのように矛盾するのでしょうか。 私が正しく理解できていないだけでしょうか。 教えてください。お願いします。

    • ベストアンサー
    • Perl
  • サーバ時刻同期処理について

    時刻同期について以下のような現象が発生しております。 環境 lenovoサーバー Think system SR530 FSを5台使用してネットワーク監視カメラのモニタリングと映像録画のシステムを構築し稼働しています。(1)管理用サーバ (2)待機用サーバ (3)(4)(5)は録画サーバとします。すべて同スペック 1.NTPサーバと(1)を(1)のWindowsタスクスケジューラにてnet timeコマンドで1日1回同期をとっています。 毎日 21:29分 2.(1)と(2)を(2)のWindowsタスクスケジューラにて同様に時間は1分後にとっています。毎日 21:30分 3.(1)と(3)を(3)のWindowsタスクスケジューラにて同様に時間は1分後にとっています。毎日 21:31分 4.(1)と(4)を(4)のWindowsタスクスケジューラにて同様に時間は1分後にとっています。毎日 21:32分 5.(1)と(5)を(5)のWindowsタスクスケジューラにて同様に時間は1分後にとっています。毎日 21:33分 4日周期で時刻ずれによる同期更新となります。 1日目上記2,3,4,5がすべて(1)より1分43秒遅れている同期となります。   ただし1のNTPサーバとの(1)の同期は秒単位までは誤差なしで同期となっています。 2日目も1日目と同じです。(時刻同期されたにもかかわらず1日で1分43秒遅れとなっています) 3日目1の時刻同期がタスクスケジューラは1回の指定にもかかわらず3回起動され   1回目は秒単位まで誤差なしで同期、2回目は(1)がNTPサーバーより5分24秒進んでいる同期、   3回目は5分26秒戻った状態で秒単位まで誤差なしで同期となります。   その後2,3,4,5がすべて(1)より3分26秒進んでいる同期となります。   これはおそらく1日目、2日目と同様1分43秒遅れから5分24秒進んでいたことの差で   3分26秒進んでいた結果の同期となったと思われます。 4日目は1,2,3,4,5すべて秒単位まで誤差なしの同期となっています。 5日目は1日目と同様、以降上記4日間周期で約1ヶ月続いています。 1このような現象が発生したことはありますでしょうか 2サーバが1日で1分43秒もずれてしまうことはありますでしょうか 3原因を調査する方法はありますでしょうか 以上、よろしくお願いします。 ※OKWAVEより補足:「Lenovo:Windows関連」についての質問です。

  • 計算機時刻について(閏秒)

    計算機の内臓時刻を読み込んで処理するアプリケーションを開発していますが、「2006年1月1日に08:59:60が挿入された」という記事がありましたが、Windowsの処理に問題はなかったのでしょうか? NTPサーバに接続されていない計算機は、閏秒が発生することじたい認識できないと思いますので、無視されていると思いますが、 NTPサーバに接続されている計算機で、たまたま偶然2006年1月1日に08:59:60に更新したファイルは、更新日時の秒は60秒って表示されているのでしょうか? WindwsXPは閏秒認識しているのでしょうか? 普通、秒は0~59の範囲でチェックを行っているアプリケーションが大半だと思いますが、閏秒で不正な時刻としてエラーになったという、事例を聞いたことはないでしょうか? ちなみに、Windwsの時刻のプロパティで60秒は受け付けられませんでした。

  • XWindow画面右下の時計

    サーバの時計あわせで詰まってしまいました。 OSはRHEL3です。 時間あわせはntpデーモンでNTPサーバと同期を取っています。 システム・ハードウェアクロック共に問題無いのですが、 タイムゾーンも東京になっているのにXWindow右下の時計だけ、 時間が2時間遅れてしまいます。 クーロンの実行時間も2時間遅れてしまいます。 原因がわかる方、ご教示お願いします。 #date 2007年 2月25日 日曜日 12時58分26秒 JST #Clock 2008年02月25日 12時58分48秒 -0.616793 秒 #cat /etc/adjtime -4005.406740 1175317286 0.000000 1175317286 LOCAL #diff /usr/share/zoneinfo/Asia/Tokyo /etc/localtime 差異無し 宜しくお願い致します。

  • NTPについて教えてください。

    NTPについて教えてください。 2017年1月1日に行われるうるう秒ですが、Windowsとして影響ないとのことですが、 以下HPに記載のある 『ただし、外部の NTP サーバーが、値が 01 である Leap Indicator を Windows タイム サービスの NTP サーバーに送信すると、Windows NTP サーバーは次の NTP クライアントに同じ値を送信します。』 https://support.microsoft.com/ja-jp/kb/909614 これはWindowsがクライアントであった場合、影響はないが、NTPサーバであった場合、 そのWindowsが同期しているNTPから Leap Indicatorが送られると、そのクライアントにも 1秒挿入が行われるのでしょうか? Linuxが同期しているNTPがWindowsサーバであった場合、2017年1月1日のうるう秒 の 影響はあるのか確認したく教えてください。

  • Windows Server について

    目的 : サーバを再起動させる際に、ソフトウェアクロック(システムクロック?)をハードウェアクロックに反映(同期)したい。 環境 : サーバ側は通常NTPサーバで上位システムから時刻同期している。 質問 : 1. ソフトウェアクロックとは何ですか。システムクロックのことを指しているのでしょうか。 2. BIOS画面から確認できるのは「システム時刻」と表示されています。これをシステムクロックだと解釈しますと、システムクロックはあくまでOSが管理しているものという認識なのですが、BIOS画面からではハードウェアクロックの時刻確認はできませんか。 3. マシンのハードウェアクロック時刻をコマンド等で取得、変更する術はございますか。 4. timeコマンドはシステムクロックを取得したり変更したりするものですよね。それをハードウェアクロックに反映させるにはどうすべきでしょうか。

  • うるう秒について

    来年の平成18年(2006年)1月1日(日) 午前8時59分59秒と午前9時00分00秒の間に「8時59分60秒」 をするみたいですよね もし「うるう秒」を実地しなければ、不具合が発生するのでしょうか? 詳しい方は、是非!!簡単に教えて下さい

  • Excelの時刻記入に関して

    Excelの時刻表示に関して質問です。 ■質問1 例えば、A1に「3時間5分52秒」、A2に「6時間30分24秒」、A3に「10時間7分03秒」など、毎日、一つのことにどのくらい時間をかけたかExcelでメモしていきたいと思っています。1カ月ごとにトータル時間を計算したいのですが、どのように時刻の足し算をすればいいでしょうか?2月1日はA1、2月2日はA2、という風に下にどんどん記入していきます。 ■質問2 トータル時刻を足す場合、分や秒の記載は03分02秒など、最初に0をつけた方がいいでしょうか? ■質問3 そもそも、時刻を「3時間5分52秒」と記載する場合、ユーザー定義をした方がいいでしょうか?手入力で問題ないでしょうか?ユーザー定義が必要な場合、時分秒と漢字表記にする場合の方法と、時刻をセルに打ち込む際に、どのように打ち込めばいいか(3時間5分52秒の場合、3/5/52なのか3・5・52なのか等)教えていただければ幸いです。 いろいろすいませんがご助言なにとぞよろしくお願いいたします。

  • 中学受験算数

    2つの時計があります。午前0時になると、1つの時計は6秒早く進んでしまい、もう一つの時計は12秒遅れてしまいます。1月1日の午前0時に二つの時計を正確な時刻に合わせました。ある日二つの時計を見ると、一つは午前7時28分26秒を、もう一つは午前7時15分50秒を指していました。 (1): 本当の時間は午前何時何分何秒でしょうか。 (2):この日は何月何日でしょうか。 解き方がわかりませんので、どなたか教えてください、よろしくお願いします。

  • UNIX時間で今月1日~末日を取得するには・・・

    PHP4.x.xです。 初心者です。 ショッピングカートの注文データを閲覧するページで 「今月一ヶ月間の売り上げ」という表示の仕方をしたいです。 売り上げテーブルのorder_dateというフィールドに注文された日時がUNIX時間(エポック秒)で入っています。 人力で2009年11月1日0時の数値を求め、2009年11月30日11時59分59秒の数値を求め、select * order where order_date >******* and order_data <****** とすることは簡単なのですが・・・あまりにも美しくない、かつ何年後までやるねん・・・と面倒くさい。 何かいい方法でしょうか?

    • ベストアンサー
    • PHP