天天看点

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

继续阅读