2012年5月23日水曜日

閏秒を再現させる試行錯誤(成功したと言って良いのか?)

まず、日本標準時プロジェクトの`Perl版SNTPサーバ うるう秒テスト用バージョン'をコピペ。
現在時刻でLIを01にしてくれる様にパラメータをちょこちょこ書き換える。


…なんかLI以外もいじっている気がして自分で書きたかったんだけど、本業(?)で時間を食われたのでパス。
車輪の再発明大好きだけど。




で、隣のホストから(ポート入れ替えるの面倒)ntpdateでアクセス。
tcpdumpで見る限り、LIは01でちゃんと返っている。
ここからadjtimexを見てStatusが16(=inserting leap second)になっていれば大満足なんだけど、
Statusは64(=clock unsynchronized)。


なんかadjtimexのステータスを勘違いしてるのかな。。


kernel-2.6.18のSRPMを落としてきて、timer.cをいじって再コンパイル。
LI無視して、毎00秒に閏秒を無理矢理挿入するロジックに変更する。
 ⇒と思ったら、一度00秒を迎えると毎秒閏秒扱いにしていつまでも59秒から時間が進まないカーネルが出来上がった。
  printkで毎秒、leap secondをINSERTしたよって言っててかなりコンソールがうるさい。

再現させて気付いたんだけど、閏秒は00:00:00 UTCかつLI=1のときにタイマーをデクリメントしてるから、
23:59:59 UTCが2秒続いて次は00:00:00って動きになるのね。
(だから59秒から時が進まなくなったのだ、私のカーネル)


今のところCPU振り回して(cat /dev/urandom > /dev/null &でCPU数の倍タスクを回す)もハングしないなぁ。。
printkはちゃんと利いてるから、想定どおりに動いてはいるはずだけど。
VirtualBoxだからいけないのかしらん。
時間があればPCサーバでコンパイルしなおそう。。

0 件のコメント :

コメントを投稿