busybox移植和文件系统建立

最近学习自己建立文件系统,遇到很多问题,同一个方法并不是对每个人都可用的,下面把我移植的过程记录下来,希望对大家有所帮助。

      其中主要涉及到的主要部分:

         1,文件系统启动过程分析                  

         2,busybox移植

         3,文件系统建立和使用mdev创建设备文件

   开发环境:ubuntu系统,busybox版本:busybox-1.17.2-20101120.tgz 编译环境:gcc-4.4.4 平台:飞思卡尔imx53 arm cortex a8内核

     1,文件系统启动过程

                     在内核启动的最后过程就是把控制权转移到文件系统,文件系统说白了就是一个循环执行的应用程序,这个应用程序就是我们所要移植的busybox。

                    内核启动最后要启动init进程,init进程在内核源码中的init/Main.c中定义

                     执行顺序是:kernel_init()-------->init_post()------->run_init_process("/sbin/init");

                      这里需要注意,在韦东山那本书中的open console实在init post中定义的,在我用的内核中在kernel_init中定义的,其实执行顺序是一样的。

                      系统最后执行的是run init process 这个进程创建成功后将不会返回,将控制权交给文件系统了,这个进程创建的进程是/sbin目录下的init,

        init是个连接文件,连接到bin/busybox,实际运行的是busybox的init,关于busybox的init可以参考韦东山书中的部分学习,

            运行busybox的init时,系统会读取etc下的配置文件inittab,这个配置文件中的内容如下:

         #/etc/inittab  
::sysinit:/etc/init.d/rcS  //这一个是系统第一次运行时会运行位于init.d下的rcS脚本对系统进行初始化设置,包括设置ip,加载mdev等
::askfirst:-/bin/sh   //这个是系统运行的主要程序,即运行/bin目录下的shell,不断循环运行,
::ctrlaltdel:/sbin/reboot  //这是系统检测到ctrl alt del信号时,重启 
::shutdown:/bin/umount -a -r//关机操作,卸载所有文件系统

      注:有的书中这里写的是console::askfirst:。。。。我在运行的时候出现can not open console。。。。我怀疑可能是dev下面的console没有挂载上,或者系统的dev

目录又被重新挂载,导致console文件找不到造成,最后将console去掉即可

    2,busybox移植:

         

     1、修改Makefile

       进入busybox的解压目录,

       vim Makefile,将

      ARCH ?= $(SUBARCH) 改为

     ARCH ?= arm

      CROSS_COMPILE ?=改为

      CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-(根据你自己的路径定义)

       2、配置busybox的相关工具

     执行 make menuconfig,进入配置菜

  1. Busybox Settings ---> 
  2.      Build Options ---> 
  3.           [*] Build BusyBox as a static binary (no shared libs) //这里编译为静态库 
  4.           [ ] Build with Large File Support //这里要去掉这一项 
  5.           () Cross Compiler perfix //设置交叉编译器路径 
  6.      Installation Options ---> 
  7.           [*] Don't use /usr //不安装到系统的usr目录下,以解压目录下的_install来代替 
  8. Linux System Utilities ---> 
  9.      [ ] mkfs_ext2 
  10.      [ ] mkfs_vfat  //这两项不选,否则编译会报错 
  11. 别的选项工具自己需要进行选择 
  12. Miscellaneous Utilities ---> 
  13.      [ ] ionice //去掉,否则编译报错 
  14. 其他选项根据个人需要 
  15. Networking Utilities ---> 
  16.      可以去除一些不必要的选项 

3、编译

              我的直接一遍编译通过了,有问题大家可以百度,一般busybox配置默认就可以了

         4,安装busybox

              在根目录下创建myrootfs目录

             在busybox目录下运行 make CONFIG_PREFIX=/myrootfs install

            执行完后就在myrootfs目录下面生成bin,sbin usr linuxrc等,你可以查看sbin目录下的文件 ls -l,可以看出所有的命令都是连接到bin目录下的busybox文件,busybox为主要的应用程序

        3,创立文件系统

            

可以先创建一个工作目录,如myroot,在工作目录下 创建以下目录:bin sbin dev etc lib home root usr var proc mnt tmp sys

执行 mkdir bin sbin dev etc lib home root usr var proc mnt tmp sys

etc下面要写两个文件fstab inittab 和一个文件夹init.d

(a) fstab的内容是:

  1. proc /proc proc defaults 0 0 
  2. tmpfs /tmp tmpfs defaults 0 0 
  3. sysfs /sys sysfs defaults 0 0 
  4. tmpfs /dev tmpfs defaults 0 0 

(b) fstab文件的作用

文 件/etc/fstab存放的是系统中的文件系统信息。当正确的设置了该文件,则可以通过"mount /directoryname"命令来加载一个文 件系统,每种文件系统都对应一个独立的行,每行中的字段都有空格或tab键分开。同时fsckmountumount的等命令都利用该程序。

inittab的内容是:

  1. #/etc/inittab 
  2. ::sysinit:/etc/init.d/rcS 
  3. ::askfirst:-/bin/sh  
  4. ::ctrlaltdel:/sbin/reboot 
  5. ::shutdown:/bin/umount -a -r utdown:/bin/umount -a -r  

(c) init.d/rcS文件的内容:

  1. #!/bin/sh 
  2. ifconfig eth0 192.168.1.17 
  3. mount -t tmpfs mdev /dev 
  4. mkdir /dev/pts 
  5. mount -t devpts devpts /dev/pts 
  6. mount -t sysfs sysfs /sys 
  7. mount -a 
  8. echo /sbin/mdev > /proc/sys/kernel/hotplug 
  9. mdev -s //扫描系统中设备,在dev下面创建设备节点,这个命令也可以自己手动输入
  10. echo yuhaibin168_busybox 

(d)在/dev下建立设备节点:Console   null

  1. mknod dev/console c 5 1 
  2. mknod dev/null c 1 3 

(e)mdev.conf文件,这里包括系统mdev中配置,不过可有可无

  1. # Note: the first field is a regex matcher
    # Syntax: %s %d:%d %s
    # devices user:group mode


    null      0:0  666
    zero      0:0  666
    grsec     0:0  660


    urandom   0:0  444


    console   0:5  600
    fd0       0:11 660
    hdc       0:6  660
    kmem      0:9  640
    mem       0:9  640
    port      0:9  640
    ptmx      0:5  660


    sda[0-9]  0:6  660
    sdb[0-9]  0:6  660
    hda[0-9]  0:6  660


    ttyS[0-9] 0:14 640
    tty[0-9]  0:0  660
    tty.+     0:5  660





(f),还需要创建动态库,将交叉编译环境中gcc中的glibc库移植到开发板

只需要进入arm-linux/lib ,执行cp *.so* /myrootfs -d   其中-d是将连接文件指向文件也复制过去就可以

我的开发板中glibc库是/opt/freescale/usr/local/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/arm-fsl-linux-gnueabi/multi-libs/armv7-a/lib  (g),一些脚本命令,比如ldd ldconfig命令可以通过复制到相应的目录下执行,网上都有教程,每个人需求不同,按自己需求可以添加.      

上面就是文件系统创建个一个完整过程,在我这个开发板只需要将所有的文件打包成rootfs.tar.bz2 然后就可以烧写进入系统,运行没有问题.

经过这两天的学习linux文件系统,学到很多东西,同时也参照了很多博友的文章,在此表示感谢。  

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值