busybox命令(busybox功能)

BusyBox的诞生BusyBox最初是由Bruce Perens在1996年为Debian GNU/Linux安装盘编写的。目标是在软盘上创建一个可引导的GNU/Linux系统,该软盘可以用作安装盘和急救盘。一张软盘大约可以容纳1.4-1.7MB的内容,所以留给Linux内核和相关用户应用的空间并不多。BusyBox是一个集成了300多个最常用的Linux命令和工具的软件。BusyBox包括一些简单的工具,比如ls、cat和echo,还有一些更大更复杂的工具,比如grep、find、mount和telnet。有人把BusyBox称为Linux工具中的瑞士军刀。简单来说,BusyBox就像一个大工具箱,集成压缩了Linux的很多工具和命令,还包含了Android的外壳。BusyBox揭示了一个事实,即许多标准Linux工具可以共享许多公共元素。例如,许多基于文件的工具(如grep和find)需要在目录中搜索文件的代码。当这些工具被组合成一个可执行程序时,它们可以共享这些相同的元素,这可以产生一个更小的可执行程序。实际上,BusyBox可以将大约3.5MB的工具打包成大约200KB的大小。这为使用Linux的可引导磁盘和嵌入式设备提供了更多的功能。我们可以将BusyBox用于Linux内核版本2.4和2.6。
BusyBox是如何工作的?为了让一个可执行程序看起来像很多可执行程序,BusyBox为传递给C的main函数的参数开发了一个很少使用的特性,回想一下C语言中main函数的定义如下:
Int main( int argc,char *argv[])在这个定义中,argc是传入的参数个数(参数个数),而argv是表示从命令行传入的参数的字符串数组(参数向量)。argv的索引0是从命令行调用的程序名。下面这个简单的C程序展示了BusyBox的调用。它只是打印argv向量的内容:
//test . c # include int main(int argc,char * argv[]){ int I;for(I=0;i argci ) { printf(\’argv[%d]=%s\n\ ‘,I,argv[I]);}返回0;}调用这个程序会显示调用的第一个参数是程序名。我们可以重命名这个可执行程序,然后再次调用它,得到程序的新名称。此外,我们可以创建一个可执行程序的符号链接,当我们执行这个符号链接时,我们可以看到它的名称。用新命令更新BusyBox后的命令测试:
$ gcc -Wall -o test test.c$。/test arg1 arg2argv[0]=。/testargv[1]=arg 1 argv[2]=arg 2 $ mv test new test $。/newtest arg1argv[0]=。/newtestargv[1]=arg 1ln-s新测试linktest。/linktest argargv [0]=。/linktestargv [1]=argbusybox使用符号链接使一个可执行程序看起来像许多程序。对于BusyBox中包含的每个工具,都将以这种方式创建一个符号链接,这样就可以使用这些符号链接来调用BusyBox。BusyBox然后可以通过argv[0]调用内部工具。
配置和编译BusyBox。我们可以从BusyBox官网下载最新版本的BusyBox。像大多数开源程序一样,它是作为压缩的tarball发布的。我们可以使用下面给出的命令将它转换成一个源代码树。(如果我们下载的版本不是1.1.1,请使用适当的版本号和该命令中特定于该版本号的命令。):
$ tar xvfz BusyBox-1.1.1.tar.gz的结果将生成一个名为busybox-1.1.1的目录,其中包含了busybox的源代码。要编译默认配置(它包含几乎所有内容,并且调试功能被禁用),请使用defconfig make Target:编译默认的BusyBox配置:
$ CD BusyBox-1 . 1 . 1 $ Make def config $ Make是一个相当大的BusyBox映像,但这只是开始使用它的最简单的方法。我们可以直接调用这个新映像,这将产生一个简单的帮助页面,包括当前配置的命令。为了测试这个图像,我们还可以调用BusyBox来执行一个命令,展示BusyBox命令和ash shell在BusyBox中的执行情况:
$ ./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进入ash shell,在ash中调用pwd。如果您正在构建一个有特殊需求的嵌入式设备,您可以手动使用menuconfig make目标来配置BusyBox的内容。如果你熟悉Linux内核的编译过程,你会注意到menuconfig使用了和配置Linux内核的内容相同的目标。实际上,它们都使用相同的基于ncurses的应用程序。通过手动配置,我们可以指定包含在最终BusyBox映像中的命令。我们还可以配置BusyBox环境,包括例如针对NSA(美国国家安全局)的安全增强Linux(SELinux),指定要使用的编译器(用于嵌入式环境中的交叉编译)以及BusyBox应该静态编译还是动态编译。图1显示了menuconfig的主界面。在这里,我们应该能够看到可以为BusyBox配置的不同类型的应用程序(applet)。
要手动配置BusyBox,请使用以下命令:
$ make menuconfig$ make这个为我们提供了可以调用的BusyBox的二进制文件。下一步是围绕BusyBox构建一个环境,包括将标准Linux命令重定向到BusyBox二进制文件的符号链接。我们可以通过使用以下命令来简单地完成这个过程:
$ make install默认情况下,这会创建一个新的本地子目录_install,其中包含基本的Linux环境。在这个根目录中,您会发现一个链接到BusyBox的linuxrc程序。这个linuxrc程序在构建安装盘或者急救盘的时候非常有用(允许提前模块化指导)。同样在这个根目录中,还有一个包含操作系统二进制文件的/sbin子目录。还有一个包含用户二进制文件的/bin目录。在构建软盘发行版或嵌入式初始RAM磁盘时,我们可以将this _install目录迁移到目标环境中。我们还可以使用make程序的前缀选项将安装目录重定向到另一个位置。例如,以下命令使用/tmp/newtarget根目录来安装这些符号链接,而不是。/_安装目录:
$ make prefix=/tmp/newtargetinstall使用install make目标创建的符号链接都来自busybox.links文件。这个文件是在编译BusyBox时创建的,它包含一个已配置命令的列表。执行install时,将检查文件busybox.links以确定要创建的符号链接。到BusyBox的命令行链接也可以在运行时使用BusyBox动态创建。CONFIG_FEATURE_INSTALLER选项可以启用此功能,它可以在运行时执行,如下所示:
的美元。/busybox-install-s $-s选项强制创建这些符号链接(否则,将创建硬链接)。该选项要求系统中存在/proc文件系统。
BusyBox编译选项BusyBox包括几个编译选项,可以帮助我们编译和调试正确的BusyBox。
1.定义配置时为BusyBox提供的几个make选项,我们只需要输入make就可以实际编译BusyBox二进制文件。例如,要为所有应用程序编译BusyBox,我们可以执行以下命令:
$ make allyesconfig$ make$BusyBox命令中支持的选项
BusyBox中的命令并不支持所有可用的选项,但是它们都包含常用的选项。如果我们需要知道一个命令可以支持哪些选项,我们可以使用- help选项来调用这个命令:
$ ./busybox WC-help busybox v 1 . 1 . 1(2006 . 04 . 09-15:27 0000)多调用binaryusage : WC[选项].[文件].打印每个文件的行数、字数和字节数,如果指定了多个文件,则打印一个总行数。如果没有文件,读取标准输入。选项: -c打印字节数-l打印新行计数-L打印最长一行的长度-w打印字数$这些特定数据只能在启用CONFIG_FEATURE_VERBOSE_USAGE选项时使用。如果没有这个选项,我们无法获得这些详细的数据,但它可以节省大约13 KB的空间。向BusyBox添加新命令向BusyBox添加新命令非常简单,因为它有一个定义良好的体系结构。第一步是为新命令的源代码选择一个位置。我们应该根据命令的类型(网络、外壳等)来选择位置。)并使其与其他命令保持一致。这非常重要,因为这个新命令最终会出现在menuconfig的配置菜单中(在下面的示例中,是杂项实用程序菜单)。对于本例,我将这个新命令称为newcmd,并将其放在。/miscutils目录。这个新命令的源代码如下:
# include \ ‘ busybox . h \ ‘ int new cmd _ main(int argc,char * argv[]){ int I;printf(\ ‘ new cmd called : \ n \ ‘);for(I=0;i argci ) { printf(\’arg[%d]=%s\n\ ‘,I,argv[I]);}返回0;}接下来,我们将把这个新命令的源代码添加到所选子目录下的Makefile.in中。在这个例子中,我更新了。/miscutils/Makefile.in文件。请按字母顺序添加新命令,以保持与现有命令的一致性:
misc utils-$(config _ mt)=mt . omis tils-$(config _ new cmd)=new cmd . omis tils-$(config _ run level)=run level . o接下来,更新。/miscutils目录,以便在配置过程中可以看到新命令。该文件名为Config.in,新命令按字母顺序添加:
config _ new cmd bool \ ‘ new cmd \ ‘ default n help new cmd是一个新的测试命令。这个结构定义了一个新的配置项(通过config关键字)和一个配置选项(config _ newcmd)。新命令可以被启用或禁用,所以我们对配置的菜单属性使用bool(布尔)值。默认情况下,这个命令是禁用的(n表示否),我们可以在末尾添加一个简短的帮助描述。在。/scripts/config/kconfig-language . txt文件的源代码树,我们可以看到配置语法的完整语法。接下来,您需要更新。/include/applets.h文件来包含这个新命令。将下面一行添加到这个文件中,记住按照字母顺序。这个维护订单非常重要,否则我们的订单将会丢失。将命令添加到applets.h:
Use _ newcmd (applet (newcmd,newcmd_main,_ bb _ dir _ user _ bin,_ bb _ suid _ never))这定义了命令名(newcmd),它在Busybox源代码中的函数名(newcmd _ main),应该在哪里为这个新命令创建一个链接(在这种情况下,它在倒数第二步是将详细的帮助信息添加到。/include/usage.h文件。从这个文件的例子中可以看出,使用信息可能非常详细。在本例中,我只添加了一些信息,以便可以编译这个新命令:add help information to usage.h:
# definenewcmd _ trivial _ usage \ ‘ none \ ‘ # definenewcmd _ full _ usage \ ‘ none \ ‘最后一步是启用新命令(通过make menuconfig,然后在杂项实用程序菜单中启用此选项),然后使用make编译BusyBox。使用新的BusyBox,我们可以测试这个新命令:
$ ./busybox new cmd arg 1 new cmd called : arg[0]=new cmdarg[1]=arg 1$。/busybox new cmd-help busybox v 1 . 1 . 1(2006 . 04 . 12-13:47 0000)多调用二进制用法: Newcmd无就是这样。BusyBox开发人员开发了一个优秀但非常容易扩展的工具BusyBox。
结论BusyBox是构建内存有限的嵌入式系统和基于软盘的系统的优秀工具。BusyBox将许多必要的工具放入一个可执行程序中,并允许它们共享同一部分代码,从而大大减小了它们的大小。BusyBox是嵌入式系统非常有用的工具,值得我们花时间去探索。

其他教程

聊斋故事选(聊斋故事全文阅读青蛇)

2022-8-26 20:08:07

其他教程

photoshop可以实现3d效果吗(用ps做3d效果)

2022-8-26 20:10:11

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索