BusyBox 简化嵌入式 Linux 系统
来源:互联网 发布:数据恢复精灵电脑版 编辑:程序博客网 时间:2024/05/11 13:30
BusyBox 简化嵌入式 Linux 系统为小环境准备的一个小工具包 |
级别: 初级 M. Tim Jones (mtj@mtjones.com), 咨询工程师, Emulex 2006 年 9 月 11 日 BusyBox 是很多标准 Linux® 工具的一个单个可执行实现。BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大、更复杂的工具,例如 grep、find、mount 以及 telnet(不过它的选项比传统的版本要少);有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。本文将探索 BusyBox 的目标,它是如何工作的,以及为什么它对于内存有限的环境来说是如此重要。 BusyBox 最初是由 Bruce Perens 在 1996 年为 Debian GNU/Linux 安装盘编写的。其目标是在一张软盘上创建一个可引导的 GNU/Linux 系统,这可以用作安装盘和急救盘。一张软盘可以保存大约 1.4-1.7MB 的内容,因此这里没有多少空间留给 Linux 内核以及相关的用户应用程序使用。
BusyBox 揭露了这样一个事实:很多标准 Linux 工具都可以共享很多共同的元素。例如,很多基于文件的工具(比如 为了让一个可执行程序看起来就像是很多可执行程序一样,BusyBox 为传递给 C 的 main 函数的参数开发了一个很少使用的特性。回想一下 C 语言的 main 函数的定义如下:
清单 1. C 的 main 函数
在这个定义中, 清单 2 给出的这个简单 C 程序展示了 BusyBox 的调用。它只简单地打印 清单 2. BusyBox 使用 argv[0] 来确定调用哪个应用程序
调用这个程序会显示所调用的第一个参数是该程序的名字。我们可以对这个可执行程序重新进行命名,此时再调用就会得到该程序的新名字。另外,我们可以创建一个到可执行程序的符号链接,在执行这个符号链接时,就可以看到这个符号链接的名字。 清单 3. 在使用新命令更新 BusyBox 之后的命令测试
BusyBox 使用了符号链接以便使一个可执行程序看起来像很多程序一样。对于 BusyBox 中包含的每个工具来说,都会这样创建一个符号链接,这样就可以使用这些符号链接来调用 BusyBox 了。BusyBox 然后可以通过
我们可以从 BusyBox 的 Web 站点上下载最新版本的 BusyBox(请参看 参考资料 一节的内容)。与大部分开放源码程序一样,它是以一个压缩的 tarball 形式发布的,我们可以使用清单 4 给出的命令将其转换成源代码树。(如果我们下载的版本不是 1.1.1,那就请在这个命令中使用适当的版本号以及特定于这个版本号的命令。) 清单 4. 展开 BusyBox
结果会生成一个目录,名为 busybox-1.1.1,其中包含了 BusyBox 的源代码。要编译默认的配置(其中包含了几乎所有的内容,并禁用了调试功能),请使用
清单 5. 编译默认的 BusyBox 配置
结果是一个相当大的 BusyBox 映像,不过这只是开始使用它的最简单的方法。我们可以直接调用这个新映像,这会产生一个简单的 Help 页面,里面包括当前配置的命令。要对这个映像进行测试,我们也可以对一个命令调用 BusyBox 来执行,如清单 6 所示。 清单 6. 展示 BusyBox 命令的执行和 BusyBox 中的 ash shell
在这个例子中,我们调用了
如果您正在构建一个具有特殊需求的嵌入式设备,那就可以手工使用 使用手工配置,我们可以指定在最终的 BusyBox 映像中包含的命令。我们也可以对 BusyBox 环境进行配置,例如包括对 NSA(美国国家安全代理)的安全增强 Linux(SELinux),指定要使用的编译器(用来在嵌入式环境中进行交叉编译)以及 BusyBox 应该静态编译还是动态编译。图 1 给出了 图 1. 使用 menuconfig 配置 BusyBox
要手工配置 BusyBox,请使用下面的命令: 清单 7. 手工配置 BusyBox
这为我们提供了可以调用的 BusyBox 的二进制文件。下一个步骤是围绕 BusyBox 构建一个环境,包括将标准 Linux 命令重定向到 BusyBox 二进制文件的符号链接。我们可以使用下面的命令简单地完成这个过程: 清单 8. 构建 BusyBox 环境
默认情况下,这会创建一个新的本地子目录 _install,其中包含了基本的 Linux 环境。在这个根目录中,您会找到一个链接到 BusyBox 的 清单 9. 将符号链接安装到另外一个目录中
使用 到 BusyBox 的命令行链接也可以使用 BusyBox 在运行时动态创建。 清单 10. 在运行时创建命令链接
BusyBox 包括了几个编译选项,可以帮助为我们编译和调试正确的 BusyBox。 表 1. 为 BusyBox 提供的几个 make 选项
在定义配置时,我们只需要输入 清单 11. 编译 BusyBox 二进制程序
如果您非常关心对 BusyBox 映像的压缩,就需要记住两件事情:
BusyBox 中的命令并不支持所有可用选项,不过这些命令都包含了常用的选项。如果我们需要知道一个命令可以支持哪些选项,可以使用 清单 12. 使用 --help 选项调用命令
这些特定的数据只有在启用了
向 BusyBox 添加一个新命令非常简单,这是因为它具有良好定义的体系结构。第一个步骤是为新命令的源代码选择一个位置。我们要根据命令的类型(网络,shell 等)来选择位置,并与其他命令保持一致。这一点非常重要,因为这个新命令最终会在 menuconfig 的配置菜单中出现(在下面的例子中,是 Miscellaneous Utilities 菜单)。 对于这个例子来说,我将这个新命令称为 清单 13. 集成到 BusyBox 中的新命令的源代码
接下来,我们要将这个新命令的源代码添加到所选子目录中的 清单 14. 将命令添加到 Makefile.in 中
接下来再次更新 ./miscutils 目录中的配置文件,以便让新命令在配置过程中是可见的。这个文件名为 Config.in,新命令是按照字母顺序添加的: 清单 15. 将命令添加到 Config.in 中
这个结构定义了一个新配置项(通过 接下来需要更新 ./include/applets.h 文件,使其包含这个新命令。将下面这行内容添加到这个文件中,记住要按照字母顺序。维护这个次序非常重要,否则我们的命令就会找不到。 清单 16. 将命令添加到 applets.h 中
这定义了命令名( 倒数第二个步骤是向 ./include/usage.h 文件中添加详细的帮助信息。正如您可以从这个文件的例子中看到的一样,使用信息可能非常详细。在本例中,我只添加了一点信息,这样就可以编译这个新命令了: 清单 17. 向 usage.h 添加帮助信息
最后一个步骤是启用新命令(通过 使用新的 BusyBox,我们可以对这个新命令进行测试,如清单 18 所示。 清单 18. 测试新命令
就是这样!BusyBox 开发人员开发了一个优秀但非常容易扩展的工具。
BusyBox 是为构建内存有限的嵌入式系统和基于软盘系统的一个优秀工具。BusyBox 通过将很多必需的工具放入一个可执行程序,并让它们可以共享代码中相同的部分,从而对它们的大小进行了很大程度的缩减,BusyBox 对于嵌入式系统来说是一个非常有用的工具,因此值得我们花一些时间进行探索。 学习
获得产品和技术
讨论
|
本文转自
http://www.ibm.com/developerworks/cn/linux/l-busybox/index.html
- [Linux][BusyBox]:BusyBox 简化嵌入式 Linux 系统
- BusyBox 简化嵌入式 Linux 系统
- BusyBox 简化嵌入式 Linux 系统
- BusyBox简化嵌入式Linux系统
- BusyBox 简化嵌入式 Linux 系统
- BusyBox 简化嵌入式 Linux 系统
- BusyBox 简化嵌入式 Linux 系统
- BusyBox 简化嵌入式 Linux 系统
- BusyBox 简化嵌入式 Linux 系统
- BusyBox 简化嵌入式 Linux 系统
- BusyBox 简化嵌入式 Linux 系统
- BusyBox 简化嵌入式 Linux 系统
- BusyBox 简化嵌入式 Linux 系统
- BusyBox 简化嵌入式 Linux 系统
- BusyBox 简化嵌入式 Linux 系统
- BusyBox 简化嵌入式 Linux 系统
- BusyBox 简化嵌入式 Linux 系统
- BusyBox 简化嵌入式 Linux 系统
- AjaxControlToolkit安装指南(转自于网络)
- Java 构造函数
- struts2 ognl 与 jsp2.1 el 的冲突问题
- 如何开启Linux的telnet服务
- 婚前与婚后
- BusyBox 简化嵌入式 Linux 系统
- Oracle817与Oracle7.3.4存储过程动态游标的区别
- SSH(struts+spring+hibernate)迅速开发--第三章 生成POJO对象和表映射(1)
- Fractal Software Composition Framework
- java get properties
- gridview 嵌套 dropdownlist 不点编辑 直接回传进行事件操作
- 三维场景中社区的绘制(一)
- sql server 到主机的TCP/IP 连接失败
- SSH(struts+spring+hibernate)迅速开发--第三章 生成POJO对象和表映射(2)