ramdisk制作过程解析
2012-06-26 19:32 至上 阅读(5793) 评论(0) 编辑 收藏 举报1#mkdir initrd 2#dd if=/dev/zero of=initrd.img bs=1k count=8192 3#/sbin/mke2fs -F -v -m0 initrd.img 4#mount -o loop initrd.img initrd 5#cp -av rootfs/* initrd #umount
1 initrd文件夹主要用于,在制作过程中临时挂载ramdisk,添加文件系统。为什么要这样呢?因为ramdisk是把内存虚拟成块设备,其实这是很奢侈的事情,不过现在内存逐渐加大,这样做有能提高几十倍的速度,当然是极好的。
2 就是指定这个块设备的大小
3 是在这个块设备上建一个ext2文件系统,所有的块设备上都有一个对应的设备文件系统(ext2 ext3 ext4 yaffs等)
4 就是挂载,那么为什么要挂载呢,因为块设备无法直接被访问,在其上要有一个虚拟的文件系统,那就是VFS,initrd只是pc机vfs的一个小的目录。
5 挂载后把一个自己搭建好的小文件系统拷贝进去
6 最后umount。为什么要把自己做的文件系统拷贝进去呢,其实这是个小的vfs,在板子运行的时候,不能访问pc机的虚拟文件系统啊,所有要有自己的vfs。
其实在板子起来后看到的就是你自己制作的小文件系统,操作的就是以小块内存空间,当做块设备使用。不过这样你就无法访问这块内存空间以外的东西了。这样就是玩玩,ramdisk的目的其实只是个过渡,在你的文件系统起来以后,可以挂在一个大的vfs,比如说android啊。(这样就解决了udev与文件系统之间的矛盾 哦 这与steppingstone是不是很像 O(∩_∩)O哈哈~)
下面开始介绍制作ramdisk文件系统:
#mkdir rootfs #cd rootfs #mkdir bin dev etc lib proc sbin tmp usr var #chmod 777 tmp #mkdir usr/bin usr/lib usr/sbin #mkdir var/lib var/lock var/log var/run var/tmp #chmod 777 var/tmp
现在创建一些文件夹,当然暂时都是空的,这些都怎么与块设备中的文件联系起来呢,就是说,这些本来都是空的,大多你可以自己创建一些,不过在板子跑起来后会有很多没见过的文件,哪儿来的呢?那就说说mount吧!
所以吧,挂载后,原来tmp中的文件找不到了就可以解释了。如果找不到你创建的文件夹,就会直接挂到根目录下。像proc这种记录的都是内核输出的信息。mount命令是在初始化代码中的。(/etc/init.d/rcS)
然后准备一些必要的库
把交叉编译器下的lib拷贝过来就可以喽。(静态编译busybox就不需要了啊,动态编译还是要的)
下载busybox(http://www.busybox.net/)并解压。
3.2 进入解压后的目录,配置Busybox $make menuconfig Busybox Settings > General Configuration > [*] Support for devfs Build Options > [*] Build BusyBox as a static binary (no shared libs) /* 将busybox编译为静态连接,少了启动时找动态库的麻烦 */ [*] Do you want to build BusyBox with a Cross Compiler? (/usr/local/arm/3.3.2/bin/armlinux) Cross Compiler prefix/* 指定交叉编译工具路径 */ Init Utilities > [*] init [*] Support reading an inittab file /* 支持init读取/etc/inittab配置文件,一定要选上 */ Shells > Choose your default shell (ash) > /* (X) ash 选中ash,这样生成的时候才会生成bin/sh文件 * 看看我们前头的linuxrc脚本的头一句: * #!/bin/sh 是由bin/sh来解释执行的 */ [*] ash Coreutils > [*] cp [*] cat [*] ls [*] mkdir [*] echo (basic SuSv3 version taking no options) [*] env [*] mv [*] pwd [*] rm [*] touch Editors > [*] vi Linux System Utilities > [*] mount [*] umount [*] Support loopback mounts [*] Support for the old /etc/mtab file Networking Utilities > [*] inetd /* * 支持inetd超级服务器 */
这些配置看情况定吧,版本高一点点额busybox,都帮你选上了。
在busybox文件目录下make一下,不过makefile要改一下,就是交叉编译器哪边,最后安装到roofs文件路径下。
下rootfs目录下准备一些必要的文件:
#cd rootfs/dev
#mknod -m 600 console c 5 1
这个console叫做控制台终端,c是指char设备,5是主设备号,1是从设备号。
因为有了这个,所以你可以在pc机上看到开发板内核打印的信息。
大家应该记得,在bootargs参数中有个 console=ttyS0,而ttyS0就是串口的设备号。这样说吧,内核原来打印的信息是给console控制台的,然后转给串口,于是,在pc机上用串口调试工具就可以接收到打印信息了。在bootargs中还有init=/int的参数,就是说进入进入ramdisk后执行的第一个文件是根目录下的init,也可以是linuxrc,甚至是/sbin/init。都是可以的哦。那要看你的初始化顺序是怎么安排的。