[go: up one dir, main page]
More Web Proxy on the site http://driver.im/

WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

VMware で Linux を動かした際の時刻のずれを解消する(続き)

先日、応急処置を行った Linux ゲストOSの時刻遅れですが、やはり気になるのでもう少し調べてみました。

原因

いろいろググったりしたところ、最終的に VMwareKnowledge Base のページにたどり着きました。なにやら長々と書いてありますが、時刻がずれる原因は以下のようなことらしいです。

  • Linux OS では、タイマー割り込みをカウントすることで時刻を管理している。
  • 2.4 カーネルまではタイマー割り込みの間隔は 100 Hz だったが、2.6 カーネルから 1000 Hz にアップしている。
  • さらに、SMP カーネルでは 1 秒に 1000×(CPU数+1)回のタイマー割り込みが発生する。
  • エミュレーションされた仮想マシンでは、こんな頻度の割り込みは処理できない。そのため、時刻が大幅に遅れる。
  • 実際のハードウェアでもタイマー割り込みの取りこぼしは発生するが、Linux 2.6 にはこれを補正するコードが含まれている。残念なことにこのコードはいくつかの場面において、まやかしの補正を引き起こす。このため、時刻が実際よりも進んでしまうことがある。この現象は仮想マシン上でより多く発生する。

というわけで、APM を有効にしていたときはタイマー割り込みの取りこぼしが頻繁に発生して時刻が大幅に遅れていたわけです。APM を無効にした後は、最後の「不正な補正」が時々発生して、徐々に時刻が進んでしまった、ということですね。

対策

対策として、主に以下の 3 つが提示されています。

  1. カーネルの起動オプションとして "clock=pit" を指定する。(時刻が進む場合の対策)
  2. カーネルの起動オプションとして "nosmp noapic nolapic" を指定する。(時刻が遅れる場合の対策)
  3. タイマー割り込みの間隔が "/usr/src/linux-2.6/include/asm-i386/param.h" 内の "HZ" マクロで定義されているので、それを "100" に変更してコンパイルする。

基本的に仮想マシンの CPU がひとつのときは (1) と (2) を、CPU 数を 2 にしているときは (1) と (3) を適用するのがよいようです。私はカーネルコンパイルのたびにソースを書き換えるのはうざいので、(1) と (2) を適用することにしました。

やってみる

上記 (1)、(2) の対策を適用するには、"/boot/grub/grub.conf" を変更します。root ユーザーでログインし、"/boot" をマウントして vim"/boot/grub/grub.conf" を読み込みます。

mount /boot
vim /boot/grub/grub.conf

以下のように kernel 行にプションを追加します。

kernel /boot/kernel-2.6.14-gentoo-r5 root=/dev/sda3 &color(red){clock=pit nosmp noapic nolapic}

カーネルコンパイルの際に SMP を無効にしていれば、nosmp は必要ないと思われます。指定しても悪影響はないはずなので、心配ならば念のため付けておきましょう。変更したらファイルを保存し、ゲストOSをリブートします。

shutdown -r now

成果

以上の対策を施した後、時計を合わせて半日ほど放置してみました。結果、時刻のずれは 1 分前後。前回よりも改善されています!ヽ(´▽`)ノ GentooLinux のインストールの記事も、これにあわせて修正しておこうと思います。

Knowledge Base では、これに加えて VMwareTools の時刻同期を使用するように勧めています。しかし、X がないので設定ができない orz。これに関しては、今後の課題として残しておこうと思います。設定ファイルを直接書き換えることで設定できました。詳細はコメントを参照してください。アドバイスいただいたさひろさん、 revulo さん、ありがとうございます!

関連記事

この記事にコメントする