您当前的位置:五五电子网电子知识单片机-工控设备嵌入式系统-技术利用BusyBox简化嵌入式Linux系统 正文
利用BusyBox简化嵌入式Linux系统

利用BusyBox简化嵌入式Linux系统

点击数:7933 次   录入时间:03-04 11:58:51   整理:http://www.55dianzi.com   嵌入式系统-技术

    BusyBox是很多标准Linux®工具的一个单个可执行实现。BusyBox包含了一些简单的工具,例如cat和echo,还包含了一些更大、更复杂的工具,例如grep、find、mount以及telnet(不过它的选项比传统的版本要少);有些人将BusyBox称为Linux工具里的瑞士军刀。本文将探索BusyBox的目标,它是如何工作的,以及为什么它对于内存有限的环境来说是如此重要。

    POSIX环境

    尽管BusyBox的目标是提供一个相当完整的POSIX(可移植操作系统接口)环境,这是一个期望,而不是一种需求。这些工具虽然并不完整,但是它们提供了我们期望的主要功能。

    BusyBox源代码树

    BusyBox的源代码树组织得很好。这些工具都基于它们的用途进行了分类,并存储在单独的子目录中。例如,网络工具和守护进程(如httpd、ifconfig等)都在。/networking目录中;标准的模块工具(包括insmod、rmmod和lsmod)都在。/modutils目录中;编辑器(例如vi和流编辑器,如awk和sed)都在。/editors目录中。makefile配置、编译和安装所使用的各个文档都在这个目录树的根目录中。

    清单5。编译默认的BusyBox配置

    $cdbusybox-1。1。1

    $makedefconfig

    $make

    $

    结果是一个相当大的BusyBox映像,不过这只是开始使用它的最简单的方法。我们可以直接调用这个新映像,这会产生一个简单的Help页面,里面包括当前配置的命令。要对这个映像进行测试,我们也可以对一个命令调用BusyBox来执行,如清单6所示。

    清单6。展示BusyBox命令的执行和BusyBox中的ashshell

    $。/busyboxpwd

    /usr/LOCal/SRC/busybox-1。1。1

    $。/busyboxash

    /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)。

    图1。使用menuconfig配置BusyBox

    多体系结构支持

    可以简单地为BusyBox指定交叉编译器意味着我们可以为很多体系结构编译BusyBox。要为您的目标体系结构编译BusyBox,我们需要一个交叉编译器和一个已经为特定目标体系结构编译好的C库(uClibc或glibc)。

    要手工配置BusyBox,请使用下面的命令:

    清单7。手工配置BusyBox

    $makemenuconfig

    $make

    $

    这为我们提供了可以调用的BusyBox的二进制文件。下一个步骤是围绕BusyBox构建一个环境,包括将标准Linux命令重定向到BusyBox二进制文件的符号链接。我们可以使用下面的命令简单地完成这个过程:

    清单8。构建BusyBox环境

    $makeinstall

    $

    默认情况下,这会创建一个新的本地子目录_install,其中包含了基本的Linux环境。在这个根目录中,您会找到一个链接到BusyBox的linuxrc程序。这个linuxrc程序在构建安装盘或急救盘(允许提前进行模块化的引导)时非常有用。同样是在这个根目录中,还有一个包含操作系统二进制文件的/sbin子目录。还有一个包含用户二进制文件的/bin目录。在构建软盘发行版或嵌入式初始RAM磁盘时,我们可以将这个_install目录迁移到目标环境中。我们还可以使用make程序的PREFIX选项将安装目录重定向到其他位置。例如,下面的代码就使用/tmp/newtarget根目录来安装这些符号链接,而不是使用。/_install目录:

    清单9。将符号链接安装到另外一个目录中

    $makePREFIX=/tmp/newtargetinstall

    $

    使用installmake目标创建的符号链接都来自于busybox。links文件。这个文件是在编译BusyBox时创建的,它包含了已经配置的命令清单。在执行install时,就会检查busybox。links文件确定要创建的符号链接。

    到BusyBox的命令行链接也可以使用BusyBox在运行时动态创建。CONFIG_FEATURE_INSTALLER选项就可以启用这个特性,在运行时可以这样执行:

    清单10。在运行时创建命令链接

    $。/busybox--install-s

    $

    -s选项强制创建这些符号链接(否则就创建硬链接)。这个选项要求系统中存在/proc文件系统。

    BusyBox编译选项

    BusyBox包括了几个编译选项,可以帮助为我们编译和调试正确的BusyBox。

    表1。为BusyBox提供的几个make选项

    make目标说明

    help显示make选项的完整列表

    defconfig启用默认的(通用)配置

    allnoconfig禁用所有的应用程序(空配置)

    allyesconfig启用所有的应用程序(完整配置)

    allbareconfig启用所有的应用程序,但是不包括子特性

    config基于文本的配置工具

    menuconfigN-curses(基于菜单的)配置工具

    all编译BusyBox二进制文件和文档(。/docs)

    busybox编译BusyBox二进制文件

    clean清除源代码树

    distclean彻底清除源代码树

    sizes显示所启用的应用程序的文本/数据大小

    在定义配置时,我们只需要输入make就可以真正编译BusyBox二进制文件。例如,要为所有的应用程序编译BusyBox,我们可以执行下面的命令:

    清单11。编译BusyBox二进制程序

    $makeallyesconfig

    $make

    $

    压缩BusyBox

    如果您非常关心对BusyBox映像的压缩,就需要记住两件事情:

    永远不要编译为静态二进制文件(这会将所有需要的库都包含到映像文件中)。相反,如果我们是编译为一个共享映像,那么它会使用其他应用程序使用的库(例如/lib/libc。so。X)。

    使用uClibc进行编译,这是一个对大小进行过优化的C库,它是为嵌入式系统开发的;而不要使用标准的glibc(GNUC库)来编译。

    BusyBox命令中支持的选项

    BusyBox中的命令并不支持所有可用选项,不过这些命令都包含了常用的选项。如果我们需要知道一个命令可以支持哪些选项,可以使用--help选项来调用这个命令,如清单12所示。

    清单12。使用--help选项调用命令

    $。/busyboxwc--help

    BusyBoxv1。1。1(2006。04。09-15:27+0000)multi-callbinary

    Usage:wc[OPTION]。。。[FILE]。。。

    Printline,word,andbytecountsforeachFILE,andatotallineif

    morethanoneFILEisspecified。WithnoFILE,readstandardinput。

    Options:

    -cprintthebytecounts

    -lprintthenewlinecounts

    -Lprintthelengthofthelongestline

    -wprintthewordcounts

    $

    这些特定的数据只有在启用了CONFIG_FEATURE_VERBOSE_USAGE选项时才可以使用。如果没有这个选项,我们就无法获得这些详细数据,但是这样可以节省大约13KB的空间。

    向BusyBox中添加新命令

    向BusyBox添加一个新命令非常简单,这是因为它具有良好定义的体系结构。第一个步骤是为新命令的源代码选择一个位置。我们要根据命令的类型(网络,shell等)来选择位置,并与其他命令保持一致。这一点非常重要,因为这个新命令最终会在menuconfig的配置菜单中出现(在下面的例子中,是MiscellaneousUtilities菜单)。

    对于这个例子来说,我将这个新命令称为newcmd,并将它放到了。/miscutils目录中。这个新命令的源代码如清单13所示。

    清单13。集成到BusyBox中的新命令的源代码

    #include"busybox。h"

    intnewcmd_main(intargc,char*argv[])

    {

    inti;

    printf("newcmdcalLED:n");

[1] [2]  下一页


本文关键字:嵌入式  Linux  嵌入式系统-技术单片机-工控设备 - 嵌入式系统-技术

《利用BusyBox简化嵌入式Linux系统》相关文章>>>