Ramdisk根文件系统启动Linux(单独的ramdisk镜像)

开发环境:Ubuntu10.04

交叉编译工具链:univore32-linux-gcc 4.3.2 

嵌入式Linux内核版本:2.6.29.4-FriendlyARM

开发板:SEP6200
Bootloaderu-boot-2009.11


具体步骤如下:
1.解压内核源码树
解压kernel.tar.gz2到自己的工作目录,其他的开发板就自己找相应的kernel,或者自已移植


2.修改内核配置选项
进入内核源码目录目录

#cp config_mini2440_t35 .config 
#make menuconfig ARCH=arm

上面两句诗对用arm某开发板的,我是用的内核不具有代表性,就不在这里写了。
打开配置菜单,修改两个配置项,分别是:


a):General setup-->选择 Initial RAM filesystem and RAM disk...... 
b):Device Drivers-->Block devices-->选择 RAM block device support 

并检查Optimize for size是否被选中,如果没有则选中,此项优化内核大小,根据需要进行配置。
修改(8192Default RAM disk size kbytes选项为4096Default RAM disk size kbytes,之所以修改是因为我之后制作的ramdisk4096KB大小的。当然如果你想制作8192KB大小的ramdisk,这里就要对应为8192了,以此类推。但是最小系统嘛,是不用那么大的ramdisk的。此项的默认配置就是(4096),以前我改过这个配置,所以是(8192)了。如果这个大小和你做的ramdisk不匹配,则启动时仍然会出现kernel panic内核恐慌,提示ramdisk格式不正确,挂载不上ramdisk
然后特别要注意的一点是,ramdisk是一种内存虚拟磁盘技术,实质上并不是一种文件系统,它使用的文件系统时ext2文件系统。所以一定要在make menuconfig ARCH=arm的时候进入File systems菜单,选上<*> Second extended fs support。以提供内核对ext2文件系统的支持。我以前添加过了ext2文件系统了,所以开始的时候在此没有说明,在此为了说明为什么有的人照着我的方法做了,但是仍然kernel panic,特别把这一步也加上。
然后保存配置退出。
这样就为内核添加好了ramdisk启动功能和ramdisk的驱动支持了。



3.修改内核启动参数
方法有四:
a):修改.config的第310行,修改CONFIG_CMDLINE=""的定义(.config需要执行一条make语句才能生成,具体忘了
修改为CONFIG_CMDLINE="initrd=0x31000000,0x200000 root=/dev/ram rw init=/linuxrc console=ttySAC0 mem=64M"
保存。
意思为从ramdisk启动,ramdisk压缩文件起始地址在内存地址0x31000000处,文件大小为0x200000
此参数也可以在make menuconfig ARCH=arm时进入Boot options菜单,然后在Default kernel command string里修改。效果是一样的。

b):在内核的menuconfig中  boot options选项中  不要选  Passing command from u-boot

再在下面的一栏填入启动参数即可,具体不说了。
c):或者不修改.config的的第310CMDLINE定义,而是用u-bootbootargs环境变量来传递启动参数。
同样也是修改该环境变量为bootargs=initrd=0x31000000,0x200000 root=/dev/ram rw init=/linuxrc console=ttySAC0 mem=64M
saveenv保存u-boot环境变量

d):修改u-boot的默认启动参数,要修改 uboot 源码文件夹下  include/开发版型号/config/sep6200.h 文件

我的开发板是SEP6200  所以就是sep6200.h

这里面定义了大量的宏定义,可以进行相应修改。

需要修改bootargs 加入 initrd=0x31000000

和bootcommand 加入将ramdisk 镜像 读入  内存的 命令。

这也是我采用的方法。


以上a),b,c),d的效果是一样的。

4.编译内核
#make clean

#make sep0611_db//跟开发板有关

#make -j4


然后是十分钟左右的等待。
编译完成后在当前目录下就出现了zImage内核映像了。



