天天看點

U-Boot: inflate() error 和 unable to open an initial console

        最近開始做 PowerPC 上的一些東西,在編譯核心,啟動核心的過程中遇到了很多問題,這兩天都塊搞屎我了……

U-Boot: inflate() error 和 unable to open an initial console

        不過最終還是解決了,現在把我遇到的問題和解決辦法貼在這裡,可以供大家參考,也友善我下次遇到同樣的問題時可以迅速的找到解決方案。但是需要說的是,導緻同樣問題的原因可能是多樣的,是以我的方法不一定百分百能解決大家的問題。先說下我的環境:

主機:Archlinux (Kernel 3.2.7-1-ARCH)

開發闆:AMCC PPC440EP Yosemite

編譯工具:ELDK 4.2 (ppc_4xxFP-gcc 4.2.2),make 3.82

根檔案系統:NFS (使用 ELDK 提供預設的檔案系統)

問題1

Uncompressing Kernel Image ... Error: inflate() returned -3
?UNZIP ERROR - must RESET board to recover
           

解決辦法:修改 loadaddr 的值。适當的加大 loadaddr 的值。在我的開發闆上,我把原來的 0x400000 改成了 0x600000。

參考:http://www.digipedia.pl/usenet/thread/11725/1540/

問題2

Warning: unable to open an initial console
           

核心加載到這裡就沒有動靜了。

解決辦法:後來發現在 ELDK 預設提供的檔案系統中沒有 /dev 這個目錄,當然目錄下的所有檔案也都沒有了。然而 Linux 啟動需要讀 /dev/console 這個字元檔案:

static int noinline init_post(void)
{
        free_initmem();
        unlock_kernel();
        mark_rodata_ro();
        system_state = SYSTEM_RUNNING;
        numa_default_policy();

        if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
                printk(KERN_WARNING "Warning: unable to open an initial console.\n");
           

沒有這個檔案當然也就無法完成啟動,是以手動為這個根檔案系統建立 /dev 目錄和 /dev/console 檔案:

# mkdir dev
# mknod console c 5 1
           

參考:http://armbbs.net/forum.php?mod=viewthread&tid=10256

問題3

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

解決辦法:這是說明你的 bootargs 中的參數有問題,請仔細檢查參數中有沒有什麼地方寫錯了,比如說 ip 位址,或者 NFS 的目錄,也請檢查你的 NFS 是否能被通路,可以使用同一個網段的另外一台機器試着挂載你的 NFS,看是否成功:

# mount -t nfs ip:/path/to/nfs /mnt
           

如果挂載失敗,那麼請檢查你的 NFS 服務和相關的服務是否開啟。還請檢查你的 /etc/exports 檔案是否配置好 NFS 的路徑和通路權限,以及 /etc/hosts.deny 和 /etc/hosts.allow 檔案,看是否禁止了别的 ip 通路你的機器。

如果正常挂載,那麼,如果你使用的 Archlinux,使用 NFS 時和别的發行版貌似有點不太一樣。設定 bootargs 參數中的 nfsroot 時,需要在 NFS 路徑後加上 v3 這個參數,這裡附上我的 bootargs 的内容:

=> setenv bootargs root=/dev/nfs rw nfsroot=192.168.1.173:/path/to/nfs,v3 ip=192.168.1.3:1992.168.1.173:192.168.1.1:255.255.255.0:shyodx:eth0:off console=ttyS0,115200
           

其形式為:

root=/dev/nfs rw nfsroot=serverip:/path/to/nfs,v3 ip=ipaddr:serverip:gatewayip:netmask:hostname:eth0:off console=ttyS0,115200
           

其中,serverip 是主機 ip 位址。/path/to/nfs 是 NFS 所提供的根目錄在你主機上的路徑,注意後面加上“,v3”。ipaddr 是開發闆的 ip,可以随意指定,但須和 serverip 在同一個網段。gatewayip 是網關位址。netmask 是子網路遮罩。hostname 是主機名,可随意。

        然後再次啟動就沒有問題了。NND,

U-Boot: inflate() error 和 unable to open an initial console

搞了兩天啊有木有!還一直以為是核心配置的問題,也想到是不是 u-boot 版本太低以至于無法和 3.2 的核心相容…… 唉……現在的工作就是把核心中一些不需要的配置去掉,編核心去了……

U-Boot: inflate() error 和 unable to open an initial console

繼續閱讀