:2006-11-27 作者:acsbor 来自:cublog
1,busybox简介
busybox是一个集成了一百多个最常用linux命令和工具的软件,他甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小.我们平时用的那些linux命令就好比是分立式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍,在嵌入式linux应用中,busybox有非常广的应用,另外,大多数linux发行版的安装程序中都有
busybox的身影,安装linux的时候案ctrl+alt+F2就能得到一个控制台,而这个控制台中的所有命令都是指向busybox的链接.
Busybox的小身材大作用的特性,给制作一张软盘的linux带来了及大方便. 2,busybox的用法 可以这样用busybox #busybox ls
他的功能就相当运行ls命令
最常用的用法是建立指向busybox的链接,不同的链接名完成不同的功能. #ln -s busybox ls #ln -s busybox rm #ln -s busybox mkdir 然后分别运行这三个链接: #./ls #./rm #./mkdir
就可以分别完成了ls rm 和mkdir命令的功能.虽然他们都指向同一个可执行程序busybox
但是只要链接名不同,完成的功能就不同,busybox就是这么的神奇.
很多linux网站都提供busybox的源代码下载.目前版本是busybox1.0正式版. 3,配置busybox
busybox的配置程序和linux内核菜单配置方式简直一模一样.熟悉用make menuconfig方式配置linux内核的朋友很容易上手. #cp busybox-1.00.tar.gz /babylinux #cd /babylinux
#tar xvfz busybox-1.00.tar.gz #cd busybox-1.00 #make menuconfig
下面是需要编译进busybox的功能选项,其他的可以根据需要自选,但是同样不要太贪心.
General Configuration应该选的选项 Show verbose applet usage messages
Runtime SUID/SGID configuration via /etc/busybox.conf Build Options
Build BusyBox as a static binary (no shared libs)
这个选项是一定要选择的,这样才能把busybox编译成静态链接的可执行文件,运行时才于其他函数库.否则必需要其他库文件才能运行,在单一个linux内核不能使他正常工作.
Installation Options Don't use /usr
这个选项也一定要选,否则make install 后busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令.选择这个选项后,make install后会在busybox目录下生成一个叫_install的目录,里面有busybox和指向他的链接.
其他选项都是一些linux基本命令选项,自己需要哪些命令就编译进去,一般用默认的就可以了.
配置好后退出并保存.
4,编译并安装busybox #make #make install
编译好后在busybox目录下生成子目录_install,里面的内容: drwxr-xr-x 2 root root 4096 11月 24 15:28 bin
lrwxrwxrwx 1 root root 11 11月 24 15:28 linuxrc -> bin/busybox drwxr-xr-x 2 root root 4096 11月 24 15:28 sbin
其中可执行文件busybox在bin目录下,其他的都是指向他的符号链接.
我编译出来的busybox可执行文件是935K,加上符号链接,整个_install目录是952K.加上845K的内核不是已经超过1440K了吗?别担心,我们将对整个根文件系统做大幅度的压缩.
busybox 制作tiny linux
日期:2006-11-27 作者:xoxo 来自:cublog
我省去了制作启动盘的过程,这个网上可以大把大把的抓! 更多...
我通过在硬盘上安装linux得到linux的分区: /dev/hda1 /boot /dev/hda2 / /dev/hda3 swap
好了,现在开始用busybox来制作了。。。 实际操作过程相当简单:
下载好busybox的源文件,大家最好到busybox的官方网站上面去下,这样还可以看到很多文档 :)
我下载的是busybox-1.00-rc3版本,也是它的最新版 tar zxvf busybox-1.00-rc3.tar.gz cd busybox-1.00-rc3 make menuconfig
(这个过程类似编译linux内核,如果你还不会编译内核的话,那先看看我的blog里面的另一篇文档好了) 做好自己的选项后, make dep make make install
默认情况下,busybox会在当前目录下生成一个_INSTALL的目录,编译后生成的文件都在这个目录下,一会儿我们也要用这个目录下的文件来制作我们的tiny linux 我们先看一看这个目录下的结构: /usr /etc /....
因为我是在编译好后才写这篇文档的,所以目录列不全了,反正这个也不重要,大家在尝试中自己观察吧
然后就是替换工作了,关于busybox的工作原理大家可以参考busybox的资料,网上一大把一大把的抓!!
主要的操作目录有 etc usr bin sbin
将这几个目录用刚才编译过的目录替换,然后将原etc目录下的 passwd passwd- shadow shadow- 几个文件放到busybox的目录下(你得登陆吧,哈哈,登陆就得用这几个文件了)
其实这个时候系统的大小就已经不到200M了,
下面是进一步的裁减工作,这个工作主要集中在lib目录下
lib目录的结构:
根目录下是一些常用的so库 modules 是linux的模块
modules 目录里面还有 EL 结尾的文件夹目录,如果你是多cpu的话,有一个smp结尾的目录,如果你已经编译了内核的话,还有一个ELcustom结尾的目录
决定你用那个内核,如你用smp的话,那就删掉其他的两个,如果你用自己编译的内核的话,那就删掉另外的两个,同样的道理
其他在lib目录下的so文件大家自己决定吧,不过有这样一个问题,如果你裁减完登陆时出现“Login incorrect:User 'unknown' failed on 'tty2'”提示的话,很可能就是你这里面的库删错了,补回来吧。。
裁减过程,除了删除文件外,我觉得还有一个问题,就是完善功能,实现linux的常用功能:如网络,文件系统的rw属性等 这个也是我在裁减过程中遇到的问题, 1,恢复网络功能
网络功能需要这样几个必要的条件: 1)内核支持inet4 2)有网卡驱动
好了,假设上面的都成立,我们开始给这个tinylinux设定网络: 我的网卡是8139的所以,我需要的网卡驱动在
/lib/modules/2.4.21-9.ELcustom/kernel/drivers/net/8139too.so
当然,pci的网卡还需要这个东东:
/lib/modules/2.4.21-9.ELcustom/kernel/drivers/net/mii.o (为什么要这个我也说不清楚,反正要一定要有,freebsd在编译内核的时候,也是一定要加上mii这个东西的,编译过bsd内核的朋友一定有印象)
ok,还有一个so是要加上的,那就是
/lib/modules/2.4.21-9.ELcustom/kernel/lib/crc32.o,这个东东,是什么作用,高手来解答吧,我也不清楚,或者大家去google搜索一下好了 总结一下加入网络的步骤:
/sbin/insmod /lib/modules/2.4.21-9.ELcustom/kernel/lib/crc32.o
/sbin/insmod /lib/modules/2.4.21-9.ELcustom/kernel/drivers/net/mii.o /sbin/insmod
/lib/modules/2.4.21-9.ELcustom/kernel/drivers/net/8139too.so 看到什么了吗?
你的网卡已经起来了。。。不过这样还不可以
在/etc/modules.conf文件中要增加这样的一句:alias eth0 8139too (为啥呢?我也不懂,向大家请教,)
现在应该可以了,控制台里面输入:ifconfig eth0 inet 192.168.0.2 netmask 255.255.255.0
结果呢?应该就是大家期望的了。。 还可以添加路由的:
/sbin/route add default gw 192.168.0.1 不管别的了,先ping一下网关再说: #ping 192.168.0.1 .........................
登陆到192。168。0。1上面去: 192。168。0。1#ping 192.168.0.2 。。。。。。。。。。。。。
网络功能基本上没有问题了,我试过ping 202.102.88.*这个ip的。 2。文件系统的读写功能。
busybox的启动过程跟linux是不一样的,它在内核启动后,运行/etc/init.d/rcS这个脚本的,而且只有这一个启动脚本,所以,如果有什么在启动时候运行或初始化的程序,只能写在这个脚本里了。
在我的观察来看,linux启动过程中,与文件系统(我指的是mount或umount这样的操作)相关的操作是有这样的步骤的:第一个步骤是内核以ro (read-only,只读)的形式来mount / ,这个在grub。conf(grub的配置文件,在/boot/grub/目录下)有这样的描述:”kernel /boot/powerbit.vmlinux ro root=/dev/hdb1“ ,看到那个“ro”了吗?
第二个步骤是系统在fsck(磁盘扫描,检查文件系统上一次关机时是否正常umount),然后进行“umount -a”
第三个步骤是这样的,在检查完文件系统没有问题后,运行\"mount -t ext3 remount rw /\" 这样的语句,注意到“rw”了吗?就是这个标志,决定我们的tiny linux的文件系统是否能够写入的,或许你这样考虑,我直接在grub.conf里面把“ro”改成“rw”不可以吗?自己试试就知道了:) 3。login
关于login我不想多说了,关键在于/lib里面的库文件,不可多删,当然,为了系统尽可能的小,也一定不要少删啊。。
多用户登陆的话,需要更改/etc/inittab,详细的参考busybox的文档吧 最后总结一下rcS这个文件吧: rcS:
/bin/fsck ????(参数自己找找吧,不懂的话看看rc.sysinit) /sbin/umount -a /sbin/mount -a
/sbin/mount -t ext3 remount rw /
/sbin/insmod /lib/modules/2.4.21-9.ELcustom/kernel/lib/crc32.o /sbin/insmod /lib/modules/2.4.21-9.ELcustom/kernel/drivers/net/mii.o /sbin/insmod
/lib/modules/2.4.21-9.ELcustom/kernel/drivers/net/8139too.so /sbin/ifconfig eth0 192.168.0.253 netmask 255.255.255.0 /sbin/route default gw 192.168.0.1 参考资料:
www.linuxjournal.com/article.php?sid=4335 www.linuxjournal.com/article.php?sid=4395 www.linuxjournal.com/article.php?sid=4528
QUOTE:
1. Code maturity level options
代码成熟等级。此处只有一项:prompt for development and/or incomplete code/drivers,如果你要试验现在仍处于实验阶段的功能,比如khttpd、IPv6等,就必须把该项选择为Y了;否则可以把它选择为N。 2. Loadable module support 对模块的支持。这里面有三项:
Enable loadable module support:除非你准备把所有需要的内容都编译到内核里面,否则该项应该是必选的。
Set version information on all module symbols:可以不选它。
Kernel module loader:让内核在启动时有自己装入必需模块的能力,建议选上。 3. Processor type and features
CPU类型。内容蛮多的,不一一介绍了,有关的几个如下: Processor family:根据你自己的情况选择CPU类型。
High Memory Support:大容量内存的支持。可以支持到4G、G,一般可以不选。 Math emulation:协处理器仿真。协处理器是在386时代的宠儿,现在早已不用了。 MTTR support:MTTR支持。可不选。
Symmetric multi-processing support:对称多处理支持。除非你富到有多个CPU,否则就不用选了。 4. General setup
这里是对最普通的一些属性进行设置。这部分内容非常多,一般使用缺省设置就可以了。下面介绍一下经常使用的一些选项:
Networking support:网络支持。必须,没有网卡也建议你选上。 PCI support:PCI支持。如果使用了PCI的卡,当然必选。
PCI access mode:PCI存取模式。可供选择的有BIOS、Direct和Any,选Any吧。
Support for hot-pluggabel devices:热插拔设备支持。支持的不是太好,可不选。 PCMCIA/CardBus support:PCMCIA/CardBus支持。有PCMCIA就必选了。 System V IPC
BSD Process Accounting
Sysctl support:以上三项是有关进程处理/IPC调用的,主要就是System V和BSD两种风格。如果你不是使用BSD,就按照缺省吧。 Power Management support:电源管理支持。
Advanced Power Management BIOS support:高级电源管理BIOD支持。 5. Memory Technology Device(MTD) MTD设备支持。可不选。 6. Parallel port support
串口支持。如果不打算使用串口,就别选了。 7. Plug and Play configuration
即插即用支持。虽然Linux对即插即用目前支持的不如Windows好,但是还是选上吧,这样你可以拔下鼠标之类的体验一下Linux下即插即用的感觉。 8. Block devices
块设备支持。这个就得针对自己的情况来选了,简单说明一下吧: Normal PC floppy disk support:普通PC软盘支持。这个应该必选。 XT hard disk support: Compaq SMART2 support:
Mulex DAC960/DAC1100 PCI RAID Controller support:RAID镜像用的。 Loopback device support:
Network block device support:网络块设备支持。如果想访问网上邻居的东西,就选上。
Logical volume manager(LVM)support:逻辑卷管理支持。
Multiple devices driver support:多设备驱动支持。 RAM disk support:RAM盘支持。 9. Networking options
网络选项。这里配置的是网络协议。内容太多了,不一一介绍了,自己看吧,如果你对网络协议有所了解的话,应该可以看懂的。如果懒得看,使用缺省选项(肯定要选中TCP/IP networking哦)就可以了。让我们看看,TCP/IP、ATM、IPX、DECnet、Appletalk……支持的协议好多哦,IPv6也支持了,Qos and/or fair queueing(服务质量公平调度)也支持了,还有kHTTPd,不过这些都还在实验阶段。 10. Telephony Support
电话支持。这个是什么东东?让我查查帮助,原来是Linux下可以支持电话卡,这样你就可以在IP上使用普通的电话提供语音服务了。记住,电话卡可和modem没有任何关系哦。
11. ATA/IDE/MFM/RLL support
这个是有关各种接口的硬盘/光驱/磁带/软盘支持的,内容太多了,使用缺省的选项吧,如果你使用了比较特殊的设备,比如PCMCIA等,就到里面自己找相应的选项吧。 12. SCSI support
SCSI设备的支持。我没有SCSI的设备,所以根本就不用选,如果你用了SCSI的硬盘/光驱/磁带等设备,自己找好了。 13. IEEE 1394(FireWire)support
这个是什么?低版本的没有见过,看看帮助再说。原来是要Fireware硬件来提高串行总线的性能,我没有,不选了。 14. I2O device support
这个也不清楚,帮助里说是这个需要I2O接口适配器才能支持的,在智能Input/Output(I2O)体系接口中使用,又是要硬件,不选了。 15. Network device support
网络设备支持。上面选好协议了,现在该选设备了,可想而知,内容肯定多得很。还好还好,里面大概分类了,有ARCnet设备、Ethernet(10 or 100 Mbit)、
Ethernet(1000Mbit)、Wireless LAN(non-hamradio)、Token Ring device、Wan interfaces、PCMCIA network device support几大类。我用的是10/100M的以太网,看来只需要选则这个了。还是10/100M的以太网设备熟悉,内容虽然多,一眼就可以看到我所用的RealTeck RTL-8139 PCI Fast Ethernet Adapter support,为了免得麻烦,
编译到内核里面好了,不选M了,选Y。耐心点,一般说来你都能找到自己用的网卡。如果没有,你只好自己到厂商那里去要驱动了。 16. Amateur Radio support
又一个不懂的,应该是配置业余无线广播的吧,没有,不要了。 17. IrDA(infrared)support 这个要红外支持,免了。 18. ISDN subsystem
如果你使用ISDN上网,这个就必不可少了。自己看着办好了。 19. Old CD-ROM drivers(not SCSI、not IDE)
做的可真周到,原来那些非SCSI/IDE口的光驱谁还在用啊,自己选吧,反正我是用的IDE的CD-ROM,不选这个。 20. Character devices
字符设备。这个内容又太多了,先使用缺省设置,需要的话自己就修改。把大类介绍一下吧:
I2C support:I2C是Philips极力推动的微控制应用中使用的低速串行总线协议。如果你要选择下面的Video For Linux,该项必选。
Mice:鼠标。现在可以支持总线、串口、PS/2、C&T 82C710 mouse port、PC110 digitizer pad,自己根据需要选择。
Joysticks:手柄。即使在Linux下把手柄驱动起来意义也不是太大,游戏太少了。 Watchdog Cards:虽然称为Cards,这个可以用纯软件来实现,当然也有硬件的。如果你把这个选中,那么就会在你的/dev下创建一个名为watchdog的文件,它可以记录你的系统的运行情况,一直到系统重新启动的1分钟左右。有了这个文件,你就可以恢复系统到重启前的状态了。
Video For Linux:支持有关的音频/视频卡。 Ftape, the floppy tape device driver: PCMCIA character device support: 21. File systems
文件系统。内容又太多了,老法子,在缺省选项的基础上进行修改。介绍以下几项: Quota support:Quota可以每个用户可以使用的硬盘空间的上限,在多用户共同使用一台主机的情况中十分有效。
DOS FAT fs support:DOS FAT文件格式的支持,可以支持FAT16、FAT32。 ISO 9660 CD-ROM file system support:光盘使用的就是ISO 9660的文件格式。 NTFS file system support:ntfs是NT使用的文件格式。
/proc file system support:/proc文件系统是Linux提供给用户和系统进行交互的通道,建议选上,否则有些功能没法正确执行。
还有另外三个大类都规到这儿了:Network File Systems(网络文件系统)、Partition Types(分区类型)、Native Language Support(本地语言支持)。值得一提的是Network File Systems里面的两种:NFS和SMB分别是Linux和Windows相互以网络邻居的形式访问对方所使用的文件系统,根据需要加以选择。 22. Console drivers
控制台驱动。一般使用VGA text console就可以了,标准的80*25的文本控制台。 23. Sound
声卡驱动。如果你能在列表中找到声卡驱动那自然最好,否则就试试OSS了。 24. USB supprot
USB支持。很多USB设备,比如鼠标、调制解调器、打印机、扫描仪等,在Linux都可以得到支持,根据需要自行选择。 25. Kernel hacking
配置了这个,即使在系统崩溃时,你也可以进行一定的工作了。普通用户是用不着这个功能的。
对了,你还是把“我省去了制作启动盘的过程,这个网上可以大把大把的抓!”也加上的好,这样更有利于其他人的学习
制作启动盘的过成实际上是在一个空空的硬盘或软盘上加上启动信息的过程,针对
linux或unix来讲,也就是增加lilo启动信息的过程,从而使得我们转移到本硬盘的内核能够启动,进一步能够执行linux其他的一些必要的系统初始程序...
启动盘的制作过程可以搜索关键字:\"制作软盘linux\" 或\"tiny linux\"
或这个url:
(http://www.google.com/search?hl=zh-CN&q=%E5%88%B6%E4%BD%9C%E8%BD%AF%E7%9B%98%E5%90%AF%E5%8A%A8%E7%9A%84linux&lr= )
如果你裁减的linux是在硬盘上的话,可以这样: 1,准备两块硬盘A B,分别安装好linux.
2,讲其中A上linux重新编译内核,尽量做到最小且满足您的需要,并设置好lilo或grub,保证编译好的内核能够启动起来.
3,在机器上挂载硬盘B且是B成为主硬盘,保证启动时候启动B上的linux系统,再将A挂在机器上,保证A是B的从盘. 4,启动linux,进入B硬盘上的系统
5,在B硬盘上编译好busybox.(如1楼贴中所述)
6,删除硬盘A中的/bin /sbin 和/lib目录中的一些其他的少用的库文件(这个需要大家自己尝试,我没有做具体的记录)用硬盘B上编译好的busybox中的/usr /bin /sbin /etc拷贝到A盘的相应分区上面..
7,去掉B盘,使A盘做主盘(保证A是主盘的同时,还要保证类似grub中\"/dev/da0 /dev/da1\"这样的参数正确,如果启动时后找不到内核,问题一般出在这里,一个比较稳妥的方法是两块硬盘完全相同,且保证A B分别做主盘时硬盘跳线都一样,接到主板的数据线都一样)..
8,如果此时A盘不能启动,请大家联系我....
9,如果A盘能够启动,从新用B做主盘,A做从盘,参照主贴中的描述完善A盘中的文件,主要是不需要的函数库的清理和网络功能,及文件系统功能的完善...
10,完善好以后,可以将A盘做成ghost,然后直接ghost到软盘/CF盘/其他硬盘上... 11,登陆功能的完善,这个很讨厌(个人觉得),大家删除/lib下面的库的时候一定要小心,如一下加密的库,如pam的库,libc的库等...(有兴趣可以查看linux登陆过程的相关介绍,我看过,但是早就忘了)
注:在我确定这个思路以后,裁减时间一共用了1天的时间(此前用其他方案做了一个星期没有完成),大约50次拆/装硬盘...希望大家在制作的过程中不要怕麻烦.. 原文链接:http://www.cublog.cn/u/11176/showart_137695.html
BusyBox 简化嵌入式 Linux 系统
:2006-09-13 作者:M. Tim Jones 来自:IBM DW中国
BusyBox 是很多标准 Linux® 工具的一个单个可执行实现。BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大、更复杂的工具,例如 grep、find、mount 以及 telnet(不过它的选项比传统的版本要少);有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。本文将探索 BusyBox 的目标,它是如何工作的,以及为什么它对于内存有限的环境来说是如此重要。 BusyBox 的诞生
BusyBox 最初是由 Bruce Perens 在 1996 年为 Debian GNU/Linux 安装盘编写的。其目标是在一张软盘上创建一个可引导的 GNU/Linux 系统,这可以用作安装盘和急救盘。一张软盘可以保存大约 1.4-1.7MB 的内容,因此这里没有多少空间留给 Linux 内核以及相关的用户应用程序使用。
BusyBox 揭露了这样一个事实:很多标准 Linux 工具都可以共享很多共同的元素。例如,很多基于文件的工具(比如 grep 和 find)都需要在目录中搜索文件的代码。当这些工具被合并到一个可执行程序中时,它们就可以共享这些相同的元素,这样可以产生更小的可执行程序。实际上, BusyBox 可以将大约 3.5MB 的工具包装成大约 200KB 大小。这就为可引导的磁盘和使用 Linux 的嵌入式设备提供了更多功能。我们可以对 2.4 和 2.6 版本的 Linux 内核使用 BusyBox。 BusyBox 是如何工作的?
为了让一个可执行程序看起来就像是很多可执行程序一样,BusyBox 为传递给 C 的 main 函数的参数开发了一个很少使用的特性。回想一下 C 语言的 main 函数的定义如下:
BusyBox 许可证 BusyBox 是按照 GNU General Public License(GPL)许可证发行的。这意味着如果我们在一个项目中使用 BusyBox,就必须遵守这个许可 证。我们可以在 BusyBox Web 站点(请参看本文后面 参考资料 一节的内容)上看到这个许可证的内容。BusyBox 团队似乎正忙于监视违反这个许可证的情况。实际上,他们维护了一个 “Hall of Shame” 页面来说明违反者的情况。 POSIX 环境 尽管 BusyBox 的目标 是提供清单 1. C 的 main 函数 一个相当完整的 POSIX(可移 植操作系统接口)环境,这是一int main( int argc, char *argv[] ) 个期望,而不是一种需求。这些 工具虽然并不完整,但是它们提在这个定义中,argc 是传递进来的参数的个数(参数供了我们期望的主要功能。 数量),而 argv 是一个字符串数组,代表从命令行
传递进来的参数(参数向量)。argv 的索引 0 是从命令行调用的程序名。
清单 2 给出的这个简单 C 程序展示了 BusyBox 的调用。它只简单地打印 argv 向量的内容。
清单 2. BusyBox 使用 argv[0] 来确定调用哪个应用程序 // test.c #include 清单 3. 在使用新命令更新 BusyBox 之后的命令测试 $ gcc -Wall -o test test.c $ ./test arg1 arg2 argv[0] = ./test argv[1] = arg1 argv[2] = arg2 $ mv test newtest $ ./newtest arg1 argv[0] = ./newtest argv[1] = arg1 $ ln -s newtest linktest $ ./linktest arg argv[0] = ./linktest argv[1] = arg BusyBox 使用了符号链接以便使一个可执行程序看起来像很多程序一样。对于 BusyBox 中包含的每个工具来说,都会这样创建一个符号链接,这样就可以使用这些符号链接来调用 BusyBox 了。BusyBox 然后可以通过 argv[0] 来调用内部工具。 配置并编译 BusyBox 我们可以从 BusyBox 的 Web 站点上下载最新版本的 BusyBox(请参看 参考资料 一节的内容)。与大部分开放源码程序一样,它是以一个压缩的 tarball 形式发布的,我们可以使用清单 4 给出的命令将其转换成源代码树。(如果我们下载的版本不是 1.1.1,那就请在这个命令中使用适当的版本号以及特定于这个版本号的命令。) 清单 4. 展开 BusyBox $ tar xvfz busybox-1.1.1.tar.gz $ 结果会生成一个目录,名为 busybox-1.1.1,其中包含了 BusyBox 的源代码。要编译默认的配置(其中包含了几乎所有的内容,并禁用了调试功能),请使用 defconfig make 目标: BusyBox 源代码树 BusyBox 的源代码树组织得很好。这些工具都基于它们的用途$ cd busybox-1.1.1 进行了分类,并存储在单独的子$ make defconfig 目录中。例如,网络工具和守护$ make 进程(如 httpd、ifconfig 等)$ 都在 ./networking 目录中;标 准的模块工具(包括 insmod、rmmod 和 lsmod)都 在 ./modutils 目录中;编辑器(例如 vi 和流编辑器,如 awk 结果是一个相当大的 BusyBox 映像,不过这只是开 和 sed)都在 ./editors 目录始使用它的最简单的方法。我们可以直接调用这个新 中。makefile 配置、编译和安映像,这会产生一个简单的 Help 页面,里面包括当 装所使用的各个文档都在这个目前配置的命令。要对这个映像进行测试,我们也可以 对一个命令调用 BusyBox 来执行,如清单 6 所示。 录树的根目录中。 清单 5. 编译默认的 BusyBox 配置 清单 6. 展示 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 配置的不同类型的应用程序(applet)。 图 1. 使用 menuconfig 配置 BusyBox 要手工配置 BusyBox,请使用下面的命令: 清单 7. 手工配置 BusyBox $ make menuconfig $ make $ 多体系结构支持 可以简单地为 BusyBox 指定交叉编译器意味着我们可以为很多体系结构编译 BusyBox。要 为您的目标体系结构编译 BusyBox,我们需要一个交叉编译器和一个已经为特定目标体系结构编译好的 C 库(uClibc 或 glibc)。 这为我们提供了可以调用的 BusyBox 的二进制文件。下一个步骤是围绕 BusyBox 构建一个环境,包括将标准 Linux 命令重定向到 BusyBox 二进制文件的符号链接。我们可以使用下面的命令简单地完成这个过程: 清单 8. 构建 BusyBox 环境 $ make install $ 默认情况下,这会创建一个新的本地子目录 _install,其中包含了基本的 Linux 环境。在这个根目录中,您会找到一个链接到 BusyBox 的 linuxrc 程序。这个 linuxrc 程序在构建安装盘或急救盘(允许提前进行模块化的引导)时非常有用。同样是在这个根目录中,还有一个包含操作系统二进制文件的 /sbin 子目录。还有一个包含用户二进制文件的 /bin 目录。在构建软盘发行版或嵌入式初始 RAM 磁盘时,我们可以将这个 _install 目录迁移到目标环境中。我们还可以使用 make 程序的 PREFIX 选项将安装目录重定向到其他位置。例如,下面的代码就使用 /tmp/newtarget 根目录来安装这些符号链接,而不是使用 ./_install 目录: 清单 9. 将符号链接安装到另外一个目录中 $ make PREFIX=/tmp/newtarget install $ 使用 install make 目标创建的符号链接都来自于 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 defconfig allnoconfig allyesconfig allbareconfig config menuconfig all busybox clean distclean sizes 说明 显示 make 选项的完整列表 启用默认的(通用)配置 禁用所有的应用程序(空配置) 启用所有的应用程序(完整配置) 启用所有的应用程序,但是不包括子特性 基于文本的配置工具 N-curses(基于菜单的)配置工具 编译 BusyBox 二进制文件和文档(./docs) 编译 BusyBox 二进制文件 清除源代码树 彻底清除源代码树 显示所启用的应用程序的文本/数据大小 在定义配置时,我们只需要输入 make 就可以真正编译 BusyBox 二进制文件。例如,要为所有的应用程序编译 BusyBox,我们可以执行下面的命令: 清单 11. 编译 BusyBox 二进制程序 $ make allyesconfig $ make $ 压缩 BusyBox 如果您非常关心对 BusyBox 映像的压缩,就需要记住两件事情: 1. 永远不要编译为静态二进制文件(这会将所有需要的库都包含到映像文件中)。相 反,如果我们是编译为一个共享映像,那么它会使用其他应用程序使用的库(例如 /lib/libc.so.X)。 2. 使用 uClibc 进行编译,这是一个对大小进行过优化的 C 库,它是为嵌入式系统 开发的;而不要使用标准的 glibc (GNU C 库)来编译。 BusyBox 命令中支持的选项 BusyBox 中的命令并不支持所有可用选项,不过这些命令都包含了常用的选项。如果我们需要知道一个命令可以支持哪些选项,可以使用 --help 选项来调用这个命令,如清单 12 所示。 清单 12. 使用 --help 选项调用命令 $ ./busybox wc --help BusyBox v1.1.1 (2006.04.09-15:27+0000) multi-call binary Usage: wc [OPTION]... [FILE]... Print line, word, and byte counts for each FILE, and a total line if more than one FILE is specified. With no FILE, read standard input. Options: -c print the byte counts -l print the newline counts -L print the length of the longest line -w print the word counts $ 这些特定的数据只有在启用了 CONFIG_FEATURE_VERBOSE_USAGE 选项时才可以使用。如果没有这个选项,我们就无法获得这些详细数据,但是这样可以节省大约 13 KB 的空间。 向 BusyBox 中添加新命令 向 BusyBox 添加一个新命令非常简单,这是因为它具有良好定义的体系结构。第一个步骤是为新命令的源代码选择一个位置。我们要根据命令的类型(网络,shell 等)来选择位置,并与其他命令保持一致。这一点非常重要,因为这个新命令最终会在 menuconfig 的配置菜单中出现(在下面的例子中,是 Miscellaneous Utilities 菜单)。 对于这个例子来说,我将这个新命令称为 newcmd,并将它放到了 ./miscutils 目录中。这个新命令的源代码如清单 13 所示。 清单 13. 集成到 BusyBox 中的新命令的源代码 #include \"busybox.h\" int newcmd_main( int argc, char *argv[] ) { int i; printf(\"newcmd called:\\n\"); for (i = 0 ; i < argc ; i++) { printf(\"arg[%d] = %s\\n\ } return 0; } 接下来,我们要将这个新命令的源代码添加到所选子目录中的 Makefile.in 中。在本例中,我更新了 ./miscutils/Makefile.in 文件。请按照字母顺序来添加新命令,以便维持与现有命令的一致性: 清单 14. 将命令添加到 Makefile.in 中 MISCUTILS-$(CONFIG_MT) += mt.o MISCUTILS-$(CONFIG_NEWCMD) += newcmd.o MISCUTILS-$(CONFIG_RUNLEVEL) += runlevel.o 接下来再次更新 ./miscutils 目录中的配置文件,以便让新命令在配置过程中是可见的。这个文件名为 Config.in,新命令是按照字母顺序添加的: 清单 15. 将命令添加到 Config.in 中 config CONFIG_NEWCMD bool \"newcmd\" default n help newcmd is a new test command. 这个结构定义了一个新配置项(通过 config 关键字)以及一个配置选项(CONFIG_NEWCMD)。新命令可以启用,也可以禁用,因此我们对配置的菜单属性使用了 bool (Boolean)值。这个命令默认是禁用的(n 表示 No),我们可以最后放上一个简短的 Help 描述。在源代码树的 ./scripts/config/Kconfig-language.txt 文件中,我们可以看到配置语法的完整文法。 接下来需要更新 ./include/applets.h 文件,使其包含这个新命令。将下面这行内容添加到这个文件中,记住要按照字母顺序。维护这个次序非常重要,否则我们的命令就会找不到。 清单 16. 将命令添加到 applets.h 中 USE_NEWCMD(APPLET(newcmd, newcmd_main, _BB_DIR_USER_BIN, _BB_SUID_NEVER)) 这定义了命令名(newcmd),它在 Busybox 源代码中的函数名(newcmd_main),应该在哪里会为这个新命令创建链接(在这种情况中,它在 /usr/bin 目录中),最后这个命令是否有权设置用户 id(在本例中是 no)。 倒数第二个步骤是向 ./include/usage.h 文件中添加详细的帮助信息。正如您可以从这个文件的例子中看到的一样,使用信息可能非常详细。在本例中,我只添加了一点信息,这样就可以编译这个新命令了: 清单 17. 向 usage.h 添加帮助信息 #define newcmd_trivial_usage \"None\" #define newcmd_full_usage \"None\" 最后一个步骤是启用新命令(通过 make menuconfig,然后在 Miscellaneous Utilities 菜单中启用这个选项)然后使用 make 来编译 BusyBox。 使用新的 BusyBox,我们可以对这个新命令进行测试,如清单 18 所示。 清单 18. 测试新命令 $ ./busybox newcmd arg1 newcmd called: arg[0] = newcmd arg[1] = arg1 $ ./busybox newcmd --help BusyBox v1.1.1 (2006.04.12-13:47+0000) multi-call binary Usage: newcmd None None 就是这样!BusyBox 开发人员开发了一个优秀但非常容易扩展的工具。 结束语 BusyBox 是为构建内存有限的嵌入式系统和基于软盘系统的一个优秀工具。BusyBox 通过将很多必需的工具放入一个可执行程序,并让它们可以共享代码中相同的部分,从而对它们的大小进行了很大程度的缩减,BusyBox 对于嵌入式系统来说是一个非常有用的工具,因此值得我们花一些时间进行探索。 原文链接: http://www-128.ibm.com/developerworks/cn/linux/l-busybox/index.html 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务