zoukankan      html  css  js  c++  java
  • 使用Busybox制作CRAMFS文件系统成功

    转:http://www.360doc.com/content/11/1013/22/7775902_155877501.shtml

    这几天在使用Busybox制作FS2410开发板的CRAMFS文件系统,由于开始 下载的是Busybox1.10,每次下载到开发板中,然后启动总是出现”Failed to execute /linuxrc.  Attempting defaults...“的错误。到网上查了大量的资料,并做了大量的实验,发现都不能成功。今天下午突然发现一个能够仿真arm的软件qemu,在 Ubuntu中的安装方法:sudo apt-get install qemu,Busybox编译后,可以通过arm仿真来测试:qemu-arm ./busybox ls,如果成功,则会显示当前目录下的文件列表。我对Busybox1.10编译后的结果进行测试,发现出现错误:

    qemu: unhandled CPU exception 0x8 - aborting
    R00=001c596c R01=00000000 R02=001c5960 R03=00000001
    R04=000cbf94 R05=00000000 R06=00000000 R07=00000000
    R08=000cbfdc R09=000cbf94 R10=00000000 R11=00000000
    R12=ffff0fff R13=b7d6c470 R14=000d4588 R15=ffff0fa0
    PSR=20000010 --C- A usr32 ffff0fa0
    s00=00000000(       0) s01=00000000(       0) d00=0000000000000000(       0)
    s02=00000000(       0) s03=00000000(       0) d01=0000000000000000(       0)
    s04=00000000(       0) s05=00000000(       0) d02=0000000000000000(       0)
    s06=00000000(       0) s07=00000000(       0) d03=0000000000000000(       0)
    s08=00000000(       0) s09=00000000(       0) d04=0000000000000000(       0)
    s10=00000000(       0) s11=00000000(       0) d05=0000000000000000(       0)
    s12=00000000(       0) s13=00000000(       0) d06=0000000000000000(       0)
    s14=00000000(       0) s15=00000000(       0) d07=0000000000000000(       0)
    s16=00000000(       0) s17=00000000(       0) d08=0000000000000000(       0)
    s18=00000000(       0) s19=00000000(       0) d09=0000000000000000(       0)
    s20=00000000(       0) s21=00000000(       0) d10=0000000000000000(       0)
    s22=00000000(       0) s23=00000000(       0) d11=0000000000000000(       0)
    s24=00000000(       0) s25=00000000(       0) d12=0000000000000000(       0)
    s26=00000000(       0) s27=00000000(       0) d13=0000000000000000(       0)
    s28=00000000(       0) s29=00000000(       0) d14=0000000000000000(       0)
    s30=00000000(       0) s31=00000000(       0) d15=0000000000000000(       0)
    FPSCR: 00000000
    qemu: uncaught target signal 6 (Aborted) - exiting


    说明,所编译得到的busybox不能使用在arm处理器,由于时间关系就放弃了使用Buxybox1.10版本。后又尝试了Busybox1.5.x,发现有同样的问题。(后来和1.00版本对照,发现去掉了对devfs的支持)

    于 是使用FS2410开发版自带的源码中的Busybox1.00版本,编译后仿真没有问题,生成cramfs文件系统后下载、启动也正常,只是会出现 “/bin/sh: can't access tty; job control turned off”的问题,查阅了一些资料,发现都不能很好的解决这个问题。于是下载了Busybox1.1.3版本,编译、生成文件系统、下载、启动,一切正常, 讲一讲过程:
    1.下载BusyBox 1.1.3
    2. 执行make menuconfig,然后进行设置,我截了几张图,这几张图就是在进行配置时需要重点注意的地方:



    (1)在General Configuration中,一定要选择“Support for devfs”选项,现在的Busybox新版本去掉了这个选项,不过应该可以通过修改配置文件加入。



    (2)在Build Options选项中,选择使用“静态库”以及设置交叉编译工具的PREFIX。



    (3)在Linux System Utilities选项中,“Support loopback mounts”和“Support for the old /etc/mtab file”2个选项应该选中。



    (4) 在Init Utilities选项中,“Support reading an inittab file”应该选中,这样可以根据自己编写的inittab文件初始化;“Support running commands with a controlling-tty”应该选中,否则会提示非常困扰的“/bin/sh: can't access tty; job control turned off”的提示,尽管可以进入控制台命令行。



    (4)在Shell选项中,应该选中默认shell:ash,否则不会生成sh,导致不能解释脚本文件。

    (5)其他的选项根据自己的需要设置。

    3. 配置完成后,退出保存(最好备份.config文件以供后用),然后开始生成,执行make TARGET_ARCH=arm;此处的TARGET_ARCH是必须的。生成完成后使用qemu-arm测试:qemu-arm ./busybox ls,如果没有错误的话,会显示出 当前目录下的文件列表。
    说明:在生成的过程中,提示了“/mnt/extdisk/embedded/busybox-1.1.3/include/bbconfigopts.h:28 hmm, untermina”错误,分析相应的文件,发现应该是一个配置包含文件,在配置后保存在.config文件中,因此这个文件中的内容应该不是关键内容,因此我将此文件清空保存,然后重新执行上面的生成命令,成功。

    4. 生成结束后,执行make install,生成一个_install文件夹,内有一个linuxrc文件和bin、sbin、usr三个文件夹,删除linuxrc,将三个文件夹打包。

    5. 准备生成cramfs文件系统:

    (1)创建一个文件夹,比如rootfs,转到rootfs,执行命令mkdir bin dev etc home lib mnt proc sbin sys tmp  var usr,建立相应的文件夹,再建立etc下的init.d文件夹。

    (2)准备启动所需的文件:linuxrc、rcS、inittab、fstab四个文件;
    linuxrc文件:
    ----------------------------------------------
    #!/bin/sh
    echo "mount /etc as ramfs"
    /bin/mount -f -t cramfs -o remount,ro /dev/bon/2 /
    /bin/mount -t ramfs ramfs /var
    /bin/mkdir -p /var/tmp
    /bin/mkdir -p /var/run
    /bin/mkdir -p /var/log
    /bin/mkdir -p /var/lock
    /bin/mkdir -p /var/empty
    #/bin/mount -t usbdevfs none /proc/bus/usb

    exec /sbin/init
    ------------------------------------------------

    rcS文件:
    -----------------------------------------------------------------------------------
    #!/bin/sh
    /bin/mount -a
    -----------------------------------------------------------------------------------
    这两个文件生成后,应该使其具有执行的权限,可使用chmod 775 linuxrc rcS来修改,linuxrc应该放在rootfs根目录,rcS应该放在rootfs/etc/init.d/目录。

    inittab文件:
    -------------------------------------------------
    # This is run first except when booting
    ::sysinit:/etc/init.d/rcS

    # Start an "askfirst" shell on the console
    #::askfirst:-/bin/bash
    ::askfirst:-/bin/sh

    # Stuff to do when restarting the init process
    ::restart:/sbin/init

    # Stuff to do before rebooting
    ::ctrlaltdel:/sbin/reboot
    ::shutdown:/bin/umount -a -r
    -------------------------------------------------
    fstab文件:
    -------------------------------------------------
    none        /proc        proc    defaults    0 0
    none        /dev/pts    devpts    mode=0622    0 0
    tmpfs        /dev/shm    tmpfs    defaults    0 0
    -------------------------------------------------
    这两个文件应该放在rootfs/etc/目录,应该注意其权限问题。

    (3)如果使用linux 2.6.xx内核,应该实现创建节点console、null。转到rootfs/dev/目录来创建:
    sudo mknod console c 5 1
    sudo mknod null c 1 3
    否则就会提示“Warning: unable to open an initial console.
    Kernel panic - not syncing: Attempted to kill init!”的类似错误。

    (4)将刚才在busybox的_install下的三个文件夹的打包文件复制到rootfs目录,解压后删除打包文件。

    (5) 也可以将一些常用的lib文件复制到rootfs/lib/目录下,比如:ld-2.5.so      libc-2.5.so      libcrypt.so.1  libgcc_s.so.1  libm.so.6 ld-linux.so.3  libcrypt-2.5.so  libc.so.6      libm-2.5.so等文件或符号连接,在复制时应该注意采用图形化的界面复制活打包后解包方式复制。

    (6)转到rootfs的上一级目录,使用mkcramfs制作文件系统:./mkcramfs rootfs xxxxx.cramfs,然后下载、少录、启动,成功,如下图所示:


    6. 后记
    (1)qemu-arm仿真工具
    花 费了2天多的时间来使用Busybox制作文件系统,时间有点长,主要是开始走了弯路,使用Busybox1.10版本,当时不太清楚有qemu-arm 仿真arm的工具,借助qemu-arm仿真工具可以很方便的验证自己的busybox编译结果是否正确,可以节省很多时间。就如刚开始我使用 busybox1.10版本,没有借助qemu-arm仿真,下载后启动出现”Failed to execute /linuxrc.  Attempting defaults...“的错误,这个错误很难排除,这几天一有时间就查资料看解决这个问题的方法,只可惜浪费了时间。
    (2)交叉编译工具
    看 网上有资料说,linux内核以及busybox最好使用相同的交叉编译工具编译,否则可能会出现问题。我使用的是不同版本的交叉编译工具,没有出现问 题。因为linux2.6.24内核是几天前编译的,采用的是4.2.1版本;今天编译busybox1.1.3用的是3.3.2版本。
    (3)BusyBox
    Linux2.6.xx 内核取消了devfs的支持,Busybox也跟上了这个步伐,前面我也提到过,对于busybox的新版本应该可以通过修改配置文件十七支持 devfs,具体方法:修改Config.in文件,找到menu "General Configuration",然后在其后适当位置加入如下内容:
    config CONFIG_FEATURE_DEVFS
        bool "Support for devfs"
        default n
        help
          Enable if you want BusyBox to work with devfs.
    这样,在进行配置时就会出现“Support for devfs”选项。只是我加入后,在进行编译,所得到的busybox也没有在qemu-arm仿真中通过。

  • 相关阅读:
    html 上传图片前预览
    php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法
    php 计算 pdf文件页数
    php 获取半年内每个月的订单数量, 总价, 月份
    php 获取两个数组之间不同的值
    小程序支付功能
    关于nginx的Job for nginx.service failed because the control process exited with error code.错误
    linux 安装 Apollo
    MongoDB待续。。。
    ABP vNext...待续
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/3328897.html
Copyright © 2011-2022 走看看