5.制作uImage内核映像
由于我使用的Bootloaderu-boot,所以要将zImage转化为uImage,方法如下:
#make uImage
说明:mkimage工具是u-boot格式uImage内核映像制作工具。如果成功编译u-boot之后,它会在u-boot源码树下的tools目录之下。建议将其拷贝到宿主机的/sbin/目录下,以方便使用。mkimage使用时的具体参数不再详述,不清楚的请自己查阅。

uImage放在cpu/架构/开发板/boot 目录下

6.制作ramdisk根文件系统
该过程是制作ramdisk根文件系统的核心步骤,方法如下:
a)创建根文件系统目录:
#cd转入到你的工作目录。
#mkdir rootfs
#cd rootfs
#mkdir bin dev etc lib proc sbin sys usr mnt tmp var
#mkdir usr/bin usr/lib usr/sbin lib/modules

b)创建最基本的设备文件:
#cd dev
#mknod -m 666 console c 5 1
#mknod -m 666 null c 1 3
#cd ..

c)安装/etc配置文件:
这里可以直接把友善之臂的root_qtopia里的几个基本的配置文件拷贝过来,只拷贝必要的即可,并对其内容进行删减,因为我做的ramdisk并不包含Qtopia等,全拷贝过来也没有用。
我是从网上找的最小系统的etc配置文件直接解压到我制作的根文件系统里了,并做参照友善之臂的root_qtopia添加了一些内容,见最后的说明。
操作如下:
#tar etc.tar.gz -C /xxx/rootfs
xxx表示你要制作的rootfs所在的目录。

d)编译内核模块:
方法是如下:
进入Linux内核源码目录(linux-2.6.29
#make modules ARCH=arm CROSS_COMPILE=arm-linux-

e)安装内核模块:
#make modules_install ARCH=arm INSTALL_MOD_PATH=/xxx/rootfs
xxx表示你要制作的rootfs所在的目录。

f)配置busybox
进入busybox目录执行#make menuconfig
  进入Busybox Settings -> build Options ->选中"Build busybox as a static binary“,即静态链接,免去拷贝大量的库文件。
  Installation Options -> 选中"Don't use /usr",以免busybox不慎被安装到宿主机系统的相应目录下,破坏宿主机系统。
  Busybox Installation Prefix /xxx/rootfs),修改该选项表明编译后的busybox将安装到该位置。

g)编译、安装busybox
#make ARCH=arm CROSS_COMPILE=arm-linux-
几分钟编译完成后
#make install
安装到Busybox Installation Prefix /xxx/rootfs)设定的目录里。当前为我要制作的根文件系统目录(/xxx/rootfs)。

h)制作ramdisk根文件系统镜像

PC机上进行如下步骤,可以制做RamDisk根文件系统的镜像。
需要在root权限下操作

(1)、dd if=/dev/zero of=/dev/ram0 bs=1k count=4096
说明:if:从文件读取;of:输出到文件;bs:ibs(输入)obs(输出)设置成指定的字节数;
count:仅读取指定的区块数,4096=4M应该与第二条第五条的大小一致,并且要和linux内核配置中设置的大小一致

(2)、mke2fs -vm0 /dev/ram0 4096
说明:将RamDisk格式化成ext2文件系统格式,大小为4M

(3)、mount /dev/ram0  /home/rootfs
说明:mount RamDisk,将根文件系统拷贝到/home/rootfs目录下;

(4)、在这里将已经只做好的ramdisk目录复制到 rootfs目录下 。要用  cp -a 命令。

(5)、dd if=/dev/ram0 bs=1k count=4096 | gzip -v9 > /tmp/ram_image.gz
说明:将RamDisk打包,并进行压缩成ram_image.gz。执行到这里就可以直接下载了 

7.下载内核映像和ramdisk映像
启动u-boot,暂停u-boot自动启动,在u-boot命令行中键入如下命令下载内核和ramdisk映像:

