busybox简介及使用
: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
#busyboxls
他的功能就相当运行ls命令
最常用的用法是建立指向busybox的链接,不同的链接名完成不同的功能.
#ln-sbusyboxls
#ln-sbusyboxrm
#ln-sbusyboxmkdir
然后分别运行这三个链接:
#./ls
#./rm
#./mkdir
就可以分别完成了lsrm和mkdir命令的功能.虽然他们都指向同一个可执行程序
busybox
但是只要链接名不同,完成的功能就不同,busybox就是这么的神奇.
很多linux网站都提供busybox的源代码下载.目前版本是busybox1.0正式版.
3,配置busybox
busybox的配置程序和linux内核菜单配置方式简直一模一样.熟悉用make
menuconfig方式配置linux内核的朋友很容易上手.
#/babylinux
#cd/babylinux
#
#cdbusybox-1.00
#makemenuconfig
下面是需要编译进busybox的功能选项,其他的可以根据需要自选,但是同样不要太贪
心.
GeneralConfiguration应该选的选项
Showverboappletusagemessages
RuntimeSUID/SGIDconfigurationvia/etc/
BuildOptions
BuildBusyBoxasastaticbinary(nosharedlibs)
这个选项是一定要选择的,这样才能把busybox编译成静态链接的可执行文件,运行时
才独立于其他函数库.否则必需要其他库文件才能运行,在单一个linux内核不能使他正常工
作.
InstallationOptions
Don'tu/usr
这个选项也一定要选,否则makeinstall后busybox将安装在原系统的/usr下,这将
覆盖掉系统原有的命令.选择这个选项后,makeinstall后会在busybox目录下生成一个叫
_install的目录,里面有busybox和指向他的链接.
其他选项都是一些linux基本命令选项,自己需要哪些命令就编译进去,一般用默认的就
可以了.
配置好后退出并保存.
4,编译并安装busybox
#make
#makeinstall
编译好后在busybox目录下生成子目录_install,里面的内容:
drwxr-xr-x2rootroot409611月2415:28bin
lrwxrwxrwx1rootroot1111月2415:28linuxrc->bin/busybox
drwxr-xr-x2rootroot409611月2415:28sbin
其中可执行文件busybox在bin目录下,其他的都是指向他的符号链接.
我编译出来的busybox可执行文件是935K,加上符号链接,整个_install目录是952K.
加上845K的内核不是已经超过1440K了吗?别担心,我们将对整个根文件系统做大幅度的
压缩.
busybox制作tinylinux
日期:2006-11-27作者:xoxo来自:cublog
我省去了制作启动盘的过程,这个网上可以大把大把的抓!
更多...
我通过在硬盘上安装linux得到linux的分区:
/dev/hda1/boot
/dev/hda2/
/dev/hda3swap
好了,现在开始用busybox来制作了。。。
实际操作过程相当简单:
下载好busybox的源文件,大家最好到busybox的官方网站上面去下,这样还可以
看到很多文档:)
我下载的是busybox-1.00-rc3版本,也是它的最新版
cdbusybox-1.00-rc3
makemenuconfig
(这个过程类似编译linux内核,如果你还不会编译内核的话,那先看看我的blog里面
的另一篇文档好了)
做好自己的选项后,
makedep
make
makeinstall
默认情况下,busybox会在当前目录下生成一个_INSTALL的目录,编译后生成的文
件都在这个目录下,一会儿我们也要用这个目录下的文件来制作我们的tinylinux
我们先看一看这个目录下的结构:
/usr
/etc
/....
因为我是在编译好后才写这篇文档的,所以目录列不全了,反正这个也不重要,大家在
尝试中自己观察吧
然后就是替换工作了,关于busybox的工作原理大家可以参考busybox的资料,网
上一大把一大把的抓!!
主要的操作目录有etcusrbinsbin
将这几个目录用刚才编译过的目录替换,然后将原etc目录下的passwdpasswd-
shadowshadow-几个文件放到busybox的目录下(你得登陆吧,哈哈,登陆就得用
这几个文件了)
其实这个时候系统的大小就已经不到200M了,
下面是进一步的裁减工作,这个工作主要集中在lib目录下
lib目录的结构:
根目录下是一些常用的so库
modules是linux的模块
modules目录里面还有EL结尾的文件夹目录,如果你是多cpu的话,有一个smp
结尾的目录,如果你已经编译了内核的话,还有一个ELcustom结尾的目录
决定你用那个内核,如你用smp的话,那就删掉其他的两个,如果你用自己编译的内
核的话,那就删掉另外的两个,同样的道理
其他在lib目录下的so文件大家自己决定吧,不过有这样一个问题,如果你裁减完登
陆时出现“Loginincorrect:Ur'unknown'failedon'tty2'”提示的话,很可能就是你
这里面的库删错了,补回来吧。。
裁减过程,除了删除文件外,我觉得还有一个问题,就是完善功能,实现linux的常用
功能:如网络,文件系统的rw属性等
这个也是我在裁减过程中遇到的问题,
1,恢复网络功能
网络功能需要这样几个必要的条件:
1)内核支持inet4
2)有网卡驱动
好了,假设上面的都成立,我们开始给这个tinylinux设定网络:
我的网卡是8139的所以,我需要的网卡驱动在
/lib/modules/om/kernel/drivers/net/
当然,pci的网卡还需要这个东东:
/lib/modules/om/kernel/drivers/net/mii.o(为什么要这个我也说不
清楚,反正要一定要有,freebsd在编译内核的时候,也是一定要加上mii这个东西的,编
译过bsd内核的朋友一定有印象)
ok,还有一个so是要加上的,那就是
/lib/modules/om/kernel/lib/crc32.o,这个东东,是什么作用,高手
来解答吧,我也不清楚,或者大家去google搜索一下好了
总结一下加入网络的步骤:
/sbin/insmod/lib/modules/om/kernel/lib/crc32.o
/sbin/insmod/lib/modules/om/kernel/drivers/net/mii.o
/sbin/insmod
/lib/modules/om/kernel/drivers/net/
看到什么了吗?
你的网卡已经起来了。。。不过这样还不可以
在/etc/文件中要增加这样的一句:aliath08139too(为啥呢?我
也不懂,向大家请教,)
现在应该可以了,控制台里面输入:ifconfigeth0inet192.168.0.2netmask
255.255.255.0
结果呢?应该就是大家期望的了。。
还可以添加路由的:
/sbin/routeadddefaultgw192.168.0.1
不管别的了,先ping一下网关再说:
#ping192.168.0.1
.........................
登陆到192。168。0。1上面去:
192。168。0。1#ping192.168.0.2
。。。。。。。。。。。。。
网络功能基本上没有问题了,我试过ping202.102.88.*这个外网ip的。
2。文件系统的读写功能。
busybox的启动过程跟linux是不一样的,它在内核启动后,运行/etc/init.d/rcS这
个脚本的,而且只有这一个启动脚本,所以,如果有什么在启动时候运行或初始化的程序,
只能写在这个脚本里了。
在我的观察来看,linux启动过程中,与文件系统(我指的是mount或umount这样
的操作)相关的操作是有这样的步骤的:第一个步骤是内核以ro(read-only,只读)的形式来
mount/,这个在grub。conf(grub的配置文件,在/boot/grub/目录下)有这样的描
述:”kernel/boot/xroroot=/dev/hdb1“,看到那个“ro”了吗?
第二个步骤是系统在fsck(磁盘扫描,检查文件系统上一次关机时是否正常umount),
然后进行“umount-a”
第三个步骤是这样的,在检查完文件系统没有问题后,运行"mount-text3remount
rw/"这样的语句,注意到“rw”了吗?就是这个标志,决定我们的tinylinux的文件系统
是否能够写入的,或许你这样考虑,我直接在里面把“ro”改成“rw”不可以吗?
自己试试就知道了:)
3。login
关于login我不想多说了,关键在于/lib里面的库文件,不可多删,当然,为了系统尽
可能的小,也一定不要少删啊。。
多用户登陆的话,需要更改/etc/inittab,详细的参考busybox的文档吧
最后总结一下rcS这个文件吧:
rcS:
/bin/fsck????(参数自己找找吧,不懂的话看看t)
/sbin/umount-a
/sbin/mount-a
/sbin/mount-text3remountrw/
/sbin/insmod/lib/modules/om/kernel/lib/crc32.o
/sbin/insmod/lib/modules/om/kernel/drivers/net/mii.o
/sbin/insmod
/lib/modules/om/kernel/drivers/net/
/sbin/ifconfigeth0192.168.0.253netmask255.255.255.0
/sbin/routedefaultgw192.168.0.1
参考资料:
/?sid=4335
/?sid=4395
/?sid=4528
QUOTE:
turityleveloptions
代码成熟等级。此处只有一项:promptfordevelopmentand/orincomplete
code/drivers,如果你要试验现在仍处于实验阶段的功能,比如khttpd、IPv6等,就必
须把该项选择为Y了;否则可以把它选择为N。
lemodulesupport
对模块的支持。这里面有三项:
Enableloadablemodulesupport:除非你准备把所有需要的内容都编译到内核里
面,否则该项应该是必选的。
Setversioninformationonallmodulesymbols:可以不选它。
Kernelmoduleloader:让内核在启动时有自己装入必需模块的能力,建议选上。
sortypeandfeatures
CPU类型。内容蛮多的,不一一介绍了,有关的几个如下:
Processorfamily:根据你自己的情况选择CPU类型。
HighMemorySupport:大容量内存的支持。可以支持到4G、64G,一般可以不选。
Mathemulation:协处理器仿真。协处理器是在386时代的宠儿,现在早已不用了。
MTTRsupport:MTTR支持。可不选。
Symmetricmulti-processingsupport:对称多处理支持。除非你富到有多个CPU,
否则就不用选了。
ltup
这里是对最普通的一些属性进行设置。这部分内容非常多,一般使用缺省设置就可以了。
下面介绍一下经常使用的一些选项:
Networkingsupport:网络支持。必须,没有网卡也建议你选上。
PCIsupport:PCI支持。如果使用了PCI的卡,当然必选。
PCIaccessmode:PCI存取模式。可供选择的有BIOS、Direct和Any,选Any
吧。
Supportforhot-pluggabeldevices:热插拔设备支持。支持的不是太好,可不选。
PCMCIA/CardBussupport:PCMCIA/CardBus支持。有PCMCIA就必选了。
SystemVIPC
BSDProcessAccounting
Sysctlsupport:以上三项是有关进程处理/IPC调用的,主要就是SystemV和BSD
两种风格。如果你不是使用BSD,就按照缺省吧。
PowerManagementsupport:电源管理支持。
AdvancedPowerManagementBIOSsupport:高级电源管理BIOD支持。
TechnologyDevice(MTD)
MTD设备支持。可不选。
elportsupport
串口支持。如果不打算使用串口,就别选了。
dPlayconfiguration
即插即用支持。虽然Linux对即插即用目前支持的不如Windows好,但是还是选上
吧,这样你可以拔下鼠标之类的体验一下Linux下即插即用的感觉。
evices
块设备支持。这个就得针对自己的情况来选了,简单说明一下吧:
NormalPCfloppydisksupport:普通PC软盘支持。这个应该必选。
XTharddisksupport:
CompaqSMART2support:
MulexDAC960/DAC1100PCIRAIDControllersupport:RAID镜像用的。
Loopbackdevicesupport:
Networkblockdevicesupport:网络块设备支持。如果想访问网上邻居的东西,就
选上。
Logicalvolumemanager(LVM)support:逻辑卷管理支持。
Multipledevicesdriversupport:多设备驱动支持。
RAMdisksupport:RAM盘支持。
kingoptions
网络选项。这里配置的是网络协议。内容太多了,不一一介绍了,自己看吧,如果你对
网络协议有所了解的话,应该可以看懂的。如果懒得看,使用缺省选项(肯定要选中TCP/IP
networking哦)就可以了。让我们看看,TCP/IP、ATM、IPX、DECnet、Appletalk……
支持的协议好多哦,IPv6也支持了,Qosand/orfairqueueing(服务质量公平调度)也支
持了,还有kHTTPd,不过这些都还在实验阶段。
onySupport
电话支持。这个是什么东东?让我查查帮助,原来是Linux下可以支持电话卡,这样
你就可以在IP上使用普通的电话提供语音服务了。记住,电话卡可和modem没有任何关
系哦。
/IDE/MFM/RLLsupport
这个是有关各种接口的硬盘/光驱/磁带/软盘支持的,内容太多了,使用缺省的选项吧,
如果你使用了比较特殊的设备,比如PCMCIA等,就到里面自己找相应的选项吧。
pport
SCSI设备的支持。我没有SCSI的设备,所以根本就不用选,如果你用了SCSI的硬
盘/光驱/磁带等设备,自己找好了。
1394(FireWire)support
这个是什么?低版本的没有见过,看看帮助再说。原来是要Fireware硬件来提高串行
总线的性能,我没有,不选了。
14.I2Odevicesupport
这个也不清楚,帮助里说是这个需要I2O接口适配器才能支持的,在智能
Input/Output(I2O)体系接口中使用,又是要硬件,不选了。
kdevicesupport
网络设备支持。上面选好协议了,现在该选设备了,可想而知,内容肯定多得很。还好
还好,里面大概分类了,有ARCnet设备、Ethernet(10or100Mbit)、
Ethernet(1000Mbit)、WirelessLAN(non-hamradio)、TokenRingdevice、Wan
interfaces、PCMCIAnetworkdevicesupport几大类。我用的是10/100M的以太网,
看来只需要选则这个了。还是10/100M的以太网设备熟悉,内容虽然多,一眼就可以看到
我所用的RealTeckRTL-8139PCIFastEthernetAdaptersupport,为了免得麻烦,
编译到内核里面好了,不选M了,选Y。耐心点,一般说来你都能找到自己用的网卡。如
果没有,你只好自己到厂商那里去要驱动了。
rRadiosupport
又一个不懂的,应该是配置业余无线广播的吧,没有,不要了。
(infrared)support
这个要红外支持,免了。
bsystem
如果你使用ISDN上网,这个就必不可少了。自己看着办好了。
-ROMdrivers(notSCSI、notIDE)
做的可真周到,原来那些非SCSI/IDE口的光驱谁还在用啊,自己选吧,反正我是用
的IDE的CD-ROM,不选这个。
terdevices
字符设备。这个内容又太多了,先使用缺省设置,需要的话自己就修改。把大类介绍一
下吧:
I2Csupport:I2C是Philips极力推动的微控制应用中使用的低速串行总线协议。如
果你要选择下面的VideoForLinux,该项必选。
Mice:鼠标。现在可以支持总线、串口、PS/2、C&T82C710mouport、PC110
digitizerpad,自己根据需要选择。
Joysticks:手柄。即使在Linux下把手柄驱动起来意义也不是太大,游戏太少了。
WatchdogCards:虽然称为Cards,这个可以用纯软件来实现,当然也有硬件的。
如果你把这个选中,那么就会在你的/dev下创建一个名为watchdog的文件,它可以记录
你的系统的运行情况,一直到系统重新启动的1分钟左右。有了这个文件,你就可以恢复
系统到重启前的状态了。
VideoForLinux:支持有关的音频/视频卡。
Ftape,thefloppytapedevicedriver:
PCMCIAcharacterdevicesupport:
stems
文件系统。内容又太多了,老法子,在缺省选项的基础上进行修改。介绍以下几项:
Quotasupport:Quota可以限制每个用户可以使用的硬盘空间的上限,在多用户共
同使用一台主机的情况中十分有效。
DOSFATfssupport:DOSFAT文件格式的支持,可以支持FAT16、FAT32。
ISO9660CD-ROMfilesystemsupport:光盘使用的就是ISO9660的文件格式。
NTFSfilesystemsupport:ntfs是NT使用的文件格式。
/procfilesystemsupport:/proc文件系统是Linux提供给用户和系统进行交互的
通道,建议选上,否则有些功能没法正确执行。
还有另外三个大类都规到这儿了:NetworkFileSystems(网络文件系统)、Partition
Types(分区类型)、NativeLanguageSupport(本地语言支持)。值得一提的是Network
FileSystems里面的两种:NFS和SMB分别是Linux和Windows相互以网络邻居的形
式访问对方所使用的文件系统,根据需要加以选择。
edrivers
控制台驱动。一般使用VGAtextconsole就可以了,标准的80*25的文本控制台。
声卡驱动。如果你能在列表中找到声卡驱动那自然最好,否则就试试OSS了。
prot
USB支持。很多USB设备,比如鼠标、调制解调器、打印机、扫描仪等,在Linux
都可以得到支持,根据需要自行选择。
hacking
配置了这个,即使在系统崩溃时,你也可以进行一定的工作了。普通用户是用不着这个
功能的。
对了,你还是把“我省去了制作启动盘的过程,这个网上可以大把大把的抓!”也加上的
好,这样更有利于其他人的学习
制作启动盘的过成实际上是在一个空空的硬盘或软盘上加上启动信息的过程,针对
linux或unix来讲,也就是增加lilo启动信息的过程,从而使得我们转移到本硬盘的内核能够
启动,进一步能够执行linux其他的一些必要的系统初始程序...
启动盘的制作过程可以搜索关键字:"制作软盘linux"或"tinylinux"
或这个url:
(/arch?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,准备两块硬盘AB,分别安装好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"这样的参数正确,如果启动时后找不到内核,问题一般出在这里,一个比较稳妥的
方法是两块硬盘完全相同,且保证AB分别做主盘时硬盘跳线都一样,接到主板的数据线都
一样)..
8,如果此时A盘不能启动,请大家联系我....
9,如果A盘能够启动,从新用B做主盘,A做从盘,参照主贴中的描述完善A盘中的文件,
主要是不需要的函数库的清理和网络功能,及文件系统功能的完善...
10,完善好以后,可以将A盘做成ghost,然后直接ghost到软盘/CF盘/其他硬盘上...
11,登陆功能的完善,这个很讨厌(个人觉得),大家删除/lib下面的库的时候一定要小心,
如一下加密的库,如pam的库,libc的库等...(有兴趣可以查看linux登陆过程的相关介绍,
我看过,但是早就忘了)
注:在我确定这个思路以后,裁减时间一共用了1天的时间(此前用其他方案做了一个星
期没有完成),大约50次拆/装硬盘...希望大家在制作的过程中不要怕麻烦..
原文链接:/u/11176/showart_
BusyBox简化嵌入式Linux系统
:2006-09-13作者:es来自:IBMDW中国
BusyBox是很多标准Linux®工具的一个单个可执行实现。BusyBox包含了一些简单
的工具,例如cat和echo,还包含了一些更大、更复杂的工具,例如grep、find、mount
以及telnet(不过它的选项比传统的版本要少);有些人将BusyBox称为Linux工具
里的瑞士军刀。本文将探索BusyBox的目标,它是如何工作的,以及为什么它对于内存
有限的环境来说是如此重要。
BusyBox的诞生
BusyBox最初是由BrucePerens在1996年为DebianGNU/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函数的定义如下:
清单1.C的main函数
intmain(intargc,char*argv[])
在这个定义中,argc是传递进来的参数的个数(参数
数量),而argv是一个字符串数组,代表从命令行
传递进来的参数(参数向量)。argv的索引0是从命令行调用的程序名。
BusyBox许可证
BusyBox是按照GNU
GeneralPublicLicen(GPL)
许可证发行的。这意味着如果我
们在一个项目中使用
BusyBox,就必须遵守这个许可
证。我们可以在BusyBoxWeb
站点(请参看本文后面参考资料
一节的内容)上看到这个许可证
的内容。BusyBox团队似乎正
忙于监视违反这个许可证的情
况。实际上,他们维护了一个
“HallofShame”页面来说明
违反者的情况。
POSIX环境
尽管BusyBox的目标是提供
一个相当完整的POSIX(可移
植操作系统接口)环境,这是一
个期望,而不是一种需求。这些
工具虽然并不完整,但是它们提
供了我们期望的主要功能。
清单2给出的这个简单C程序展示了BusyBox的调用。它只简单地打印argv向量的
内容。
清单x使用argv[0]来确定调用哪个应用程序
//test.c
#include
intmain(intargc,char*argv[])
{
inti;
for(i=0;i
printf("argv[%d]=%sn",i,argv[i]);
}
return0;
}
调用这个程序会显示所调用的第一个参数是该程序的名字。我们可以对这个可执行程序重新
进行命名,此时再调用就会得到该程序的新名字。另外,我们可以创建一个到可执行程序的
符号链接,在执行这个符号链接时,就可以看到这个符号链接的名字。
清单3.在使用新命令更新BusyBox之后的命令测试
$gcc-Wall-otesttest.c
$./testarg1arg2
argv[0]=./test
argv[1]=arg1
argv[2]=arg2
$mvtestnewtest
$./newtestarg1
argv[0]=./newtest
argv[1]=arg1
$ln-snewtestlinktest
$./linktestarg
argv[0]=./linktest
argv[1]=arg
BusyBox使用了符号链接以便使一个可执行程序看起来像很多程序一样。对于BusyBox
中包含的每个工具来说,都会这样创建一个符号链接,这样就可以使用这些符号链接来调用
BusyBox了。BusyBox然后可以通过argv[0]来调用内部工具。
配置并编译BusyBox
我们可以从BusyBox的Web站点上下载最新版本的BusyBox(请参看参考资料一
节的内容)。与大部分开放源码程序一样,它是以一个压缩的tarball形式发布的,我们
可以使用清单4给出的命令将其转换成源代码树。(如果我们下载的版本不是1.1.1,那
就请在这个命令中使用适当的版本号以及特定于这个版本号的命令。)
清单4.展开BusyBox
$
$
结果会生成一个目录,名为busybox-1.1.1,其中包含了BusyBox的源代码。要编译
默认的配置(其中包含了几乎所有的内容,并禁用了调试功能),请使用defconfigmake
目标:
清单5.编译默认的BusyBox配置
$cdbusybox-1.1.1
$makedefconfig
$make
$
结果是一个相当大的BusyBox映像,不过这只是开
始使用它的最简单的方法。我们可以直接调用这个新
映像,这会产生一个简单的Help页面,里面包括当
前配置的命令。要对这个映像进行测试,我们也可以
对一个命令调用BusyBox来执行,如清单6所示。
清单6.展示BusyBox命令的执行和BusyBox中的ashshell
$./busyboxpwd
BusyBox源代码树
BusyBox的源代码树组织得很
好。这些工具都基于它们的用途
进行了分类,并存储在单独的子
目录中。例如,网络工具和守护
进程(如httpd、ifconfig等)
都在./networking目录中;标
准的模块工具(包括insmod、
rmmod和lsmod)都
在./modutils目录中;编辑器
(例如vi和流编辑器,如awk
和d)都在./editors目录
中。makefile配置、编译和安
装所使用的各个文档都在这个目
录树的根目录中。
/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内核的内容所使用的目标相同。实际上,它们都采用了相同的基于ncurs
的应用程序。
使用手工配置,我们可以指定在最终的BusyBox映像中包含的命令。我们也可以对
BusyBox环境进行配置,例如包括对NSA(美国国家安全代理)的安全增强Linux
(SELinux),指定要使用的编译器(用来在嵌入式环境中进行交叉编译)以及BusyBox
应该静态编译还是动态编译。图1给出了menuconfig的主界面。在这里我们应该可以看
到可以为BusyBox配置的不同类型的应用程序(applet)。
图1.使用menuconfig配置BusyBox
要手工配置BusyBox,请使用下面的命令:
清单7.手工配置BusyBox
$makemenuconfig
$make
$
这为我们提供了可以调用的BusyBox的二进制文件。下一个步骤是围绕BusyBox构建
一个环境,包括将标准Linux命令重定向到BusyBox二进制文件的符号链接。我们可以
使用下面的命令简单地完成这个过程:
多体系结构支持
可以简单地为BusyBox指定
交叉编译器意味着我们可以为很
多体系结构编译BusyBox。要
为您的目标体系结构编译
BusyBox,我们需要一个交叉编
译器和一个已经为特定目标体系
结构编译好的C库(uClibc或
glibc)。
清单8.构建BusyBox环境
$makeinstall
$
默认情况下,这会创建一个新的本地子目录_install,其中包含了基本的Linux环境。在
这个根目录中,您会找到一个链接到BusyBox的linuxrc程序。这个linuxrc程序在
构建安装盘或急救盘(允许提前进行模块化的引导)时非常有用。同样是在这个根目录中,
还有一个包含操作系统二进制文件的/sbin子目录。还有一个包含用户二进制文件的/bin
目录。在构建软盘发行版或嵌入式初始RAM磁盘时,我们可以将这个_install目录迁移
到目标环境中。我们还可以使用make程序的PREFIX选项将安装目录重定向到其他位
置。例如,下面的代码就使用/tmp/newtarget根目录来安装这些符号链接,而不是使
用./_install目录:
清单9.将符号链接安装到另外一个目录中
$makePREFIX=/tmp/newtargetinstall
$
使用installmake目标创建的符号链接都来自于文件。这个文件是在
编译BusyBox时创建的,它包含了已经配置的命令清单。在执行install时,就会检查
文件确定要创建的符号链接。
到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-curs(基于菜单的)配置工具
all编译BusyBox二进制文件和文档(./docs)
busybox编译BusyBox二进制文件
clean清除源代码树
distclean彻底清除源代码树
sizes显示所启用的应用程序的文本/数据大小
在定义配置时,我们只需要输入make就可以真正编译BusyBox二进制文件。例如,要
为所有的应用程序编译BusyBox,我们可以执行下面的命令:
清单11.编译BusyBox二进制程序
$makeallyesconfig
$make
$
压缩BusyBox
如果您非常关心对BusyBox映像的压缩,就需要记住两件事情:
1.永远不要编译为静态二进制文件(这会将所有需要的库都包含到映像文件中)。相
反,如果我们是编译为一个共享映像,那么它会使用其他应用程序使用的库(例如
/lib/.X)。
2.使用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
FILE,read
standardinput.
Options:
-cprintthebytecounts
-lprintthenewlinecounts
-Lprintthelengthofthelongest
line
-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");
for(i=0;i
printf("arg[%d]=%sn",i,argv[i]);
}
return0;
}
接下来,我们要将这个新命令的源代码添加到所选子目录中的中。在本例中,
我更新了./miscutils/文件。请按照字母顺序来添加新命令,以便维持与现
有命令的一致性:
清单14.将命令添加到中
MISCUTILS-$(CONFIG_MT)+=mt.o
MISCUTILS-$(CONFIG_NEWCMD)+=newcmd.o
MISCUTILS-$(CONFIG_RUNLEVEL)+=runlevel.o
接下来再次更新./miscutils目录中的配置文件,以便让新命令在配置过程中是可见的。
这个文件名为,新命令是按照字母顺序添加的:
清单15.将命令添加到中
configCONFIG_NEWCMD
bool"newcmd"
defaultn
help
newcmdisanewtestcommand.
这个结构定义了一个新配置项(通过config关键字)以及一个配置选项(CONFIG_NEWCMD)。
新命令可以启用,也可以禁用,因此我们对配置的菜单属性使用了bool(Boolean)值。
这个命令默认是禁用的(n表示No),我们可以最后放上一个简短的Help描述。在源
代码树的./scripts/config/文件中,我们可以看到配置语法的完
整文法。
接下来需要更新./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添加帮助信息
#definenewcmd_trivial_usage"None"
#definenewcmd_full_usage"None"
最后一个步骤是启用新命令(通过makemenuconfig,然后在MiscellaneousUtilities菜
单中启用这个选项)然后使用make来编译BusyBox。
使用新的BusyBox,我们可以对这个新命令进行测试,如清单18所示。
清单18.测试新命令
$./busyboxnewcmdarg1
newcmdcalled:
arg[0]=newcmd
arg[1]=arg1
$./busyboxnewcmd--help
BusyBoxv1.1.1(2006.04.12-13:47+0000)
multi-callbinary
Usage:newcmdNone
None
就是这样!BusyBox开发人员开发了一个优秀但非常容易扩展的工具。
结束语
BusyBox是为构建内存有限的嵌入式系统和基于软盘系统的一个优秀工具。BusyBox通
过将很多必需的工具放入一个可执行程序,并让它们可以共享代码中相同的部分,从而对它
们的大小进行了很大程度的缩减,BusyBox对于嵌入式系统来说是一个非常有用的工具,
因此值得我们花一些时间进行探索。
原文链接:
/developerworks/cn/linux/l-busybox/
本文发布于:2022-11-13 05:39:47,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/9158.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |