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使用的,可能是因为架构有变化,文件系统不支持了。
下面是开发的一些环境:
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使用的,可能是因为架构有变化,文件系统不支持了。
相关文章推荐
- Linux在启动时利用NFS方式挂在根文件系统时无法初始化console的问题
- Linux-world-2012-January->8.3 (supervivi下从nfs文件系统启动)
- Linux 学习笔记_5_Linux引导流程解析_2_inittab文件剖析及系统启动流程分析
- 基于S3C2440的Linux内核移植和yaffs2文件系统制作--启动系统
- Linux下修改fstab文件造成系统无法启动解决一例
- linux系统启动卡在Loading Ramdisk to 1fa55000, end 1ffffa6e ...
- linux系统启动流程及常见故障解决方式
- linux系统启动流程及 MBR损坏,grub内容,文件误删,boot目录,分区误删修复
- linux 内核启动过程以及挂载android 根文件系统的过程
- 在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysfs、sysctl、系统调用和netlink
- 【mongodb系统学习之六】mongodb配置文件方式启动
- Linux下编辑文件方式Emacs 操作快速指南,快捷键速记
- linux系统上如何快速的查找一个文件?
- Linux文件虚拟机系统只读Read-only file system的快速解决方法
- Linux突然断电造成系统文件损坏而无法启动
- linux的几个内核镜像格式Image 和 u-boot启动内核和文件系统时的一些环境变量的设置
- 制作Ramdisk启动时编译文件系统的几个注意事项。
- linux下系统启动时,几个配置文件 /etc/profile、~/.bash_profile 等几个文件的执行过程,先后顺序
- 在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysfs、sysctl、系统调用和netlink
- 制作嵌入式linux文件系统(ramdisk,cramfs,squashfs)