官方QQ群收藏本站

百问linux嵌入式论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2627|回复: 1

构建根文件系统之出现的问题和解决方法

[复制链接]

7

主题

16

帖子

85

积分

注册会员

Rank: 2

积分
85
发表于 2012-3-25 15:53:00 | 显示全部楼层 |阅读模式
移植过程中的问题和解决办法
1.busybox编译时出现以下错误:_cpu_to_be16,iptunnel未定义错误。解决这个问题有两个方法:
        1.在networking/libproute/iptunel.c中#include<asm/types.h>下面加上#include<asm/byteorder.h>头文件。
        2. Make menuconfig 取消iptunel这个选项。
第一种方法编译完iptunnel这个命令仍然可以使用
第二种方法iptunnel命令则不能使用,因为直接把它去掉了,这有点好像哪里有问题就不接把那部分去掉,而一种方法是哪里有问题是去修复它使它恢复正常!!
2.将image烧到flash后,启动出现下面问题:
VFS: Mounted root (yaffs filesystem) readonly.Freeing init memory: 120KWarning: unable to open an initial console.Failed to execute /linuxrc.  Attempting defaults...Kernel panic - not syncing: No init found.  Try passing init= option to kernel.首先,可以确定的是应该先去分析第一个警告信息,后面的问题也许就是这个警告信息引起的。
解决方法:从上面分析启动过程可知Warning: unable to open an initial console.出现这个警告的原因是由于根文件系统虽然被正确挂接了,但是里面的内容不对,或是没有dev/console这个文件。但是,/dev/console这个文件肯定是存在的,里面的内容反复参考嵌入式linux完全手册,以及在网上搜索制作根文件系统的资料,也确定是没有问题的。这个问题纠结了一个晚上还是没有弄好,晚上睡觉也不踏实。于是第二早上起来,在网上继续寻到解决方法,后来发现这篇博文http://blog.csdn.net/itismine/article/details/4799770里面提到一点很重要,就是mkyaffs2image生成的image 文件的OOB区数据格式要与linux kernel对nand flash进行读取时的数据格式保持一致,所以mkyaffs2image.c中来自linux kernel的数据结构,即包含了mtd-abi.h头文件。其实,这个问题嵌入式linux完全手册也讲到了,况且我使用的是老大(韦东山)打好补丁的mkyaffsimage工具,所以没有去想是mkyaffsimage的问题,总是想自己操作失误或是遗漏什么东西,这可能是每个新手都会怀疑的。好了,既然是这样,那么我就直接用开发板直接提供的mkyaffsimage工具试试,于是把以前的mkyaffsimage删掉,也许有些新手由于时间久了忘了mkyaffs2image放在哪了,不知道去哪删除,以前我也不知道。其实很简单,首先使用which mkyaffs2image 找到mkyaffs2image位于哪里,然后直接去那个目录删掉。之后,我把板子自带的mkyaffs2image工具安装好,重新打包,再把映像文件下载到nandflash,重新上电,又有第三个问题。
3.重新上电后,出现下面问题:

图片3.jpg
        
嘿嘿,到这里至少第一个警告已经解决。到这步可以说是完成了85%的工程了,继续分析问题。Failed to execute /linuxrc.  Attempting defaults 。首先可以确定的是linuxrc的权限我已经改过来了,权限是没有问题的。再一个是由于我用的是动态库,也可以确定我的动态库全部拷贝了,所以这个问题不是由于上面两个原因导致的。在网上搜了下这个问题,大部分的解决办法都是修改权限之类的,实在是没有办法了,然后这个问题我在韦东山linux视频群提出来了,老大(韦东山)很快就回答了,下面是老大的回答:

,

,

,

,


