一、什么是busybox
BusyBox 是很多标准 Linux® 工具的一个单个可执行实现。BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大、更复杂的工具,例如 grep、find、mount 以及 telnet(不过它的选项比传统 的版本要少);有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。
原理是:很多标准 Linux 工具都可以共享很多共同的元素。例如,很多基于文件的工具(比如 grep 和 find)都需要在目录中搜索文件的代码。当这些工具被合并到一个可执行程序中时,它们就可以共享这些相同的元素,这样可以产生更小的可执行程序。实际上,BusyBox 可以将大约 3.5MB 的工具包装成大约 200KB 大小。
特点是:
1.BusyBox利用Linux实用工具中代码大量重复的事实,将重复的代码重新整理,放
到一个文件中,减少了多次包含。
2.BusyBox通过简化非必要的复杂功能,减少占用的空间。
3.BusyBox的完全可定制性,提供了非常灵活,宜于扩展的结构。
二、用法:
1.busybox <applet> [arguments...] # or
比如运行echo命令:
$./busybox echo “This is busybox”
This is busybox
2.<applet> [arguments...] # if symlinked
这种用法的前提是建立了符号连接。比如:
$ ln -s busybox ls
$ ./ls /
bin cdrom etc lib media opt root selinux sys var
boot dev home lost+found mnt proc sbin srv tmp usr
BusyBox 中的命令并不支持所有可用选项,不过这些命令都包含了常用的选项。如果我们需要知道一个命令可以支持哪些选项,可以使用 –help 选项来调用这个命令
三、配置并编译 BusyBox
(一)默认配置
1.下载最新源代码:http://www.busybox.net/downloads/,我下载的版本是
busybox-1.13.4。
2.不用说都要解压源码包:$ tar jxvf busybox-1.13.4.tar.bz2
3.在解压后的源码包中配置:
$ make defconfig #使用默认的配置
$ make #编译源码
4.到这一步已经生成了一个相当大的busybox的映像,此时就可以使用busybox程序了,用法上面已经提到过,比如:
$ ./busybox echo “this is a busybox”
this is a busybox
(二)手工配置:
配置成嵌入式Linux使用的busybox,主机Ubuntu9.04,目标板smartarm3250,目标板系统Linux2.6.27,交叉编译器是
/opt/nxp/gcc-4.3.2-glibc-2.7/bin/arm-vfp-linux-gnu-gcc
1.在源码目录下(前提是你下载了源码并解压),执行命令:$ make menuconfig
这样就会出现图形配置菜单,如图:
其中 — Applets 下是对不同种类命令的配置,可以配置是否加入到busybox程序中去。
2.交叉编译:
$make CROSS_COMPILE=
/opt/nxp/gcc-4.3.2-glibc-2.7/bin/arm-vfp-linux-gnu-
其中的CROSS_COMPILE指的是你交叉编译器gcc的路径。也可以通过第一步的配置
界面进入到Busybox Settings —> Build Options —>
() Cross Compiler prefix选择此项,
然后填入“/opt/nxp/gcc-4.3.2-glibc-2.7/bin/arm-vfp-linux-gnu-”,然后再
make即可。
3.到此已经编译为目标板可运行的程序,通过命令
$ file busybox
busybox: ELF 32-bit LSB executable, ARM, version 1, dynamically linked
(uses shared libs), stripped
4.可知编译成功。只需将此程序下载到板子即可运行。
四、扩展BusyBox的功能:添加自己的命令
请参考docs/new_applet-HOWTO.txt文档
a)在适当的目录编写applet代码,在这里我的代码是myls.c,将此代码文件放到coreutils目录下(因为ls.c在此目录)。
b)在所在目录的 Config.in文件中,增加applet的图形配置
config MYLS
bool “myls”
default y
help
myls is used to list the contents of directories.
c)在所在目录的Kbuild文件中,增加相应的 applet编译选项
lib-$(CONFIG_MYLS) += myls.o
d)在include/usage.h中增加相应的usage说明
#define myls_trivial_usage “myls truvial help”
#define myls_full_usage ”myls full usage”
e)在 inlucde/applets.h中增加相应的applet
USE_MYLS(APPLET_NOEXEC(myls, myls, _BB_DIR_BIN, _BB_SUID_NEVER, myls))
经过上面的步骤以后,再make menuconfig进入到Coreutils —> 就会发现有
[*] myls
* 号表明默认配置到busybox中去,默认值在Config.in文件中,可以配置为无。编译成功后就可以像其他命令一样来使用此命令了。
原文来自 :