busybox是如何工作的 busybox是什么意思

的诞生
最初是由 Bruce在 1996 年为GNU/Linux 安装盘编写的 。其目标是在一张软盘上创建一个可引导的 GNU/Linux 系统 , 这可以用作安装盘和急救盘 。一张软盘可以保存大约1.4-1.7MB 的内容 , 因此没有多少空间留给 Linux 内核以及相关的用户应用程序使用 。
是一个集成了三百多个最常用Linux命令和工具的软件 。包含了一些简单的工具 , 例如ls、cat和echo等等 , 还包含了一些更大、更复杂的工具 , 例grep、find、mount以及 。
有些人将称为 Linux工具里的瑞士军刀 。简单的说就好像是个大工具箱 , 它集成压缩了Linux 的许多工具和命令 , 也包含了 系统的自带的shell 。
揭露了这样一个事实:很多标准 Linux 工具都可以共享很多共同的元素 。例如 , 很多基于文件的工具(比如 grep 和 find)都需要在目录中搜索文件的代码 。当这些工具被合并到一个可执行程序中时 , 它们就可以共享这些相同的元素 , 这样可以产生更小的可执行程序 。
实际上 ,  可以将大约 3.5MB 的工具包装成大约 200KB 大小 。这就为可引导的磁盘和使用 Linux 的嵌入式设备提供了更多功能 。我们可以对 2.4 和 2.6 版本的 Linux 内核使用。
是如何工作的?
为了让一个可执行程序看起来就像是很多可执行程序一样 ,  为传递给 C 的 main 函数的参数开发了一个很少使用的特性 。回想一下 C 语言的 main 函数的定义如下:
int main( int argc, char *argv[] )
在这个定义中 , argc 是传递进来的参数的个数(参数数量) , 而 argv 是一个字符串数组 , 代表从命令行传递进来的参数(参数向量) 。argv 的索引 0 是从命令行调用的程序名 。
下面给出的这个简单 C 程序展示了的调用 。它只简单地打印 argv 向量的内容:
【busybox是如何工作的busybox是什么意思】// test.c#include int main( int argc, char *argv[] ){ int i; for (i = 0 ; i < argc ; i++) { printf("argv[%d] = %s\n", i, argv[i]); } return 0;}
调用这个程序会显示所调用的第一个参数是该程序的名字 。我们可以对这个可执行程序重新进行命名 , 此时再调用就会得到该程序的新名字 。另外 , 我们可以创建一个到可执行程序的符号链接 , 在执行这个符号链接时 , 就可以看到这个符号链接的名字 。
在使用新命令更新之后的命令测试:
$ gcc -Wall -o test test.c$ ./test arg1 arg2argv[0] = ./testargv[1] = arg1argv[2] = arg2$ mv test newtest$ ./newtest arg1argv[0] = ./newtestargv[1] = arg1$ ln -s newtest linktest$ ./linktest argargv[0] = ./linktestargv[1] = arg
使用了符号链接以便使一个可执行程序看起来像很多程序一样 。对于中包含的每个工具来说 , 都会这样创建一个符号链接 , 这样就可以使用这些符号链接来调用了 。然后可以通过 argv[0] 来调用内部工具 。
配置并编译
我们可以从官网下载最新版本的 , 与大部分开放源码程序一样 , 它是以一个压缩的形式发布的 , 我们可以使用如下给出的命令将其转换成源代码树 。(如果我们下载的版本不是 1.1.1 , 那就请在这个命令中使用适当的版本号以及特定于这个版本号的命令 。):
$ tar xvfz busybox-1.1.1.tar.gz
结果会生成一个目录 , 名为 -1.1.1 , 其中包含了的源代码 。要编译默认的配置(其中包含了几乎所有的内容 , 并禁用了调试功能) , 请使用make 目标: