Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101935822
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-04 22:47:26

 

busybox是一个集成了一百多个最常用linux命令和工具的软件,他甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小。在Linux 工具都可以共享很多共同的元素。例如,很多基于文件的工具(比如 grep 和 find)都有在目录中搜索文件的代码。当这些工具被合并到一个可执行程序中时,它们就可以共享这些相同的代码,同时BusyBox还简化非必要的复杂功能,这样可以产生更小的可执行程序,减少占用的空间。其次 BusyBox的完全可定制性,提供了非常灵活,宜于扩展的结构。所以Busybox常用于嵌入式开发以及可引导的磁盘中。 BusyBox 最初是由 Bruce Perens 在 1996 年为 Debian GNU/Linux 安装盘编写的。其目标是在一张软盘上创建一个可引导的 GNU/Linux 系统,这可以用作安装盘和急救盘。一张软盘可以保存大约 1.4-1.7MB 的内容,因此这里没有多少空间留给 Linux 内核以及相关的用户应用程序使用。通过可以下载到BusyBox的源程序。

为了让一个可执行程序看起来就像是很多可执行程序一样,BusyBox 为传递给 C 的 main 函数的参数开发了一个很少使用的特性。BusyBox C 语言的 main 函数的定义如下:

int main( int argc, char *argv[] )

在这个定义中,argc 是传递进来的参数的个数(参数数量),而 argv 是一个字符串数组,代表从命令行传递进来的参数(参数向量)。argv 的索引 0 是从命令行调用的程序名,这些程序名就是常用的ls、echo等等。调用这个程序会显示所调用的第一个参数是该程序的名字。例如:

# ./busybox ls /root
anaconda-ks.cfg      Desktop         Downloads              install.log            sm56

另外,可以创建一个到可执行程序的符号链接,在执行这个符号链接时,就可以看到这个符号链接的名字。使用了符号链接以便使一个可执行程序看起来像很多程序一样。对于 BusyBox 中包含的每个工具来说,都会这样创建一个符号链接,这样就可以使用这些符号链接来调用 BusyBox 了。BusyBox 然后可以通过 argv[0] 来调用内部工具。例如:

# ln -s busybox ls
# ./ls /root
anaconda-ks.cfg      Desktop         Downloads              install.log            sm56

1、从BusyBox网站上下载最新的源码包并解压,如下: # tar zxvf busybox-1.6.1.tar.gz 解压后就能看到整个BusyBox的源码树,BusyBox 的源代码树组织得很好。这些工具都基于它们的用途进行了分类,并存储在单独的子目录中。例如,网络工具和守护进程(如 httpd、ifconfig 等)都在 ./networking 目录中;标准的模块工具(包括 insmod、rmmod 和 lsmod)都在 ./modutils 目录中;编辑器(例如 vi 和流编辑器,如 awk 和 sed)都在 ./editors 目录中。makefile 配置、编译和安装所使用的各个文档都在这个目录树的根目录中。

2、配置编译 Busybox提供了默认、完全等配置方案,当然也能以菜单的方式定制自己需要的配置方案。 Make提供如下几个配置及编译选项:

表1 make选项

例如:编辑默认的配置方案

# cd busybox-1.6.1
# make defconfig 
# make

若需要构建一个有特殊要求的配置方案,那么就可以采用菜单方式来配置。如果熟悉Linux 内核的编译过程,就会注意到make menuconfig 与配置 Linux 内核的内容所使用的目标相同。实际上,它们都采用了相同的基于 ncurses 的应用程序。在菜单方式里可以指定在最终的 BusyBox 映像中包含的命令。也可以对 BusyBox 环境进行配置,例如包括对 NSA(美国国家安全代理)的安全增强 Linux(SELinux),指定要使用的编译器(用来在嵌入式环境中进行交叉编译)以及 BusyBox 应该静态编译还是动态编译。在BusyBox下输入“make menuconfig”即可调出菜单配置的窗口,如下:

# make menuconfig

图1

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

# make CONFIG_PREFIX=/tmp/busybox install

注意:如果需要将busybox迁移到initrd(初始化RAM 磁盘)中或者构建U盘或者软盘版的系统时,一定要将BusyBox所依赖的库文件同时拷贝过去,否则BusyBox将不能正常运行,使用ldd命令即可查看BusyBox所依赖哪些库文件。如下:

# ldd ./busybox
        linux-gate.so.1 =>  (0xb7fcb000)
        libcrypt.so.1 => /lib/libcrypt.so.1 (0xb7f85000)
        libm.so.6 => /lib/libm.so.6 (0xb7f5d000)
        libc.so.6 => /lib/libc.so.6 (0xb7e06000)
        /lib/ld-linux.so.2 (0xb7fcc000)

在显示BusyBox所依赖的库文件中,很有可能某个库文件只是一个链接文件,那么一定要将链接文件的源文件一起拷贝过去,在这里所说的拷贝,最好先将这些文件tar成一包再复制过去解开在对应的目录下。

阅读(733) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~