-
- phoenix20111116
-
124 发帖361 回复1671 积分
- 私信他 + 关注
Linux下Ramdisk制作V1.0
一、主机环境
Vmware7.0、ubuntu9.04、linux-2.6.29.1(开发板使用内核)、arm-linux-gcc 4.3.2 with EABI
二、RamDisk简介
构建适用于嵌入式系统的 Linux文件系统,必然会涉及到两个关键点,一是文件系统类型的选择,它关系到文件系统的读写性能、尺寸大小;另一个就是根文件系统内容的选择,它关系到根文件系统所能提供的功能及尺寸大小。
什么是RamDisk? 一个A RamDisk 是你用作一个硬盘分区的一部分内存空间。或者换句话说,你是把内存假设为一个硬盘驱动器,并且你在它的上面存储文件。我们可以将Ramdisk和一般的块设备一样使用。Ramdisk是将一部分固定大小的内存(RAM)当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。
为什么我们要使用 RamDisk? 好的,如果你知道通常将要使用的文件是被调入内存以提高计算机的性能,因为内存的存储速度要快于硬盘,这样能提高系统的性能。 这样类似于web服务器上的数据就可以用这个方法提高访问速度。
查看ramdisk 信息:$ls -l /dev/ram*
Ramdisk是将一部分固定大小的内存当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。
在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。
三、Ramdisk制作
(一)、配置内核
进入内核源码linux-2.6.29.1目录,这里以我以前配置过的内核(基于S3C2440的Linux内核移植和根文件系统制作)基础之上修改:
make menuconfig后进行如下配置:
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
Device Drivers --->
[*] Block devices --->
<*> RAM block device support
将Default RAM disk size(kbytes) (NEW)项的大小设置为8192,即8M,使用不了默认的4M是因为我在ubuntu下安装制作ramdisk的工具genext2fs后最小只能生成8M大小的文件系统。
然后特别要注意的一点是,ramdisk是一种内存虚拟磁盘技术,实质上并不是一种文件系统,它使用的文件系统时ext2文件系统。所以一定要在make menuconfig ARCH=arm的时候进入File systems菜单,选上<*> Second extended fs support。以提供内核对ext2文件系统的支持。
运行make zImage编译内核。
由于我使用的Bootloader是u-boot,所以要将zImage转化为uImage,进入arch/arm/boot,运行如下命令:
说明:mkimage工具是u-boot格式uImage内核映像制作工具。如果成功编译u-boot之后,它会在u-boot源码树下的tools目录之下。建议将其拷贝到宿主机的/sbin/目录下,以方便使用。mkimage使用时的具体参数不再详述,不清楚的请自己查阅。
(二)、修改bootloader和内核启动参数
1、修改U-boot中参数
在U-boot中,将
2、修改Linux内核中启动参数
修改Linux内核的启动参数方法有二:
(1)、修改.config的第310行,修改CONFIG_CMDLINE=""的定义
修改为CONFIG_CMDLINE="initrd=0x31000000,0x400000 root=/dev/ram rw init=/linuxrc console=ttySAC0 mem=64M"保存。
意思为从ramdisk启动,ramdisk压缩文件起始地址在内存地址0x31000000处,文件大小为0x400000,即4M大小(我的ramdisk制作后占用3M多)。
(2)、此参数也可以在make menuconfig ARCH=arm时进入Boot options菜单,然后在Default kernel command string里修改。效果是一样的。
(三)、制作根文件系统
根文件系统的制作参考我的另外一篇笔记《基于S3C2440的Linux内核移植和根文件系统制作》,在该文件系统上稍加一些修改:
在/etc下的脚本rcS中,将“mount -n -t ramfs ramfs /tmp”加上
(四)、制作ramdisk文件系统映像
上http://genext2fs.sourceforge.net/下载可以简单方便的制作ramdisk文件系统的工具genext2fs,这样就不用像网上大多数说的那样繁琐的制作ramdisk映像了,当前最新版本为genext2fs-1.4.1.tar.gz 。编译生成该工具genext2fs,并将其放入宿主机的/sbin/目录下以方便使用。跳转到要制作的rootfs的上一级目录,然后进行如下操作:
genext2fs -b 8192 -d rootfs ramdisk
-b是指制作的ramdisk大小为8192K字节
-d是指要制作成ramdisk的根文件系统目录,我制作好的根文件系统的目录名字就是rootfs
最后的ramdisk是制作出来的ramdisk的名字,当然可以改名了。
gzip -9 -f ramdisk
将该ramdisk以最优方式压缩为ramdisk.gz,这样ramdisk就生成了。
四、下载内核和ramdisk映像
将生成的内核和ramdisk映像放入tftp服务器目录下,并开启tftp,进入U-boot的命令行,通过如下命令下载内核和ramdisk映像:
(一)、下载内核映像
tftp 30008000 zImag.img
(二)、下载ramdisk映像
tftp 31000000 ramdisk.gz
(三)、启动内核、挂在根文件系统
bootm 30008000
如果配置正确,第一次就能正常启动。
五、一些命令
(一)、在一个已建好的文件系统上进行修改
设已建立好的文件系统压缩文件为ramdisk.gz
1、解压
gunzip ramdisk.gz
在解压后,得到文件系统镜象文件ramdisk, 覆盖了原来的压缩文件
2、镜象文件挂载
镜象文件必须经过挂载后才能看到文件系统中的各个目录和详细内容
mkdir /mnt/loop 是文件系统要挂载到的目录
mount –o loop ramdisk /mnt/loop
cd /mnt/loop在挂载目录/mnt/loop下对文件系统进行操作
#do_whatever_you_want_to_do /*根据需要增加、删减或是修改文件系统的内容
4、卸装文件系统
跳到/mnt/loop目录外,否则无法卸装,提示busy
cd ramdisk所在目录
umount /mnt/loop
5、压缩文件系统
gzip –v9 ramdisk /*生成ramdisk.gz压缩文件
(二)、自己建立根文件系统
1、建立loop设备的临时挂载点
mkdir /mnt/loop
2、建立一个大小为15M的临时文件
dd if=/dev/zero of=/tmp/loop_tmp bs=1k count=15360
注意可根据自己的需要建立大小合适的文件系统,更改count大小即可。此处以dd命令建立一个了一个15360KB文件系统映象,存于/tmp/loop/tmp,并以.dev/zero对它进行初始化。用这种方式对文件系统进行初始化,稍后当我们使用gzip命令压缩整个映象时,将让文件系统中未使用的部分获得最大压缩比。
3、将设备文件与临时文件联系起来
losetup /dev/loop0 /tmp/loop_tmp
把设备文件/dev/loop0与临时镜象文件/tmp/loop_tmp联系起来,/dev/loop0是个块设备 如果出现“ioctl:LOOP_SET_FD:设备或资源忙”,说明/dev/loop0设备还和一文件联系,可用losetup /dev/loop0查看地,并可用-d 删除。
4、将/dev/loop0格式化为ext2文件系统
mke2fs –m 0 /dev/loop0
-m 0指出不必在文件系统上为“超级用户”保留任何区块。
Linux内核识别两种可以直接考贝的到ramdisk的文件系统,它们是minix和ext2,minix是linux早期版本所用的文件系统,从minix操作系统而来,ext2性能更好。
5、把虚拟盘挂在节点/mnt/loop上
mount –t ext2 /dev/loop0 /mnt/loop
6、用cp –af命令将所需要文件拷贝到虚拟盘上
cp –help查看cp 用法。cp –arf … -r表示拷贝目录
/bin, /dev, /etc, /lib, proc, /sbin, /usr都是不可或缺的目录,建议保留/tmp,/var,不过可以为空。而为多用户提供可扩展环境的所有目录(例如/home、/mnt、/opt、/root)都应该省略。
用cp复制文件时,建议把已建立好的文件系统中的内容全部拷贝过来,这样比较简单,不需要再去编译安装busybox等。当然自己也可以那样去做。
7、卸载文件系统,得到的/tmp/loop_tmp就是文件系统映象。
cd /mnt/loop以外的目录 (否则会提示无法卸载,设备busy)
umount /mnt/loop
8、压缩文件系统映象
gzip –v9 /tmp/loop_tmp >/tftpboot/ramdisk.gz
在/tftpboot下生成了ramdisk.gz,这样一个内存文件镜象生成了。
或只是#gzip –v9 /tmp/loop_tmp,则就是在/tmp下生成loop_tmp.gz文件,一样的。
在上述自己建立文件系统中,第3条用 losetup命令把块设备文件/dev/loop0与临时文件/tmp/loop_tmp联系起来了,我的理解是/tmp/loop_tmp必须是块设备文件,所以用/dev/loop0与之相关联,然后对/dev/loop0的操作和对其虚拟盘的操作,就间接作用在文件系统映象 /tmp/l oop_tmp上。
(三)、自己建立根文件系统(与二中不同)
1、建立loop设备的临时挂载点
mkdir /mnt/loop
2、建立文件系统映象
dd if=/dev/zero of=/tmp/loop_tmp bs=1k count=15360
以上2条同二中是一样
3、mke2fs –F –v –m 0 /tmp/loop_tmp
此处-F选项将可迫使mkefs2在文件上运行。否则mke2fs会抱怨/tmp/loop_tmp不是个块设备(在上面说了,我的理解是/tmp/loop_tmp文件映象必须是块设备文件,前面的做法是用块设备文件/dev/loop0与之相关联)。-v 选项指出mke2fs应该以verbose模式执行,-m 0指出不必在文件系统上为“超级用户”保留任何区块,因为在嵌入式系统中通常是单用户系统,为“超级用户”保留区块没有意义。
4、挂载映象文件
munt –o loop /tmp/loop_tmp /mnt/loop
挂载后,在/mnt/loop下就可以对文件系统的内容进行操作。
5、cp操作,同二中的第6条
6、卸载映象文件
umount /mnt/loop
7、压缩映象文件
gzip –v9 /tmp/loop_tmp
第三中的做法与第二中的做法不同,在第二中,把块设备文件/dev/loop0与映象文件/tmp/loop_tmp相关联,然后对/dev/loop0及虚拟盘进行操作,就作用在/ltmp/loop_tmp上。
而第三中,是直接对映象文件/tmp/loop_tmp进行操作,用mke2fs –F …将其当作块设备文件进行操作。


块
导
航
举报
请选择举报类别
- 广告垃圾
- 违规内容
- 恶意灌水
- 重复发帖