量子技术之家

量子技术之家
科技化赐予人类相信真理的力量

庄思敏:busybox的编译使用及安装

庄思敏:busybox的编译使用及安装

  ?(1)busybox是Linux上的一个应用程序(application),即只有一个ELF文件头。

   (2)它整合了许多Linux上常用的工具和命令(utilities), 如rm, ls, gzip, tftp等。对于这些工具和命令,busybox中的实现可能不是最全的,但却是最常用的,因此它的特点就是短小精悍,特别适合对尺寸很敏感的嵌入式系统。

  ?(3)busybox的官方网站是在这里你可以找到与busybox相关的所有资料。

   busybox 的编译与Linux内核的编译过程类似。从下载最新的源码,解压后,通过以下几步,即可完成busybox的编译和移植:

  (1)make xxxxxxconfig

  ?busybox提供了几种配置:defconfig (缺省配置)、allyesconfig(最大配置)、 allnoconfig(最小配置),一般选择缺省配置即可。

  ? 这一步结束后,将生成.config

  (2)make menuconfig

  ?这一步是可选的,当你认为上述配置中还有不尽如意的地方,可以通过这一步进行微调,加入或去除某些命令。

   这一步实际上是修改.config

  (3)make?CROSS_COMPILE=arm-linux-

  ? 这一步就是根据.config,生成busybox,当然你也可以指定其他的编译器, 如arm-linux-gnueabi-。("make CROSS_COMPILE="将用gcc编译PC机上运行的busybox.

  ?

  ? busybox的使用很简单,有以下三种方式:

  (1) busybox后直接跟命令,如

  ? busybox ls

  busybox tftp

  ?(2)直接将busybox重命名,如

  cp busybox tftp

  ? cp busybox tar

  ? 然后再执行tftp,?tar

  ?(3)创建符号链接(symbolic link), 如

  ? ln -s busybox rm

  ln -s busybox mount

  ? 然后就可以执行rm,mount等

  ?

  ? 以上三种方法中,第三种方法是最简洁最方便的,可是如果手工为busybox中每个命令都创建一个软链接,那是相当的费事。为此,busybox提供了一种自动方法:

  ? 在busybox编译成功后,接着执行“make install”,则会产生一个_install目录,其中包含了busybox及每个命令的软链接。以后只要将这个目录拷贝到目标平台上就可以了。

  ?

  ========================================================

  ?

  一、系统环境:

  1、操作系统:Ubuntu12.04

  2、交叉编译工具:arm-linux-gcc4.4.3

  3、busybox源码包:busybox-1.25.0.tar.bz2

  ?

  二、制作rootfs

  1、建立rootfs目录

  本人在/home/zxx下建立rootfs目录

  #mkdir rootfs

  #cd rootfs

  #mkdir root home bin sbin etc dev usr lib tmp mnt sys proc ?//建立常用目录

  #mkdir usr/lib usr/bin

  #pwd

  /home/zxx/rootfs

  2、解压源码包:

  #tar -jxvf busybox-1.25.0.tar.bz2

  3、修改Makefile配置

  进入busybox-1.25.0目录,修改Makefile文件如下:

  ARCH ?= arm

  CROSS_COMPILE ?=?/usr/local/arm/4.4.3/bin/arm-linux- (与你自己主机的arm-linux-gcc安装目录一样)

  4、编译BusyBox

  ?#make menuconfig

  选择Busybox Settings--->Build Options--->,选择[*] Build Busybox as a static binary(no?shared libs)

  选择Busybox Settings ---> Installation Options --->BusyBox installation prefix(在里面输入BusyBox的安装目录,我是保存在/home/zxx/rootfs下)

  Shells --->Choose your default shell (ash) --->--- ash

  保存并退出

  5、编译安装

  #make

  #make install

  6、把busybox源码目录下的etc的内容拷贝到rootfs目录下的etc下

  # cd /home/zxx/rootfs/etc

  # cp -a /home/zxx/Downloads/busybox-1.25.0/examples/bootfloppy/etc/*

  7、从本机拷贝passwd、shadow、group文件

  # cp /etc/passwd .

  # cp /etc/shadow .

  # cp /etc/group .

  修改passwd文件,把第一行和最后一行的bash修改成ash。

  8、修改初始化文件inittab和fstab

  9、rootfs下lib的制作

  将交叉编译环境下lib库拷贝到/rootfs/lib

  #cd /home/zxx/rootfs/lib

  #cp /usr/local/arm/4.4.3/arm-none-linux-gnueabi/sys-root/

  ?

  三、编译错误解决参考

  1、make出现如下错误:

  miscutils/nandwrite.c: In function 'nandwrite_main':

  miscutils/nandwrite.c:151: error: 'MTD_FILE_MODE_RAW' undeclared (first use in this?function)

  miscutils/nandwrite.c:151: error: (Each undeclared identifier is reported only once

  miscutils/nandwrite.c:151: error: for each function it appears in.)

  scripts/Makefile.build:197: recipe for target 'miscutils/nandwrite.o' failed

  make[1]: *** [miscutils/nandwrite.o] Error 1

  Makefile:742: recipe for target 'miscutils' failed

  make: *** [miscutils] Error 2

  ?

  解决办法:

  MTD_FILE_MODE_RAW在/usr/include/mtd/mtd-abi.h中定义。将/usr/include/mtd/mtd-abi.h拷贝到busybox的include文件中。

  #gedit miscutils/nandwrite.c?

  修改头文件如下:

  ?#include "libbb.h"

  #include "mtd-abi.h"

  #include

  编译可以通过。

  2、继续make,出现如下错误:

  util-linux/blkdiscard.c: In function 'blkdiscard_main':

  util-linux/blkdiscard.c:72: error: 'BLKSECDISCARD' undeclared (first use in this function)

  util-linux/blkdiscard.c:72: error: (Each undeclared identifier is reported only once

  util-linux/blkdiscard.c:72: error: for each function it appears in.)

  scripts/Makefile.build:197: recipe for target 'util-linux/blkdiscard.o' failed

  make[1]: *** [util-linux/blkdiscard.o] Error 1

  Makefile:742: recipe for target 'util-linux' failed

  make: *** [util-linux] Error 2

  ?

  解决办法:

  BLKSECDISCARD在/usr/include/linux/fs.h中定义,方法如上所述,将/usr/include/linux/fs.h拷贝到busybox的include文件中linux下。

  #gedit util-linux/blkdiscard.c

  修改内容如下:

  #include

  编译通过。

  到这里rootfs基本上已经制作出来,有些内容需要的,可根据自己rootfs的需要进行自己增加。最后将rootfs目录制作成镜像后,就可以烧写到开发板上了。

  ?

  =========================================================

  ?

  传统的嵌入式系统都是uboot+kernel+rootfs。其中最简单的rootfs就是ramfs+busybox+/dev + /etc + /lib。至于etc目录中的inittab和init.d/rcS这两个都是busybox中init程序分析的内容。如果本身没有busybox,其实也无所谓这两个脚本。

  1、busybox就是普通的用户程序

  建议同学们可以用objdump看一下busybox,不管是静态编译还是动态编译,busybox只是一个简单的类hello_world程序。

  2、所有的命令都指向busybox

  如果登录到嵌入式设备上,那么我们会发现其实所有命令指向的都是busybox这么一个程序。

  3、第一个用户程序就是busybox

  在kernel返回用户侧运行的第一个程序,即/bin/init或者/sbin/init,其本身运行的还是busybox程序。

  4、返回用户侧后,第一个c函数不是init_main

  之前说过,busybox就是普通的c代码,因此它的入口就是main函数、代码位于libbb目录下。只不过这个程序会判断argv[0]的数值,如果发现是init,那么会调用init_main,如果是cd,那么会调用cd_main,以此类推。

  5、调试busybox

  调试busybox有很多办法。a、调试的时候一般静态编译busybox;b、如果是自己添加的命令,只要gdb server+gdb调试就可以了;c、如果是系统自带命令,不确认系统是否调用busybox,可以用打印或者点灯的方法来解决;d、如果以上方法都不合适,可以自己写一个init程序代替busybox,android开机后的第一个用户程序就是自己写的,也没有用busybox,问题不大。大家平时使用较多的ubuntu,它的启动程序也不是busybox,一般也是由sysvinit+systemd一起完成的。

  6、过分夸大的busybox

  busybox只是rootfs的一个组成部分,没有busybox我们可以自己写一个简单的shell,这些问题都不大。特别是调试的时候,厘清drvier、busybox、script、rootfs问题的时候,常常需要我们自己手写init程序,这个时候如果对rootfs和busybox理解比较充分,调试就会变得很简单了。

  ?

量子技术之家 版权所有,未经允许不得转载:量子技术之家 » 庄思敏:busybox的编译使用及安装
分享到: 更多 (0)