热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Busybox制作CRAMFS文件系统

这几天在使用Busybox制作FS2410开发板的CRAMFS文件系统,由于开始下载的是Busybox1.10,每次下载到开发板中,然后启动总是出现”Failedtoexecute/linuxrc.Attemptingdefaults...“的错误。到网上查了大量的资料,并做了大量的实验,发现都不能成功。今天

这几天在使用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仿真中通过。


推荐阅读
  • CGroups: 资源管理和控制
    CGroups(Control Groups)是Linux内核提供的一个功能,旨在限制、记录和隔离进程组使用的物理资源,如CPU、内存和I/O等。它通过精细的资源管理,支持现代容器技术如Docker的资源限制需求。 ... [详细]
  • 在Ubuntu系统上安装搜狗输入法的详细步骤
    本文介绍了如何在Ubuntu操作系统中安装搜狗输入法,包括安装输入框架、下载安装包以及配置输入法的具体步骤。 ... [详细]
  • 本文详细记录了在Ubuntu 9.10操作系统上从零开始搭建LAMP(Linux, Apache, MySQL, PHP)环境的过程,包括遇到的问题及解决方案。旨在为初次尝试搭建LAMP环境的开发者提供参考。 ... [详细]
  • 本文介绍了几个有趣的Linux命令行工具,包括模拟蒸汽机车的sl命令、反转字符串的rev命令、显示随机名言的fortune命令等,不仅增添了命令行操作的乐趣,也展示了Linux系统的多样性和灵活性。 ... [详细]
  • 本文详细介绍如何在树莓派上安装并配置Samba服务,以实现与Windows系统的网络共享兼容性。适合初学者参考。 ... [详细]
  • QEMU环境下加载首个Linux驱动模块
    本文介绍了如何在Ubuntu 20.04系统上使用QEMU虚拟机加载一个简单的Linux驱动模块。此过程涉及Linux内核4.0版本的配置与编译。 ... [详细]
  • 本文详细探讨了在Python开发中遇到的ImportError: 无法找到名为Crypto.Cipher的模块的问题,并提供了多种解决方案,包括环境配置、库安装和代码调整等方法。 ... [详细]
  • 当需要利用sed模式筛选并仅打印筛选结果而无需进一步编辑时,可以通过特定命令实现。 ... [详细]
  • ThinkPHP 文件缓存组件详解与应用
    本文深入探讨了ThinkPHP框架中的文件缓存类实现,提供了详细的代码示例和使用说明,旨在帮助开发者更好地理解和利用这一功能来优化应用程序性能。 ... [详细]
  • 每位开发者都应该拥有一个展示自我技能与分享知识的空间——个人技术博客。本文将指导你如何使用静态网站生成器Hexo结合GitHub Pages搭建这样一个平台。 ... [详细]
  • 本文深入探讨了SSH隧道技术,详细介绍了如何利用SSH协议构建安全的通信通道,实现跨网络的数据传输。通过实例分析,分别阐述了动态SSH隧道、本地SSH隧道和远程SSH隧道的配置方法及应用场景。 ... [详细]
  • 本文探讨了在Python编程中,如何实现当用户输入特定字符(如'q')时,能够优雅地终止程序运行的方法。此问题在使用Xubuntu 18.04 LTS操作系统时尤为常见。 ... [详细]
  • 本文详细介绍如何在Android模拟器上安装TaintDroid的过程,包括解决源代码链接失效及服务器文件变动等问题,旨在帮助后续用户避免不必要的麻烦。 ... [详细]
  • 本文详细介绍如何在Ubuntu 14.04系统中配置GTX1060双显卡,并重新安装显卡驱动。包括下载驱动、切换到开源驱动、卸载旧驱动以及安装新驱动的具体步骤。 ... [详细]
  • Hexdump是一个强大的工具,用于查看和分析二进制文件的内容。本文将详细介绍其功能、常用参数及实际应用案例。 ... [详细]
author-avatar
kevin2502896577
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有