首先去,老大(韦东山)给了的链接查看了下,这是老大恢复的类似问题的答案,我摘取部分放在下面,如下:
它说得很明显,"Failed to execute /linuxrc"──执行/linuxrc失败:它为什么要执行/linuxrc,还不是因为你在命令行中加入了“init=/linuxrc”这个参数。它为什么会失败?
原因有二:
一、你制作文件系统映象时,rootfs目录下有linuxrc这个文件吗?
二、rootfs目录的linuxrc文件是正确的吗?
     请好好确定这两点,大多数是没有linuxrc文件──linuxrc是busybox自动生成的,只要配置好就可以。如果有linuxrc,那么就是它无法执行了(解决方法在下面)。不用linuxrc行不行?当然行!看看内核文件init/main.c,有如下字样:    run_init_process("/sbin/init");    run_init_process("/etc/init");    run_init_process("/bin/init");    run_init_process("/bin/sh");    panic("No init found.  Try passing init= option to kernel.");就是说,它会依次尝试执行/sbin/init、/etc/init、/bin/init、/bin/sh这些文件,都失败后才打印出错信息"No init found.  Try passing init= option to kernel."。所以,出现这个出错信息时,就表明了没有或是无法执行这些文件:命令行参数“init=xxxx”来指定的xxx文件、/sbin/init、/etc/init、/bin/init、/bin/sh。
