zoukankan      html  css  js  c++  java
  • 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。都是可以的哦。那要看你的初始化顺序是怎么安排的。

     

     

  • 相关阅读:
    WinForm笔记1:TextBox编辑时和DataGridView 单元格编辑时 的事件及其顺序
    Emgu 学习(4) 使用指针访问图像内存
    SolidWorks学习笔记1
    Emgu 学习(3) 绘图,使用鼠标绘图,使用trackbar
    NModbus4的使用
    C# async await的使用
    Emgu 学习(2) 视频文件播放
    redis-key2
    redis--key1
    rpc优化
  • 原文地址:https://www.cnblogs.com/autum/p/ramdisk.html
Copyright © 2011-2022 走看看