忙了一整個下午,到現在終於解決掉 VMware 裡 Linux 2.6 guestOS 系統時間 (clock) 會延遲 (too slow) 的問題了。

Linux 2.6 核心裡把系統計時器的頻率 加高到 1000 Hz ,VMware 沒辦法真的每隔 1ms 就報一次訊號給 guestOS,所以 guestOS 裡的 Linux 2.6 無法確實接到計時器的訊號。

本來這也不應該造成問題,不過 2.6 核心處理這個 "tick loss" 的程式有問題 (一樣看 這裡 ),以致於 guestOS 裡的 Linux 2.6 系統時間走一秒會慢一秒;外面過了兩秒裡面只過了一秒。

VMware KB 裡有幾個與此有關的項目 (如 Virtual Machine Seems Slow when Running a Particular Program (Clock Issue)Clock in a Linux Guest Runs More Slowly or Quickly Than Real Time),不過真正有完整資訊的是 這個討論串

要在 Debian 下解決這個問題,須進行兩個動作。

重新編一個改過的核心

聽起來很麻煩,實際上卻是可以照表操課的。難是不難,只有電腦比較辛苦;在我的 P4HT 3GHz/2GRAM 上也跑了大概半個到一個小時吧。

為了簡化核心的編譯,要用 kernel-package 這個套件來幫忙。它裡面有一個 make-kpkg 工具,可以從 Debian 的 kernel-source 套件裡直接產生 kernel-image .deb 檔。

當然要先取得原始碼:

$ apt-get install kernel-source-2.6.8
$ cd /usr/src; bunzip2 kernel-source-2.6.8.tar.bz2
$ tar xf kernel-source-2.6.8.tar

編譯之前不要忘記安裝相關的套件:

$ apt-get install libc6-dev ncurses-dev

當然像 gccbin86 也要記得裝。

我們要對原始碼 作一項修改 。一定要作,否則這樣重編就沒意義了。要把 include/asm-i386/param.h 第 5 行裡的

#define HZ             1000             /* Internal kernel timer frequency */

改成

#define HZ             100             /* Internal kernel timer frequency */

意思就是讓計時器慢到 100Hz (請不要改成其它值)。然後用 make menuconfig 來組態一下 CPU 型態即可。

為了建出 kernel-image .deb 檔,我們不用 make 來建立核心,而用

$ make-kpkg --initrd --revision=vmware1 kernel_image

這個指令。不要漏掉 --initrd ,因為 kernel-source 裡的核心原始碼是已經被 Debian patch 過的,需要 initrd 才能啟動;沒有加 --initrd 的話,開機時會 kernel panic。

等到你洗完澡以後,作好的 kernel-image .deb 會放在原始碼的上一層目錄裡面,可以用

$ dpkg -i ../kernel-image-2.6.8_vmware1_i386.deb

來安裝。

修改核心啟動參數

安裝好了自訂的核心後,我們還要加上 clock=pit 參數給核心,指定使用 pit (programmable interrupt timer) 。因為現在裝 Sarge 多半 d-i 會預設給我們 grub,所以請到 /boot/grub/menu.lst 去改一下

# kopt=blahblah

clock=pit 接到後頭去。感謝 kanru 消除我對 grub 的惡感 ;其實 grub 是還蠻好用的 (只是和 lilo 差好多,一開始不習慣)。作了以上的修改之後跑一下 update-grub 然後重新開機即可。不過我還沒搞清楚修改 grub 預設啟動項目的方法,所以請在重開機的時候手動調一下,改用剛剛改好裝好的新核心。

現在終於不會延遲了 :)

$ date ; ssh guestos date
Sun May 22 23:34:12 CST 2005
Sun May 22 23:34:12 CST 2005

再配合 ntp-server ,兩邊的時間應該可以同步得很準確。

另外的解決方法

其實以上的解法不是唯一的, 有些人也提出了一些其它的方法 ,譬如讓 hostOS noacpi 。不過這些 workaround 有蠻多副作用的,而這些副作用又會 作用到 hostOS 身上 ,實在抵觸了使用 VMware 這類技術,希望對平台環境進行隔離的這個主要目的。

我希望就算系統不穩定,也是 guestOS 不穩,不要讓 hostOS 不穩,因此就不去研究 (也沒時間) 那些其它的解決方法了。

目前一直到 2.6.11 都有這個問題,當然,我想將來的 2.6 一定可以解決,等等看吧。

Posted by yungyuc at 23:42, 0 comment, 0 trackback.
Navigate
Add a trackback
Add a comment

Your name. (required)

Your personal website. (optional)

Your email address. Will not show in page. (suggested, but optional)

Text format is "Plain Text".

Enter "QquYm"
© hover year to navigate month: powered by django