现在的位置: 首页 > 综合 > 正文

创建文件系统

2013年10月10日 ⁄ 综合 ⁄ 共 6397字 ⁄ 字号 评论关闭

一、BusyBox

1、什么是busybox?

      BusyBox对于嵌入式系统来说是一个非常有用的工具,有些人将BusyBox称为linux工具里的“瑞士军刀”。

BusyBox将数以百计的常用linux命令集成到一个可执行文件中(名为BusyBox),体积小但是功能强大。形象的比喻:linux系统中的单个命令是电路中的分立式元件,而BusyBox是将他们集成在一起的IC,功能不变,但是体积确实大为减少。

     BusyBox既可以用glibc和uClibc库进行链接编译,可以采用动态链接或者静态链接。即便采用的是与glibc的静态链接,也可以将BusyBox文件的大小轻易控制在1M之内;而采用uClibc的动态链接生成的可执行文件就更小了,因此适用于存储空间紧张的嵌入式系统。

 

2、busybox的配置编译、安裝(参考资料[11]):
   busybox的配置与内核配置很相似,都是基于源码树目录中的.config文件来进行的,使用menuconfig工具。
1)下载busybox压缩包,如busybox-1.00.tar.bz2。
2) tar jxvf busybox-1.00.tar.bz2
3)对busybox进行配置(按需):
   cd busybox-1.00
配置命令有以下几种:
   make defconfig    //针对大多数用户的默认配置
   make allnoconfig   //全不选
   make allyesconfig //全选
   make menuconfig
一般先make defconfig ,然后在使用menuconfig进行配置。利用$make help可以查看busybox的make选项帮助。
    配置根据具体需要来: 不需要的不选.

4)编译busybox:
       完成busybox的配置以后,就要对其进行编译了。busybox可以用于多种体系结构的CPU。以PC机和ARM开发板为例:
    PC机: 很简单,只需要make就行了。
   ARM开发板:要使用交叉编译,所以我们要指定交叉编译工具的位置,可通过现面的方法实现:
          方法一: 修改宿主机的PATH变量,使其包含交叉编译工具的目录;然后在调用make命令时,指定TARGET_ARCH和CROSS变量:make TARGET_ARCH=arm CROSS=arm-linux-。
          方法二:新版的busybox可以在配置中设定交叉编译工具的,直接运行make就跟为本机编译busybox没有任何区别了。
    
     为了加快编译速度, 可以修改Makefile, 将CC="$(HOSTCC)"改为CC="ccache $(HOSTCC)". 同时也可使用 $ make -j2 用2个任务来进行编译过程.

5)安裝busybox:
      编译完成后,执行:make install,进行busybox的安裝。

     默认的,busybox将在当前目录中新建一个名为“_install”的目录,busybox将被安裝到其中。当然也可以在配置时指定安裝目录。 安裝完成后,在./_install中有下列linuxrc文件和三个目录:
      bin sbin linuxrc   usr
    这些目录中包含一些我们熟悉的位于PC机/bin, /sbin, /usr/bin , /usr/sbin目录中程序。只是busybox安裝的这些程序都是指向buxybox文件(位于./_install/bin)自身的符号连接。inuxrc文件也是指向busybox程序的符号链接。

6)运行busybox:
     运行busybox安裝的那些程序(命令)时,实际上都是在调用busybox这个单独的程序。比如:$./ls -l,实际上向busybox传递了2个参数,ls和-l,等价于$./busybox ls -l.
     还有一个问题:如果busybox是与C库动态链接的(哪怕是和glibc库动态链接), 那么运行它是将会产生段错误:
Unable to load interpreter
Segmentation fault (core dumped)

   如果采用静态链接, 则没有问题. BusyBox 映像是静态链接的,因此它不需要其他库。然而,如果我们需要标准的 C 库(我们自己定制的二进制可能需要这个库),除了巨大的 glibc 之外,我们还有其他选择。第一个较小的库是 uClibc,这是为对空间要求非常严格的系统准备的一个标准 C 库。另外一个适合空间紧张的环境的库是 dietlib。要记住我们需要使用这些库来重新编译想在嵌入式系统中重新编译的二进制文件,因此这需要额外再做一些工作。
  
参考资料:
     [1]BUSYBOX介绍(不错)
             http://blog.csdn.net/zxg623/archive/2007/11/17/1889805.aspx
     [
2]BusyBox——嵌入式Linux中的瑞士军刀(主要是busybox的介绍使用)
            http://blog.chinaunix.net/u/13991/showart.php?id=170013

   [3]用busybox制作嵌入式Linux的文件系统           http://www.embed.com.cn/downcenter/Article/Catalog34/354.htm
     [4]ARM Linux根文件系统(Root Filesystem)的制作 (对/etc和/lib库的处理有介绍)
             http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!298.entry
   [5]http://blog.csdn.net/denlee/archive/2008/04/06/2254192.aspx
       
使用Busybox制作CRAMFS文件系统成功[原创]
[6]如何制作嵌入式linux文件系统
    http://www.chineselinuxuniversity.net/courses/embedded/guides/11288.shtml
      做文件系统最困难和最可能出问题的地方是在/lib库和/dev方面,请大家多注意这两方面
     [7]
Build a mini filesystem in linux from scratch
       http://oss.lzu.edu.cn/blog/blog.php?/do_showone/tid_1211.html
     [8]
Build a mini filesystem in linux with BusyBox
       http://oss.lzu.edu.cn/blog/blog.php?do_showone/tid_1212.html

     [9]
根文件系统的制作 (还好,主要是总结)
       http://blog.163.com/kangray@126/blog/static/2623321520073255013109/
    