在u-boot命令行下,将内核及镜像下载到RAM再写入到nand


8)使用ramdisk根文件系统启动内核
u-boot命令行下键入如下命令启动系统:
bootm 0x32000000//具体地址根据开发板

如果在3.修改内核启动参数 时用了第四种方法这里就不用手动输入了
锻炼一下自己分析解决问题的能力吧。呵呵。

关于busybox的 操作,我自己并未使用,各位可以直接网上看相应的操作,这里就不详细说明了。

Primo Ramdisk 是 VSuite Ramdisk 的第二代产品。相比 VSuite Ramdisk,它实现了更多的功能,更好的性能,以及更友好的用户界面。和 VSuite Ramdisk 同样,Primo Ramdisk 提供了对传统硬盘性能瓶颈问题的有效解决方案。它采用独特的软件算法,高效率地将物理内存虚拟成物理硬盘,使得对硬盘文件的数据读写转化为对内存的数据访问。由于物理内存的访问速度远远超过传统硬盘,因此可以极大的提高数据读写速度,从而突破硬盘瓶颈,飞速提升计算机性能。 Primo Ramdisk 具有一系列强大的功能和选项以使性能最大化,并使软件具有广泛的应用性。Primo Ramdisk 可支持创建128个虚拟硬盘,每个虚拟硬盘可被 Windows 系统识别为真实物理硬盘或逻辑硬盘。虚拟硬盘可被格式成 Windows 支持的文件系统,并允许用户根据需要对文件系统进行自定义设置。由于内存具有断电数据消失的特性,在某些应用环境中正好可以起到保护数据安全的作用,防止重要数据残留在物理硬盘中。Primo Ramdisk 同时提供了强大的镜像文件功能,支持关机时将虚拟硬盘的内容自动保存到镜像文件以及开机时自动从镜像文件加载内容到虚拟硬盘等功能,使内存虚拟硬盘的内容在计算机开关机时仍可继续存在。Primo Ramisk 支持诸多高级镜像功能,如定时保存、 实时保存、快速保存以及延迟加载等,可以更好地满足用户多种需求。此外,Primo Ramdisk 提供了独特的内存管理特性,更有效地利用物理内存。它支持动态内存管理,可以根据需要动态地分配或释放内存,从而更合理地使用物理内存,避免长期无意义地占用内存。Primo Ramdisk 同时实现了未识别内存管理接口 (UIMMI),可以使用未识别内存创建虚拟硬盘,从而间接地支持在32位操作系统上使用超过4GB的物理内存,避免物理内存的浪费。除了创建内存虚拟硬盘,Primo Ramdisk 甚至可以创建混合虚拟硬盘和文件虚拟硬盘,极大地扩展了软件的功能和应用范围。 Primo Ramdisk特性 硬盘特性 支持内存虚拟硬盘,混合虚拟硬盘,以及文件虚拟硬盘. 支持 SCSI 硬盘,Direct-IO 硬盘. 支持临时虚拟硬盘. 支持128个虚拟硬盘. 内存特性 支持动态内存管理 (DMM). 支持未识别内存管理接口 (UIMMI). 支持超过4GB内存的访问. 文件系统特性 支持 FAT/FAT32/NTFS 文件系统. 支持自定义簇大小. 支持自定义卷标、卷序列号和盘符. 支持自定义文件夹. 支持自定义 NTFS 文件系统设置 (压缩、索引和用户权限). 镜像文件特性 支持镜像文件格式:完全镜像/智能镜像/压缩镜像. 支持加载和保存功能: 仅加载,关机时保存,删除前保存,定时保存,实时保存,手动保存. 支持延迟加载模式. 支持快速保存模式. 其它特性 支持系统页面文件. 支持命令行界面(CLI). 支持多国语言界面. 集成实用小工具可更方便地设置利用虚拟硬盘. Primo Ramdisk截图
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值