您的位置:首页 > 运维架构 > Linux

Linux Ramdisk启动方式下文件系统兼容性快速排查。

2013-11-05 06:36 295 查看
最近做项目的时候遇到一个问题,有一个基于飞思卡尔(Free Scale)PoperPC E500_MC(multi-core)的介质板需要做Ramdisk启动。因为之前做过E500_V2架构的RamDisk,所以觉得这个应该不算很难。

下面是开发的一些环境:

1. 架构: PowerPC e500-mc. 我们使用的是八核的处理器。

2. Bootloader: U-boot.

3. Flash: 8M, 这个是一个很大的限制因素,因为如果使用initramfs启动的话,文件系统得不到充分的压缩。如果在编译内核的时候选择CONFIG_optimizing for size的话,编译器将使用-Os(文件大小优化)代替-O2(性能优化),这是项目不允许的。但是如果不选择的话,对于可用的flash只有大概6M多的话,initramfs就不够用了。所以这里必须用Ramdisk.分开编译内核和文件系统。

4.文件系统(file system): 这里主要是要弄个busy box进去执行一些简单的指令。

于是我生成了uImage, dtb 和 uRamdisk三个镜像文件,烧写到NOR FLASH里面以后使用脚本启动,每次初始化的时候都会有一个错误(exception).信息是这样的:

Kernel panic-- not syncing! Attempt to kill init. 然后因为我在bootargs里面设置了panic=1, U-boot会自动reset. 也就是说,这三个镜像文件不能使这块板子以RamDisk的方式启动。

这时候就必须查找是哪个文件的问题。鉴于DTB(device tree blob)的文件只是描述设备的文件,不管怎么编译内核这个都是不变的,所以这个可以先被排除掉。现在只剩下内核和文件系统了。于是我只把新的内核和DTB烧到flash里面,然后使用原有的NFS(network file system)去启动,成功了。当然,这个新的内核和老的内核是不一样的,现在成功启动不代表兼容Ramdisk. 所以还需要简单测试一下。

因为我做的Ramdisk是ext2格式的,所以我这样试一下。

//首先看看/dev里面有没有ram设备

# ls /dev/ram*

//格式化任何一个ram为ext2系统

#mke2fs /dev/ram0

//创建一个文件夹

# mkdir /tmp/ramdisk

//挂载这个文件夹到ram0

# mount /tmp/ramdisk /dev/ram0

这些指令都成功了,所以说明这个内核是基本支持Ramdisk的。 现在要检查的是uRamdisk这个文件了。

开始的时候我确实不太清楚应该怎么检查,后来同事说要用chroot这个命令更换根文件系统(root file system). 我觉得很有道理,于是接下来我是这么做的:

1. 使用原有内核和原有NFS启动。

2. 得到uRamdisk(注意这里是没有压缩过的)的存放路径后,进入该路径。

3. 使用chroot . /bin/ash.(如果有/bin/bash的话,可以直接使用chroot . 后面缺省。因为我用的是busy box,所以没有/bin/bash。注意这里必须有root权限)。

结果是系统返回illegal instructions. 说明内核和这个文件系统不兼容。这样的话就基本确定了是文件系统的问题。下一步将具体检查文件系统。

P.S:因为现在用的文件系统是之前给PowerPC e500_v2使用的,可能是因为架构有变化,文件系统不支持了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