之前試用Chromeos時,在我的機器上跑起來非常慢,而且一段時間就會當掉。在噗浪上看到Jserv大大的噗說,Chromeos的window manager使用到Clutter這個函數庫,於是去http://www.clutter-project.org/網站看了一下,發現這個函數庫底層除了xlib,最主要的就是包裝OpenGL做出來的GUI API...所以強烈懷疑是因為驅動程式沒有支援硬體3D加速所以才讓Chromeos跑得那麼慢。
所以就來自己手動把nvidia的驅動程式加到chromeos吧。
我使用的平台是Ubuntu 9.04。需要的知識大概有:怎樣自己建構編譯出可執行的Chromeos、一些核心編譯的知識、一些軟體編譯的知識、把disk image掛載到檔案系統、chroot及下面提到的一些命令。(我不會詳細把命令列出來,所以最好熟悉這些命令)
作法
到nvidia網站下載最新的linux驅動程式,是一個以.run結束的可執行檔,我使用的應該是190.42這個版本
用-x參數來執行,他會把所有檔案解出到一個與檔名相同的目錄(不含.run)。然後把usr/src/nv(應該沒記錯)目錄拷貝到chromeos開發的chroot環境中(應該是在chromiumos/src/chroot)
在chromeos開發的chroot環境中,在執行完build_platform_package.sh, build_kernel.sh, build_image.sh後,進入到上述目錄,使用make module SYSSRC=/path/to/the/kernel/source(這個目錄會在~/trunk/src/build/kernel/{kernel_name}/{kernel_version}(希望沒記錯,有錯等一下再改))命令來建構nvidia的kernel module。完畢後會在nv目錄裡面產生nvidia.ko。
接下來需要手動安裝這個kernel module,把剛剛用build_image.sh建構好的disk image(檔名叫做rootfs.image,會放在~/trunk/src/build/image/{build_version}目錄底下)掛載到檔案系統中,使用install命令把nvidia.ko安裝到disk image掛載目錄底下的/lib/modules/{kernel_name}/kernel/drivers/video目錄中。然後執行depmod命令來更新dependency檔。(要用哪些參數請自行man一下,需要用到正確的System.map、指定正確的version及檔名)
接下來需要離開X,用sudo init 1然後選擇使用root帳號
把剛剛的rootfs.image掛到檔案系統,然後可以先執行步驟1提到的執行檔,加上-A來看看有哪些進階參數可以用,需要指定所有安裝細節的目錄選項,並且選擇不執行kernel module的安裝選項,(用到的大概有十幾個選項,而且要加上許多完整目錄名稱以指到rootfs.image中的相關目錄,所以落落長,最好做成script來跑,這樣也方便調整參數)來進行X Window驅動程式、extension以及一些軟體、動態程式庫的安裝。安裝完畢後,chroot到rootfs.image掛載的目錄,執行ldconfig -v來確保上面的東西有正確安裝。
修改rootfs.image掛載目錄中的etc/X11/xorg.conf,適當調整參數,需要把driver指定為'nvidia',並且載入glx模組。
修改rootfs.image掛載目錄中的boot/extlinux.conf,拿掉i915.modeset=1核心參數
使用image_to_usb.sh把chromeos安裝到usb隨身碟(至少需要4G),然後用他開機
Chromeos跑起來就非常快
測試結果
沒有使用nvidia的官方驅動程式時,在xterm使用top,會看到chromeos_wm使用cpu大約在14%,安裝好以後...嘿嘿,平均是0%,速度超快,而且不會當掉了。
(昨天更新source時,看到ibus-chewing目錄喔,不過好像還沒放進platform package的建構中,應該不久就會有新酷音輸入法可以用了)
影像檔分享:
http://www.keepandshare.com/doc/view.php?u=1580589
解開來後必須使用chromiumos開發環境裡面的image_to_usb.sh來把他燒進USB隨身碟,隨身碟必須至少有4GB。另外,這是專為使用nvidia顯示卡的電腦做的,在別家顯卡的電腦應該不能跑。(nforce可能也不行)
要怎麼使用image_to_usb.sh...他有兩個參數,一個指向影像檔路徑(--from=影像檔目錄的完整路徑)另一個指向usb隨身碟(例如隨身碟是sdc,那就是--to=/dev/sdc)