ramdisk制作过程解析

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。都是可以的哦。那要看你的初始化顺序是怎么安排的。

 

 

原文地址:https://www.cnblogs.com/autum/p/ramdisk.html