二、嵌入式linux的文件系统:

   
1、ramdisk
   1)介绍 :
      the RAM disk driver is a way to use main system memory as a block device.
       我们可以将Ramdisk和一般的块设备一样使用。Ramdisk是将一部分固定大小的内存(RAM)当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。

  在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。   

      查看ramdisk 信息:$ls -l /dev/ram*
    2)优缺点:
        Ramdisk的优点: 读写速度非常快(因为是基于RAM的文件系统), 适合用来制作initrd.
        Ramdisk的缺点: 不具有永久性, 断电后无法保存. 且ramdisk大小不可更改, 浪费ram.
   3)ramdisk的制作方法:
       可以利用空闲的块设备(比如比如软盘或未用的分区),主机系统的RAM disk(/dev/ram0), loop设备来制作Ramdisk. /Documentation/ramdisk.txt中介绍的是使用/dev/ram0来制作ramdisk.
      方法一:使用loop设备来制作ramdisk(最简单),
                  # dd if=/dev/zero of=ramdisk.image bs=1k count=8192
                     使用dd命令建立一个8192KB的文件系统映像. 以/dev/zero对其初始化.

        接下来,要将ramdisk格式化为特定的文件系统,因为ramdisk只是一个块设备,只有将其格式化为特定的文件系统后才能使用:
                # mke2fs -F -v -m0 ramdisk.image
                    -F : 迫使mke2fs在ramdisk.image上运行, 否则, mke2fs会抱怨ramdisk.image不是块设备.
                    -v : 以verbose模式运行
                    -m0 : 指定不必在文件系统上为"超级用户"保留任何block.(一般嵌入式Linux都是单用户系统).
        完成之后, 可以用file命令看到: ramdisk.image: Linux rev 1.0 ext2 filesystem data

                    也可以将ramdisk.image格式化为minix文件系统:
                   # mkfs.minix ramdisk.image

             将ramdisk格式化后, 就可以挂载它(假设挂在到当前目录中的ramdisk目录)
                  # mount -o loop ramdisk.image ramdisk
参考资料:
    [1]ramdisk简介:http://blog.gkong.com/more.asp?name=barongeng&id=30947
      [2]
Linux下创建和使用RamDisk的技巧
         http://www.linuxfans.org/nuke/modules.php?name=News&file=article&op=view&sid=113
2、initrd
   从字面意思就可以看出来, initrd = initial RamDisk(初始ram磁盘). initrd被用来在flash中储存压缩过的文件系统.

   1)initrd和上面介绍的ramdisk有着不可分割的联系, 在/Documentation/ramdisk.txt中, 就有这样一句话:

It is required for initrd, an initial filesystem used if you need to load modules in order to access the root filesystem.
    
   
在桌面或服务器版的Linux中, 在实际的根文件系统可用之前, initrd先被内核挂载为临时的根文件系统. 当完成了加载, 启动之后, initrd可能被卸载. 但在嵌入式Linux系统中, initrd往往被用来做为真正的根文件系统.
    据我理解, initrd就是在已经被格式化后的ramdisk中加入文件, 然后将其压缩的产物. 当然, ramdisk中的文件系统中要包含用于初始化的文件(可执行文件, 脚本或链接).因为在嵌入式Linux系统中, initrd往往被用来做为真正的根文件系统.
   2) Linux 内核中对 initrd 的支持

对于 Linux 内核来说,要支持初始 RAM 磁盘,内核必须要使用 CONFIG_BLK_DEV_RAMCONFIG_BLK_DEV_INITRD 选项进行编译。

3)内核是如何识别 initrd 并将其作为根文件系统进行挂载的?
    

参考资料:Linux 初始 RAM 磁盘(initrd)概述
                http://www.ibm.com/developerworks/cn/linux/l-initrd.html
           
                [2]Linux2.6 内核的 Initrd 机制解析
               http://www.ibm.com/developerworks/cn/linux/l-k26initrd/

其他参考资料:
     
      
[1]开发板实务(4)——分析板子的文件系统:http://www.cublog.cn/u/13991/showart_172151.html
            新的知识点:
          1、在相同的挂载点上可以挂载任意数目的文件系统,就像一个堆栈;卸载当前的文件系统后,上一个最近挂载                的文件系统就会重新出现(其实是同时显示的)。
       2、在/etc/fstab中记录了开机时要自动挂载的文件系统。
               同时,在/etc/init.d/rcS中有mount -a 命令: /bin/mount -a
               mount -a : mount all filesystems (of the given type) mentioned in fstab.
      [2]
开发板实务(5)——构建根文件系统
            http://www.cublog.cn/u/13991/showart_173116.html
          知识点:
           Linux使用initrd作为rootfs时, 启动顺序是这样的:

          1, bootloader加载内核, 内核将initrd解压到ram中成为ramdisk.
        2, ramdisk被挂在为rootfs, 并执行/linuxrc.
           其实完全可以不需要/linuxrc, 因为/sbin/init所在的文件系统已经被挂载上了, 内核先执行init, 如            果找不到init, 才执行/linuxrc!

           实际上, 在内核挂载ramdisk之后, 它会查找init文件来执行.如果没有找到init文件, 内核就会调用           linuxrc文件作为自己的启动脚本.

    [3]tmpfs介绍
        http://www-128.ibm.com/developerworks/cn/linux/filesystem/l-fs3/index.html
    [4]
Embedded Linux常见文件系统介绍(ramdisk、initrd等的介绍)
    http://www.cublog.cn/u/13991/showart_173007.html   
         [5]
嵌入式Linux文件系统详细介绍    (细节不是很清楚,但是框架不错)    
                 http://tech.ddvip.com/2007-09/119020609935017.html
转至 http://hi.baidu.com/xuym04/blog/item/49d83f6e645415df81cb4ac7.html

抱歉!评论已关闭.