一、请检查你的rootfs目录,看看这点些文件是否存在二、使用file命令看看它们是什么文件类型,是否可执行。使用busybox时,这些文件是到/bin/busybox文件的链接,那就看看busybox的文件类型,可以使用下面的命令:$ file linuxrclinuxrc: symbolic link to `bin/busybox'$ file bin/busyboxbin/busybox: ELF 32-bit LSB executable, ARM, version 1, for GNU/Linux 2.4.3, dynamically linked (uses shared libs), stripped注意了:如果bin/busybox 是一个动态链接的文件,还要把它用到的库复制到rootfs中。唉,越说越复杂了。这些库在交叉编译工具的相应目录下,如果不知道,查google,否则再发帖。
上面是老大(韦东山)的回答,看了以后,我大概知道问题的方向了,linuxrc是存在的但是无法执行这个文件。但是,在这里有点小小的愚昧,其实老大这里已经有了发现问题的答案,但是我没有注意。在这里,有两点我没有注意,现在想起来觉得当时好笨。第一,既然是linuxrc无法执行,那么我就应该看linuxrc执行所需的必要条件,linuxrc是依赖动态库的,动态库是从交叉编译器里面拷贝出来的,这些库与内核版本有密切关系,交叉编译高的版本对内核的版本也要求高,低版本内核可能运行不了。那么怎么查看当前可执行程序所要求的内核版本呢?那就是老大(韦东山)给的答案,file命令。这个步骤我是到后面才做,所以等下再说它的用法。第二,老大提醒了用file查看文件类型,是否可执行。我确实查看了,但是我只注意了ELF 32-bit LSB executable, ARM,这个东西。好了,当时自认为这里没有我要的答案,于是回到群里按照老大(韦东山)的另一个思路去解决,那就是用nfs网络文件系统启动,确定文件系统没问题。这个思路怎么自己就没有想到呢?唉!根据这个方法就判断到底是那边出了问题,根据结果可以判断问题的的方向了。这是动手之前应该要理解到这一点,如果可以从nfs启动文件系统,那么问题出在mkyaffs2imga工具使用或flash烧写的,根文件系统是没有问题的。如果nfs没有启动文件系统,那么原因就复杂一点,一个就是根文件系统的问题,当然mkyaffs2image有没有问题还不能确定。有了这个思路,解决问题的方向清晰了很多。回到问题本身吧,这样说下去没完没了的。(肯定有人拍砖了,这只是我的想法,有不同意见贴上,讨论,讨论)
网络启动根文件系统
        网络启动根文件系统简单的说:首先服务器也就是pc机必须开启nfs服务并配置好相关文件,防火墙是关闭的。其次是客户端也就是开发板必须支持网络,及配置相关参数以从网络上启动。下面是我的方法:
        服务器的配置:修改nfs配置文件/etc/exports 内容增加 :
         /nfsboot         *(rw,sync,no_root_squash)
        然后重新启动nfs:service  nfs  restart  。注意关闭防火墙
        c)  客服端的配置:服务器的配置是在命令行界面完成的,是已经挂载了文件系统。但是开发板就是因为启动不了文件系统啊?!别当心,在学习uboot的时候不是看到过下面这个图么:
           
                                     uboot        bootargs        kernel        filesystem
            也就是u-boot启动的时候,可以传递参数给kernel。好,就用这个方法,好像也只有这个方法用。有人可能又要拍砖了,肯定不止有这个方法了,传递参数给kernel,那我直接在kernel里面写死,然后重新编译内核,方法也是可以的。相信你不会用 这个方法了。下面就说下怎么设置这个参数,重新上电,马上按空格键,这是进入 uboot它的下载模式。进去后,在根据界面的提示,选择某个选项进入u-boot的命                令行,tq2440提供的u-boot是按q。接着就是设置参数,方法:
        Setenv bootargs noinitrd root=/dev/nfs console=ttySAC0 init=/linuxrc
        Nfsroot=192.168.1.115:/nfsboot
        Ip=192.168.1.6:192.168.1.115:192.168.1.1:255.255.255.0::eth0:on
        然后,保存  saveenv  在重新启动,reset
        上面的配置根据实际情况设定:启动192.168.1.115是服务器的ip,192.168.1.6是        板子的ip,192.168.1.1是网关,255.255.255.0是掩码.注意,这里设置与setenv ipaddr          的不同的。setenv ipaddr设置的是在uboot下使用的网络。好了,完成之后可以启动了,启动后有新问题5了
重新启动后,出现
VFS: Mounted root (nfs filesystem).
Freeing init memory: 176K
FATAL: kernel too old
Kernel panic - not syncing: Attempted to kill init!
网上搜了下,很快找到答案了,可以总结为:
可以看出根文件系统已经挂载成功,但是报错说内核版本太老。
这个错误是根文件系统的程序报的错,不是内核报的错。我猜他想说FUCK: kernel too old !
如果想确认文件系统要求的最低内核,可以使用file命令查看libc-*.so文件,如:$ file libc-2.11.2.solibc-2.11.2.so: ELF 32-bit LSB shared object, ARM, version 1, dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped

我用的内核是2.6.30的,所以很明显是内核版本低了,解决的方法有两个,一是换内核,二是换个低的交叉编译器,所以版本也不是越高越好,要协调发展啊!!!。我是采用了第二种方法,交叉编译器版本是:
[root@localhost lib]# arm-linux-gcc -v
                                    ......
                                 Thread model: posix
                                  gcc version 3.4.5
然后文件系统要求的最低内核是:

图片4.png
显然我的内核肯定支持啦~!接下是重新制作busybox,方法一样的。然后,重新上电,
哈哈!!!出现让人激动的的控制台啦!如下:

图片5.png

当然你也可以敲入命令:比如ls

图片6.png

激动啊!
好了,我的根文件系统没有问题,那么接下来把它制作成映象文件烧到板子上试试。方法也是上面提到的。结果,依然是激动的。哈啊!可以启动,贴图,有图有真相:

图片7.png

细心的你会发现里面有个bad的啊,这个问题很容易解决,这就不说了饿!!!如果不会我们在讨论!
回复

使用道具 举报

56

主题

5186

帖子

7811

积分

超级版主

Rank: 8Rank: 8

积分
7811
QQ
发表于 2012-4-6 07:57:00 | 显示全部楼层
:strong:
回复 支持 反对

使用道具 举报

技术支持
在线咨询
咨询热线
0755-86200561
微信扫一扫
获取更多资讯!

Archiver|小黑屋|百问linux嵌入式论坛     

GMT+8, 2018-12-18 19:47 , Processed in 0.492337 second(s), 20 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表