1. 要設定正確的核心起始位置、Offset與正確的系統頻率。當然必要的Device Driver也要記得掛入。我已經改出可用的 Kernel config(當然也加入了一些修改),可以到這裡下載: http://0rz.tw/r3LP9

2. 網樂通的rootfs是放在USB Stick上的,但是USB Stick要配置sd分割區之前,會經由USB probe到SCSI子系統上,再由核心找出正確的檔案系統以後才會產生sdX的資訊。但是,整個識別過程需要一些時間,若沒有做核心Hack,核心的init就會在sdX來不及產生前就嘗試掛載它,這會導致kernel pantic:


VFS: Cannot open root device 'sda2' or unknown-block(8,2)
Please append a correct 'root=' boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(8,2)


解決方法有兩種,我們可以在u-boot時,修改內建的bootargs,在尾端加上rootdelay=xx,xx表示要init等待的秒數,一般來說五秒足矣。若有些裝置(例如SD讀卡機或是硬碟等)需要更長的時間,就把秒數增加就好。
另外一種就是kernel hack,在核心程式碼 init/do_mounts.c 內,prepare_namespace() 函式實作內部加上delay:


if (root_delay) {
/* ... */
}
/* Stevennick Hack: force wait 5 seconds for device becomd ready. */
/* See https://blueprints.launchpad.net/ubuntu/+spec/kernel-boot-usb-roodelay */
ssleep(5);

/* ...*/


然後重新編譯kernel,應該就可以避免掉這個問題。

當然,由於我沒有網樂通的JTAG connector可用,在怕把u-boot弄壞的情況下,實在不敢下saveenv指令,不然,直接加上rootdelay參數,其實是比較好的解法。

若使用網樂通內部的核心開機,我們也會發現核心在掛載系統前會很明顯的暫停了一會,或許正是等待usb裝置就緒吧!
arrow
arrow
    全站熱搜

    stevennick 發表在 痞客邦 留言(3) 人氣()