BusyBox 是很多标准 Linux? 工具的一个单个可执行实现。BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大、更复杂的工具,例如 grep、find、mount 以及 telnet(不过它的选项比传统的版本要少);有些人将 BusyBox 称为
Linux
工具里的瑞士军刀。本文将探索 BusyBox 的目标,它是如何工作的,以及为什么它对于内存有限的环境来说是如此重要。
BusyBox 的诞生
BusyBox 最初是由 Bruce Perens 在 1996 年为 Debian GNU/Linux 安装盘编写的。其目标是在一张软盘上创建一个可引导的 GNU/Linux 系统,这可以用作安装盘和急救盘。一张软盘可以保存大约 1.4-1.7MB 的内容,因此这里没有多少空间留给 Linux 内核以及相关的用户应用程序使用
BusyBox 揭露了这样一个事实:很多标准 Linux 工具都可以共享很多共同的元素。例如,很多基于文件的工具(比如grep和find)都需要在目录中搜索文件的代码。当这些工具被合并
到一个可执行程序中时,它们就可以共享这些相同的元素,这样可以产生更小的可执行程序。实际上, BusyBox 可以将大约 3.5MB 的工具包装成大约 200KB 大小。这就为可引导的磁盘和使用 Linux 的
嵌入式
设备提供了更多功能。我们可以对 2.4 和 2.6 版本的 Linux 内核使用 BusyBox
BusyBox 是如何工作的?
为了让一个可执行程序看起来就像是很多可执行程序一样,BusyBox 为传递给 C 的 main 函数的参数开发了一个很少使用的特性。回想一下 C 语言的 main 函数的定义如下:清单 1. C 的 main 函数IC开发网kG9Kb${/k6Z_N y_t
int main( int argc, char *argv[] )
在这个定义中,argc是传递进来的参数的个数(参数数量),而argv是一个字符串数组,代表从命令行传递进来的参数(参数向量)。argv的索引 0 是从命令行调用的程序名。
清单 2 给出的这个简单 C 程序展示了 BusyBox 的调用。它只简单地打印argv向量的内容。
清单 2. BusyBox 使用 argv[0] 来确定调用哪个应用程序
// test.c
#include
int main( int argc, char *argv[] )
{
int i;
for (i = 0 ; i
调用这个程序会显示所调用的第一个参数是该程序的名字。我们可以对这个可执行程序重新进行命名,此时再调用就会得到该程序的新名字。另外,我们可以创建一个到可执行程序的符号链接,在执行这个符号链接时,就可以看到这个符号链接的名字。
清单 3. 在使用新命令更新 BusyBox 之后的命令测试
$ gcc -Wall -o test test.c
$ ./test arg1 arg2
argv[0] = ./test
argv[1] = arg1
argv[2] = arg2
$ mv test newtest
$ ./newtest arg1
argv[0] = ./newtest
argv[1] = arg1
$ ln -s newtest linktest
$ ./linktest arg
argv[0] = ./linktest
argv[1] = arg
BusyBox 使用了符号链接以便使一个可执行程序看起来像很多程序一样。对于 BusyBox 中包含的每个工具来说,都会这样创建一个符号链接,这样就可以使用这些符号链接来调用 BusyBox 了。BusyBox 然后可以通过argv[0]来调用内部工具。
配置并编译 BusyBox
我们可以从 BusyBox 的 Web 站点上下载最新版本的 BusyBox(请参看
参考资料
一节的内容)。与大部分开放源码程序一样,它是以一个压缩的 tarball 形式发布的,我们可以使用清单 4 给出的命令将其转换成源代码树。(如果我们下载的版本不是 1.1.1,那就请在这个命令中使用适当的版本号以及特定于这个版本号的命令。)
清单 4. 展开 BusyBox
$ tar xvfz busybox-1.1.
$
结果会生成一个目录,名为 busybox-1.1.1,其中包含了 BusyBox 的源代码。要编译默认的配置(其中包含了几乎所有的内容,并禁用了调试功能),请使用defconfigmake 目标:
清单 5. 编译默认的 BusyBox 配置
$ cd busybox-1.1.1
$ make defconfig
$ make
$结果是一个相当大的 BusyBox 映像,不过这只是开始使用它的最简单的方法。我们可以
直接调用这个新映像,这会产生一个简单的 Help 页面,里面包括当前配置的命令。要对这个映像进行测试,我们也可以对一个命令调用 BusyBox 来执行,如清单 6 所示。
清单 6. 展示 BusyBox 命令的执行和 BusyBox 中的 ash shell
$ ./busybox pwd
/usr/local/src/busybox-1.1.1
$ ./busybox ash
/usr/local/src/busybox-1.1.1 $ pwd
/usr/local/src/busybox-1.1.1
/usr/local/src/busybox-1.1.1 $ exit
$在这个例子中,我们调用了pwd(打印工作目录)命令,使用 BusyBox 进入了ashshell,并在ash中调用了pwd
手工配置
如果您正在构建一个具有特殊需求的嵌入式设备,那就可以手工使用menuconfigmake 目标来配置 BusyBox 的内容。如果您熟悉 Linux 内核的编译过程,就会注意到menuconfig与配置 Linux 内核的内容所使用的目标相同。实际上,它们都采用了相同的基于 ncurses 的应用程序。
使用手工配置,我们可以指定在最终的 BusyBox 映像中包含的命令。我们也可以对 BusyBox 环境进行配置,例如包括对 NSA(美国国家安全代理)的安全增强 Linux(SELinux),指定要使用的编译器(用来在嵌入式环境中进行交叉编译)以及 BusyBox 应该静态编译还是动态编译。图 1 给出了menuconfig的主界面。在这里我们应该可以看到可以为 BusyBox 配置的不同类型的应用程序(applet)。
要手工配置 BusyBox,请使用下面的命令:
$ make menuconfig
linux重定向$ make
这为我们提供了可以调用的 BusyBox 的二进制文件。下一个步骤是围绕 BusyBox 构建一个环境,包括将标准 Linux 命令重定向到 BusyBox 二进制文件的符号链接。我们可以使用下面的命令简单地完成这个过程:$ make install
使用installmake 目标创建的符号链接都来自于 busybox.links 文件。这个文件是在编译 BusyBox 时创建的,它包含了已经配置的命令清单。在执行install时,就会检查 busybox.links 文件确定要创建的符号链接。
到 BusyBox 的命令行链接也可以使用 BusyBox 在运行时动态创建。CONFIG_FEATURE_INSTALLER选项就可以启用这个特性,在运行时可以这样执行:
清单 10. 在运行时创建命令链接
$ ./busybox --install -s
本篇文章来源于 黑软基地-中国最大的黑客软件安全教程下载站!(技术学院) 原文链接:www.hackvip/article/sort0136/sort0186/Hackvip_185045.html
BusyBox 编译选项
BusyBox 包括了几个编译选项,可以帮助为我们编译和调试正确的 BusyBox。
表 1. 为 BusyBox 提供的几个 make 选项make 目标说明help显示 make 选项的完整列表defconfig启用默认的(通用)配置allnoconfig禁用所有的应用程序(空配置)allyesconfig启用所有的应用程序(完整配置)allbareconfig启用所有的应用程序,但是不包括子特性config基于文本的配置工具menuconfigN-curses(基于菜单的)配置工具all编译 BusyBox 二进制文件和文档(./docs)busybox编译 BusyBox 二进制文件clean清除源代码树distclean彻底清除源代码树sizes显示所启用的应用程序的文本/数据大小
本篇文章来源于 黑软基地-中国最大的黑客软件安全教程下载站!(技术学院) 原文链接:www.hackvip/article/sort0136/sort0186/Hackvip_185045_2.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论