BusyBox:Linux 的瑞士军刀
Linux 正被应用于越来越紧凑的环境——存储空间只有几千兆字节或内存只有几十兆字节的设备或情况。许多Linux Journal的文章都探讨了这个日益增长的嵌入式系统领域。在这里,我将介绍一个非常棒的开源工具,它适用于在这些紧凑环境中需要一套实用程序的人们。
BusyBox 是一个单二进制应用程序,它包含了超过 70 个标准 Linux 实用程序的功能。BusyBox 项目由 Bruce Perens 在他领导 Debian 项目时启动。此后许多其他人贡献了代码;该项目目前由 Erik Andersen 维护,他还为此维护了一个网页 http://busybox.lineo.com/。(BusyBox 由嵌入式 Linux 供应商 Lineo, Inc. 赞助。请参阅 http://www.lineo.com/。)
BusyBox 替换的相应标准实用程序在一个标准 Linux 系统中占用大约 1.5MB 的磁盘空间。BusyBox 程序仅使用 260KB 的磁盘空间;它甚至可以编译成仅包含您选择的少量实用程序,仍然在一个单独的二进制文件中。我们稍后将看到如何做到这一点。
Linux 发行版通常包含带有许多独立实用程序的软件包,通常在名为 textutils、shellutils 或类似名称的集合中。这些实用程序通常功能非常齐全。例如,列出文件的命令 ls 支持超过 50 个命令行选项。由于这些实用程序功能如此齐全,它们有时比您预期的要大。例如,ls 命令(动态链接)占用 48KB 的磁盘空间。虽然在标准 PC 上您不会注意到这一点,但这些 50 个选项中的许多选项在嵌入式系统或启动盘上只是浪费空间。BusyBox 将许多实用程序组合在一个二进制文件中,将每个实用程序的功能限制为最常用的功能。ls 命令在 BusyBox 中只有区区 12 个选项——对于我们大多数人来说已经足够了。
当您在 shell 中(在 Linux 命令行)输入实用程序的名称时,shell 会找到具有该名称的二进制文件并执行它。当您安装 BusyBox 时,它会在您的文件系统中创建链接,因此您拥有的不是真正的 ls 命令,而是一个名为 “ls” 的符号链接,它指向 BusyBox 二进制文件。ls 的目录列表将如下所示
lrwxrwxrwx 1 nwells users 12 May 17 14:47 ls ->/bin/busybox
在命令提示符下键入 ls 会导致 shell 启动 BusyBox 程序,然后该程序会检查您调用它的名称。看到您在本例中输入了 ls,BusyBox 程序将继续像 ls 一样运行,并根据该命令解释任何其他选项。
如果关于一个程序中包含 70 个实用程序的讨论让您感到好奇,这里有一些 BusyBox 包含的示例。上面给出的网站上有完整的列表和文档
chmod, chown, chroot, lsmod, rmmod, insmod
dd, df, du, mkfs.minix, fsck.minix, mount, sfdisk
find, grep, sed, gzip, gunzip, tar
kill, killall, ps
cp, cut, mv, rm, ln, more, tr
nslookup, ping, telnet
init, syslogd, sh
这些实用程序中的许多都是简化版本,以适应上面提到的 260KB 总空间。例如,sh shell 不支持 if/then/else 语句或 while 循环,但它有足够的内置命令来处理简单的启动 shell 脚本。此外,像 init 和 tar 这样的命令功能大大减少,但对于许多不需要完整功能实用程序的应用程序来说,它们足以完成工作。
将 BusyBox 添加到您的系统很简单。首先,访问 ftp.lineo.com/pub/busybox 并下载最新版本的压缩 tar 文件来获取源代码。在撰写本文时,最新版本是文件 busybox-0.45.tar.gz,但在您阅读本文时可能会有更新的版本可用。BusyBox 的工作似乎在稳步进行。
下载 tar 文件后,将其放置在工作目录中,并使用此命令解压文件
tar xvzf busybox-0.45.tar.gz
更改到新创建的 busybox 目录(这次我用小写名称来匹配二进制文件名),然后输入 make 命令
cd busybox-0.45 make现在您可以准备测试一些 BusyBox 命令了。在使用 make 命令后,busybox 二进制文件位于主 busybox 目录中。为了使用 BusyBox 的特定功能,请使用命令名称作为参数执行 busybox 二进制文件。例如,要使用 ls 命令,请在 busybox-0.45 目录中输入
./busybox ls或者要使用 lsmod 命令,请输入
./busybox lsmod其他命令选项可以放在命令名称之后。例如,要使用 du 命令仅查看 /etc 目录树的内容,请键入:./busybox du /etc
BusyBox 的另一个重要功能是,您可以查看 BusyBox 替换的每个实用程序的简短在线帮助屏幕。只需将 --help 选项与命令一起使用即可。例如,要了解 BusyBox 支持的 ls 选项,请输入 ./busybox ls --help
这将显示以下帮助文本
BusyBox v0.45 (2000.05.17-20:38+0000) multi-call binary -- GPL2 Usage: ls [-1acdelnpuxACF] [filenames...] Options: -a do not hide entries starting with . -c with -l: show ctime (the time of last modification of file status information) -d list directory entries instead of contents -e list both full date and full time -l use a long listing format -n list numeric UIDs and GIDs instead of names -p append indicator (one of /=@|) to entries -u with -l: show access time (the time of last access of the file) -x list entries by lines instead of by columns -A do not list implied . and .. -C list entries by columns -F append indicator (one of */=@|) to entries
BusyBox 在没有一套常规 Linux 实用程序程序的系统上最有用,但您可能会在标准 Linux 系统上对其进行探索。因此,在安装 BusyBox 时,您应该使用 PREFIX 变量。安装过程会为 BusyBox 支持的所有实用程序创建符号链接。这允许您输入 ls 而不是 busybox ls。假设您已开始在 /tmp 目录中使用 BusyBox(这样由 tar 命令创建了一个名为 /tmp/busybox-0.45 的目录)。然后,如果您想在同一区域中创建符号链接,请使用此命令
make PREFIX=/tmp/busybox-0.45 install
/tmp/busybox-0.45 目录将包含名为 bin、sbin 和 usr 的子目录,每个子目录都有指向 /bin/busybox 的符号链接。您还需要在使用这些符号链接之前将 busybox 二进制文件复制到 /bin
cp /tmp/busybox-0.45/busybox /bin现在您可以准备探索 BusyBox 子目录中的符号链接了。例如,更改到 bin 目录
cd /tmp/busybox-0.45/bin然后将 ls 符号链接与 --help 选项一起使用
./ls --help您会看到与之前指示的相同的帮助文本。这表明正在使用 BusyBox 而不是 Linux 系统上的标准 ls 命令。
BusyBox 使用 GNU C 库或 glibc,这会大大增加嵌入式系统或启动盘的空间需求。您可以考虑查看备用 C 库以节省空间。示例包括 minix libc 和 newlibc。另一个看起来很有前景但尚未支持 BusyBox 全部功能的示例是 Rt-Control 的 uC-libc 项目(请参阅 http://www.uclinux.org/)。BusyBox 的维护者 Erik Andersen 目前正在努力增强这个迷你 C 库,以便它可以用于减少 BusyBox 的总大小需求。
到目前为止对 BusyBox 的描述很简单,但并未涵盖该程序提供的所有功能。回到您在编译 BusyBox 时解压的源代码,将文件 busybox.def.h 加载到文本编辑器中
cd /tmp/busybox-0.45 vi busybox.def.h
此文件的第一部分(大约前 100 行)包含 #define 语句,用于 BusyBox 中将包含的每个实用程序功能。如果您不想包含其中一个实用程序的功能,只需注释掉该行即可。例如,如果您在使用 BusyBox 的系统上不需要 sed,请使用两个正斜杠注释掉 sed 的行,如下所示
//#define BB_SED注释掉一些较大的实用程序会大大减小最终 busybox 二进制文件的大小。例如,删除五个复杂的程序(init、tar、sfdisk、gzip 和 gunzip)会将 busybox 二进制文件的大小从 260KB 减小到 155KB。
busybox.def.h 文件的第二部分(在一些解释性注释之后)包含 #define 语句,用于激活或禁用 BusyBox 的各种功能。其中一些功能旨在节省内存,例如消除 /proc 文件系统的使用、减少提供的在线帮助量以及消除正则表达式的使用。其他 #define 特定于单个命令的功能。例如,您可以消除使用 BusyBox 的 tar 功能创建新 tar 文件的能力。除非您真的需要进一步减少 BusyBox 的大小,否则您不需要更改 busybox.def.h 文件第二部分中的 #define 选项。
Linux 的嵌入式版本(如 Lineo 的 Embedix)可能是 BusyBox 最明显的用途,但您可能会想到许多其他用途。例如,如果您需要创建一个 initrd 文件来启动具有不寻常硬件的系统,您可以使用 BusyBox 功能来添加基本系统实用程序,并使用一个易于管理的二进制文件。或者,您可以使用 BusyBox 作为启动软盘或单盘 Linux 版本的一部分,如 Linux Router Project 和 Debian 启动软盘。
