大家好,今天小编来为大家解答忙碌盒说明这个问题,很多人还不知道,现在让我们一起来看看吧!
有人称BusyBox 为Linux 工具中的瑞士军刀。简单来说,BusyBox就像一个大工具箱。它集成并压缩了Linux的许多工具和命令,还包括Android系统内置的shell。
BusyBox 揭示了一个事实,即许多标准Linux 工具可以共享许多通用元素。例如,许多基于文件的工具(例如grep 和find)需要在目录中搜索文件的代码。当这些工具组合成可执行程序时,它们可以共享这些相同的元素,从而产生更小的可执行程序。
实际上,BusyBox 可以将大约3.5MB 的工具包装成大约200KB。这为使用Linux 的可启动磁盘和嵌入式设备提供了更多功能。我们可以将BusyBox 与Linux 内核版本2.4 和2.6 一起使用。
BusyBox 是如何工作的?
为了使一个可执行程序看起来像多个可执行程序,BusyBox 为传递给C 主函数的参数开发了一项很少使用的功能。回想一下,C语言中main函数的定义如下:
int main( int argc, char *argv[] ) 在这个定义中,argc是传入的参数个数(参数个数),argv是一个字符串数组,表示从命令行传入的参数(参数向量)。 argv 的索引0 是从命令行调用的程序的名称。
下面给出的简单C 程序显示了BusyBox 的调用。它只是打印argv 向量的内容:
//test.c#include stdio.hint main( int argc, char *argv[] ){ int i; for (i=0 ; i argc ; i++) { printf(‘argv[%d]=%s\n ‘, i, argv[i]); } return 0;} 调用这个程序会显示调用的第一个参数是程序的名称。我们可以重命名这个可执行程序,当我们再次调用它时,我们将得到程序的新名称。此外,我们还可以创建到可执行程序的符号链接。当执行符号链接时,可以看到符号链接的名称。
使用新命令更新BusyBox 后的命令测试:
$ gcc -Wall -o test test.c$ ./test arg1 arg2argv[0]=./testargv[1]=arg1argv[2]=arg2$ mv 测试newtest$ ./newtest arg1argv[0]=./newtestargv[ 1]=arg1$ ln -s newtest 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 目标:
编译默认的BusyBox 配置:
$ cd busybox-1.1.1$ make defconfig$ make 的结果是一个相当大的BusyBox 映像,但这只是开始使用它的最简单方法。我们可以直接调用这个新图像,这将生成一个简单的帮助页面,其中包含当前配置的命令。为了测试这个图像,我们还可以在命令上调用BusyBox,显示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进入ash shell,在ash中调用pwd。
如果您正在构建有特殊要求的嵌入式设备,您可以使用menuconfig make 目标手动配置BusyBox 的内容。如果您熟悉Linux 内核编译过程,您会注意到menuconfig 与用于配置Linux 内核内容的目标相同。事实上,它们都使用相同的基于ncurses 的应用程序。
使用手动配置,我们可以指定要包含在最终BusyBox 映像中的命令。我们还可以配置BusyBox环境以包括例如NSA(美国国家安全局)的安全增强型Linux(SELinux),指定使用哪个编译器(用于嵌入式环境中的交叉编译)以及哪个BusyBox应该静态编译或者动态编译。
图1所示为menuconfig的主界面。在这里我们应该看到可以为BusyBox 配置的不同类型的应用程序(小程序)。
要手动配置BusyBox,请使用以下命令:
$ make menuconfig$ make 这给了我们一个可以称为BusyBox 的二进制文件。下一步是围绕BusyBox 构建一个环境,包括将标准Linux 命令重定向到BusyBox 二进制文件的符号链接。我们只需使用以下命令即可完成此过程:
$ 进行安装
默认情况下,这会创建一个新的本地子目录_install,其中包含基本Linux 环境。在此根目录中,您将找到链接到BusyBox 的linuxrc 程序。 linuxrc 程序在构建安装盘或救援盘(允许提前进行模块化引导)时非常有用。此外,在此根目录中,还有一个/sbin 子目录,其中包含操作系统二进制文件。
还有一个包含用户二进制文件的/bin 目录。当构建软盘发行版或嵌入式初始RAM盘时,我们可以将此_install目录迁移到目标环境。我们还可以使用make 程序的PREFIX 选项将安装目录重定向到另一个位置。例如,以下命令使用/tmp/newtarget 根目录来安装这些符号链接,而不是使用./_install 目录:
$ make PREFIX=/tmp/newtarget 安装
使用install make 目标创建的符号链接来自busybox.links 文件。该文件是在编译BusyBox 时创建的,包含配置命令的列表。当您执行安装时,将检查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 –helpBusyBox v1.1.1 (2006.04.09-15:27+0000) 多重调用binaryUsage: wc [选项]. [文件].打印每个文件的行数、字数和字节数,以及如果指定了多个文件,则为一总行。没有FILE,读取标准输入。Options: -c 打印字节数-l 打印换行数-L 打印最长行的长度-w 打印字数$这些特定数据仅在启用CONFIG_FEATURE_VERBOSE_USAGE 选项时可用。如果没有此选项,我们将无法获取详细数据,但这将节省大约13 KB 的空间。
向BusyBox 添加新命令
由于BusyBox 具有定义明确的架构,因此向BusyBox 添加新命令非常简单。第一步是选择新命令的源代码的位置。我们希望根据命令的类型(网络、shell 等)来选择位置并与其他命令保持一致。
这很重要,因为这个新命令最终将出现在menuconfig 的配置菜单中(在下面的示例中为“杂项实用程序”菜单)。
对于本示例,我调用了新命令newcmd 并将其放置在./miscutils 目录中。这个新命令的源代码如下:
#include ‘busybox.h’int newcmd_main( int argc, char *argv[] ){ int i; printf(‘newcmd 名为:\n’); for (i=0 ; i argc ; i++) { printf(‘arg[ %d]=%s\n’, i, argv[i]); } return 0;} 接下来,我们将这个新命令的源代码添加到所选子目录中的Makefile.in 中。在本例中,我更新了./miscutils/Makefile.in 文件。请按字母顺序添加新命令,以保持与现有命令的一致性:
MISCUTILS-$(CONFIG_MT) +=mt.oMISCUTILS-$(CONFIG_NEWCMD) +=newcmd.oMISCUTILS-$(CONFIG_RUNLEVEL) +=runlevel.o 接下来,再次更新./miscutils 目录中的配置文件,以允许新命令被配置的过程是可见的。该文件名为Config.in,新命令按字母顺序添加:
config CONFIG_NEWCMD bool ‘newcmd’ default n help newcmd 是一个新的测试命令。该结构定义了一个新的配置项(通过config 关键字)和一个配置选项(CONFIG_NEWCMD)。新命令可以启用或禁用,因此我们对配置的菜单属性使用布尔值。
该命令默认是禁用的(n表示否),我们可以在末尾放一个简短的帮助说明。在源码树的./scripts/config/Kconfig-language.txt文件中,我们可以看到配置语法的完整语法。
接下来,您需要更新./include/applets.h 文件以包含此新命令。将以下行添加到此文件中,记住按字母顺序排列。维护这个顺序非常重要,否则我们的命令将找不到。
将命令添加到applet.h 中:
USE_NEWCMD(APPLET(newcmd, newcmd_main, _BB_DIR_USER_BIN, _BB_SUID_NEVER))
这定义了命令名称(newcmd),它在Busybox源代码中的函数名称(newcmd_main),其中应该为这个新命令创建链接(在本例中,它位于/usr/bin目录中),最后该命令有权设置用户ID(在本例中为否)。
倒数第二步是将详细的帮助信息添加到./include/usage.h 文件中。从这个文件的示例中可以看出,使用信息可以非常详细。在本例中,我只是添加了一些信息,以便可以编译新命令:
在usage.h中添加帮助信息:
#define newcmd_trivial_usage ‘None’ #define newcmd_full_usage ‘None’ 最后一步是启用新命令(通过make menuconfig,然后在Miscellaneous Utilities 菜单中启用此选项),然后使用make 编译BusyBox。
使用新的BusyBox 我们可以测试这个新命令:
$ ./busybox newcmd arg1newcmd called:arg[0]=newcmdarg[1]=arg1$ ./busybox newcmd –helpBusyBox v1.1.1 (2006.04.12-13:47+0000) 多调用binaryUsage: newcmd NoneNone 就是这样,由BusyBox 开发人员开发一个优秀但非常容易扩展的工具BusyBox。
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/146295.html
用户评论
暖栀
BusyBox真是太赞了!手机上装个BusyBox就能执行各种常用的Linux命令,外出旅行玩开源设备简直要它来帮忙! 之前好多小问题都能自己解决了,比买一堆工具软件省钱啊!
有8位网友表示赞同!
在哪跌倒こ就在哪躺下
作为嵌入式开发的入门者,这篇文章看得真明白了。把BusyBox的功能说得清清楚楚,而且还附带了实例说明,太棒啦!现在终于知道怎么在ARM平台上使用它了。
有10位网友表示赞同!
予之欢颜
我用的Android手机自带BUSYBOX的功能,之前看不懂它的用处,看完这篇说明豁然开朗!原来这么多常用的功能都是靠 BusyBox 来实现的啊!
有14位网友表示赞同!
稳妥
这篇文章写的不错,入门的人看起来比较容易懂。只是想问一下,BusyBox 的运行环境对硬件有什么要求吗?我想在一些资源有限的设备上测试它。
有6位网友表示赞同!
爱你心口难开
BusyBox真是个宝藏工具!以前我每次需要用到Linux命令的时候都很麻烦,都要连接到服务器才能用。有了BusyBox就方便多了,可以直接在我的手机上使用!
有9位网友表示赞同!
冷落了♂自己·
这篇文章写的非常详细,把BusyBox的所有功能都介绍了,甚至还包括了一些高级的使用技巧!太棒了!可以帮我解决很多开发中的问题!
有17位网友表示赞同!
孤自凉丶
感觉BusyBox这个软件的功能有点过于庞杂吧,对于我这种只偶尔用到Linux命令的用户来说显得有些 overkill。希望能够提供一些更精简的替代方案。
有6位网友表示赞同!
巷陌繁花丶
这篇文章写的太深奥了!我不是学习计算机专业的,看着这些复杂的命令还是不太懂。希望能有更通俗易懂的解释或视频教程!
有20位网友表示赞同!
〆mè村姑
BusyBox真是太实用了!我现在经常在家里使用它来管理我的服务器,比如查看日志、重启服务等等。有了它,我感觉自己就像拥有了一个强大的工具箱!
有12位网友表示赞同!
此生一诺
对于嵌入式系统爱好者来说,学习 BusyBox 是必不可少的。这篇说明写的不错,帮助我入门了!之后我会继续探索它的更多使用场景!
有10位网友表示赞同!
陌颜
BusyBOX这个软件,名字好长啊,估计功能也很复杂,看下链接了解一下呗。
有8位网友表示赞同!
酒笙倾凉
想问问,Busybox的安全性怎么样?在手机上使用会不会带来安全风险?
有17位网友表示赞同!
哭着哭着就萌了°
感觉BusyBox这种工具更适合程序员或者熟悉Linux命令的人使用吧,对于普通用户来说可能不是那么必要。
有13位网友表示赞同!
断秋风
在智能设备环境下,Busybox的功能应用非常广泛。这篇文章对 Busybox 做了很好的介绍,让我了解到它的重要性。
有10位网友表示赞同!
铁树不曾开花
学习BusyBox的难度是不是有点高啊?我以前一直用Windows操作系统的笔记本电脑,现在想尝试使用Linux系统开发,听说Busybox是常用的工具,请问怎么样才能学会呢?
有12位网友表示赞同!
醉红颜
这篇文章讲得真不错,把 BusyBox 的一些关键特性总结得很到位。我现在对它有了更深层次的理解!
有8位网友表示赞同!
最迷人的危险
我之前在网上看到过关于 BusyBox 的介绍,说它的功能非常强大,可以代替很多工具软件。看完这篇说明,更坚定了我的学习决心!
有15位网友表示赞同!