3種類のbusyboxは何が違うのか?

今日は大変つまらないことで恐縮だが、常々疑問に思っていたことをちょっと調べてみた。

主にinitrd環境などで使うbusyboxというコマンドがある。1つのコマンドでlsやcat、shなどの250種類以上ものコマンドの機能を実現するスイス製アーミーナイフのようなコマンドである(詳細は末尾の「busyboxとは」を参照)。ところがこのbusybox、実は3種類ある(私の知る限り3種類あるが、もっと色々あるかも知れない)。いわゆる通常のbusybox、インストールツールのanaconda用に最適化されたbusybox.anaconda、PlayStation 3のPetitbootと呼ばれるブートローダで使うbusybox.petitbootである。

しかし、この3種類、具体的に何が違うのかという説明が見当たらない。多分、探せばどこかにあるのだろうけども。なんと/usr/share/doc/busybox と /usr/sahre/doc/busybox-anaconda の資料は全くのコピーで違いが見当たらない。(多分、ソースを見るしかないのかも。)

そこで、この3つで何が違うのか推測してみた。

多分、使えるコマンドの数や種類が異なるだけなのだろう、と思った。先ずはそれぞれのコマンドのファイサイズを比較してみる。ちなみに比較に使ったのは Fedora 8のbusybox-1.6.1である。

[root@fedora-8 tmp]# ls -l busybox*
-rwxr-xr-x 1 root root 1851232 2008-08-03 21:47 busybox
-rwxr-xr-x 1 root root  780624 2008-08-03 21:47 busybox.anaconda
-rwxr-xr-x 1 root root  238176 2008-08-03 21:47 busybox.petitboot
[root@fedora-8 tmp]# 

通常のbusyboxが一番ファイルサイズが大きく、約1.8MBである。busybox.anacondaは約その半分以下、busybox.petitbootでは約240KBしかない。

次に使えるコマンドを比較してみた。
"--help"オプションで使えるコマンドの一覧が出てくる。

[root@fedora-8 tmp]# busybox --help
		:
		:
Currently defined functions:
        [, [[, addgroup, adduser, adjtimex, ar, arp, arping, ash, awk, basename, bunzip2,
        bzcat, cal, cat, catv, chattr, chgrp, chmod, chown, chpst, chroot, chrt, chvt,
        cksum, clear, cmp, comm, cp, cpio, crond, crontab, cut, date, dc, dd, deallocvt,
		:
		:
        tr, traceroute, true, tty, udhcpc, udhcpd, umount, uname, uncompress, uniq, unix2dos,
        unlzma, unzip, uptime, usleep, uudecode, uuencode, vconfig, vi, vlock, watch,
        watchdog, wc, wget, which, who, whoami, xargs, yes, zcat, zcip

[root@fedora-8 tmp]# 

busyboxではかなりの数のコマンドの機能がこの1つコマンドに集約されているのが分かる。それで僅か1.8MBしかない、と言うのは驚きである。

さて、このメッセージが各busyboxで使えるコマンドの数は比較すると次のようになった。

busyboxの種類 利用できるコマンドの数
busybox 255
busybox.anaconda 247
busybox.petitboot 72

通常のbusyboxbusybox.anacondaはコマンドの数にして8つしか違わない。(のに、ファイルサイズが半分以下とは?) busybox.petitbootは特殊環境にカスタマイズされているので、かなり少ない。

では、どのコマンド機能が異なるのか比較してみた。まずは、busyboxbusybox.anacondaだが、次のようになった。

busyboxのみ busybox.anacondaのみ
fdflush
halt
init
klogd
linuxrc
logger
logread
poweroff
reboot
syslogd

Linuxインストール用のbusybox.anacondaではシステム起動・停止用のコマンドとログのコマンドが省略されている代わりに、fdflushというフロッピーの交換を調べるコマンドが追加されている。ログに関してはインストール時のsyslogなどは必要ないので、そこは削除されているというのもうなずける。しかし、これらのコマンドを削っただけでサイズが半分になるのは別に原因がありそうだが(initとログ周りで結構サイズを喰っているのかな)。例えば、同じコマンド機能でも機能を限定しているとか。 念のために共通に使える246の全てのコマンドに対して、"--help"オプションの出力を比較してみたが、コマンドオプションなどヘルプメッセージは全く同じだった。

次に、busybox.petitbootだが、次のようになった。
busybox.petitbootで使えるコマンド:

[, [[, ash, basename, bunzip2, bzcat, cat, chroot, chvt, clear, cp, cpio, cut,
date, dd, df, dirname, dmesg, du, echo, eject, env, expr, false, fbset, fdisk,
ftpget, gunzip, gzip, halt, head, insmod, ip, ipaddr, iplink, iproute, kill, killall,
ln, ls, lsmod, md5sum, mdev, mkdir, mknod, modprobe, mount, mv, ping, ping6, poweroff,
ps, pwd, reboot, reset, rm, rmdir, rmmod, run-parts, setkeycodes, sh, sleep, sync,
tail, tar, tee, test, true, umount, uname, yes, zcat

busybox.petitbootで使えないコマンド(busyboxと比較して):

addgroup, adduser, adjtimex, ar, arp, arping, awk, cal, catv, chattr, chgrp, 
chmod, chown, chpst, chrt, cksum, cmp, comm, crond, crontab, dc, deallocvt,
delgroup, deluser, dhcprelay, diff, dnsd, dos2unix, dumpkmap, dumpleases, ed,
egrep, envdir, envuidgid, ether-wake, fakeidentd, fdformat, fgrep, find, fold,
free, freeramdisk, fsck, fsck.minix, ftpput, fuser, getopt, getty, grep,
hdparm, hexdump, hostid, hostname, httpd, hwclock, id, ifconfig, ifdown, ifup,
inetd, init, install, ipcalc, ipcrm, ipcs, iprule, iptunnel, killall5, klogd,
last, length, less, linux32, linux64, linuxrc, loadfont, loadkmap, logger,
login, logname, logread, losetup, lsattr, lzmacat, makedevs, mesg, mkfifo,
mkfs.minix, mkswap, mktemp, more, mountpoint, msh, mt, nameif, nc, netstat,
nice, nmeter, nohup, nslookup, od, openvt, passwd, patch, pidof, pipe_progress,
pivot_root, printenv, printf, raidautorun, rdate, readahead, readlink,
readprofile, realpath, renice, resize, route, rpm, rpm2cpio, runlevel, runsv,
runsvdir, rx, sed, seq, setarch, setconsole, setlogcons, setsid, setuidgid,
sha1sum, softlimit, sort, split, start-stop-daemon, stat, strings, stty, su,
sulogin, sum, sv, svlogd, swapoff, swapon, switch_root, sysctl, syslogd,
taskset, telnet, telnetd, tftp, time, top, touch, tr, traceroute, tty, udhcpc,
udhcpd, uncompress, uniq, unix2dos, unlzma, unzip, uptime, usleep, uudecode,
uuencode, vconfig, vi, vlock, watch, watchdog, wc, wget, which, who, whoami,
xargs, zcip,

以上、暇つぶし(?)に調べてみた。