BusyBox

BusyBoxは、Coreutilsなど標準UNIXコマンドで重要な多数のプログラムを単一の実行ファイルに「詰め込んで」提供する、特殊な方式のプログラムである。BusyBoxの実行ファイルはLinux上で最小の実行ファイルとなるよう設計されており、各コマンドの実行ファイルをインストールするのに比べディスクの使用量を大幅に削減することができる。そのため、特定用途のLinuxディストリビューションや組み込みシステムに適しており、「組み込みLinuxの十徳ナイフ」とも呼ばれている。GPLv2でリリースされているフリーソフトウェアである。

機能的には1994年にメリーランド大学カレッジパーク校でJames da Silvaが開発したFreeBSD用のプログラムである //crunchgen//コマンドと似ている。

1. 歴史
-----

1996年、ブルース・ペレンズが書いたのが起源である。Debianディストリビューション用のレスキューディスクにもインストーラにもなるフロッピーディスク1枚の完全なブート可能システムとして設計した。組み込みLinuxや各種Linuxディストリビューションのインストーラのデファクトスタンダードとなった。Linuxのそれぞれの実行ファイルには数キロバイトのオーバーヘッドがあるが、BusyBoxは200以上のプログラムを1つにまとめることで領域消費を大幅に削減している。

BusyBoxは、Debian のブートフロッピーインストーラ向けにEnrique Zanardiが1998年まで保守していたが、その後Linux Router Project  のDave Cinegeが引き継いだ。Cinegeはビルド環境のモジュール化などのいくつかの改良を施し、より組み込みシステム指向にした。1999年になってLRPの開発が低調になると、当時Lineo, Inc.にいたErik Andersenが引継ぎ、1999年12月から2006年3月まで保守を行った。この間、Linuxの組み込み用途の利用は爆発的に増大し、BusyBoxの機能も利用も増えていった。

2007年後半以降、BusyBoxをGPLに違反した使い方をした複数の企業を訴え、勝利したことで有名になった。

現在は Denys Vlasenko が保守を行っている。

2. 機能
-----

BusyBoxは200以上のユーティリティの一部だけを実装するようカスタマイズできる。Single UNIX Specification に含まれるユーティリティの大部分と他のLinuxでよく使われるユーティリティを提供できる。ユーティリティの一覧はBusyBoxのサイトにある。BusyBoxはUnixシェルにはashを使っている。

2.1. 単一バイナリ
-----------

通常、コンピュータプログラムにはそれぞれ個別のバイナリファイルがある。BusyBoxは全体で1つのバイナリになっており、その中に多数のアプリケーションが含まれている。それぞれのアプリケーションは単一のBusyBoxのバイナリをそれぞれの名前で適切な引数付きで呼び出すことで利用できる。

BusyBoxの単一バイナリは、実行ファイルのフォーマットによるオーバーヘッドを削減し、ライブラリを使うことなく、複数のアプリケーション間でコードを共有可能にする。

共通コードを共有し、サイズを最適化するよう心がけて各ルーチンを記述しているため、BusyBoxが代替しているユーティリティ群に比較して大幅な領域削減を実現している。2004年当時の Doug Thayer と Keith Miller による調査によると、GNUプロジェクト、BusyBox、asmutils、Perlによる実装の4種類でLinuxの標準的なコマンドを比較したとき、基本的に GNU の実装の物の方が実行速度が速いが、BusyBox の方が実行速度が速い場合が存在した。

2.2. コマンド
---------

公式のBusyBoxのドキュメントには、利用可能なコマンドとそのオプションの一覧が掲載されている。

BusyBoxコマンドの一覧
acpid
addgroup
adduser
adjtimex
ar
arp
arping
ash
awk
basename
beep
blkid
brctl
bunzip2
bzcat
bzip2
cal
cat — ファイルの内容を標準出力にコピーする
catv
chat
chattr
chgrp
chmod — ファイルのモードを変更する
chown
chpasswd
chpst
chroot
chrt
chvt
cksum
clear
cmp
comm
cp — コピーする
cpio
crond
crontab
cryptpw
cut
date — システム日時を表示する
dc
dd — ファイルを変換・フォーマットしながらコピーする
deallocvt
delgroup
deluser
depmod
devmem
df — ファイルシステムの使用統計を表示する
dhcprelay
diff
dirname
dmesg
dnsd
dnsdomainname
dos2unix
dpkg
du
dumpkmap
dumpleases
echo — 指定した1行の文字列を表示する
ed
egrep
eject
env
envdir
envuidgid
expand
expr
fakeidentd
false
fbset
fbsplash
fdflush
fdformat
fdisk
fgrep
find
findfs
flash_lock
flash_unlock
fold
free
freeramdisk
fsck
fsck.minix
fsync
ftpd
ftpget
ftpput
fuser
getopt
getty
grep — 各ファイルまたは標準入力の中からパターンを検索する
gunzip — 圧縮ファイルを展開する
gzip — ファイルを圧縮する
hd
hdparm
head
hexdump
hostid
hostname
httpd
hush
hwclock
id
ifconfig
ifdown
ifenslave
ifplugd
ifup
inetd
init
inotifyd
insmod
install
ionice
ip
ipaddr
ipcalc
ipcrm
ipcs
iplink
iproute
iprule
iptunnel
kbd_mode
kill — プロセスをkillする
killall
killall5
klogd
last
length
less
linux32
linux64
linuxrc
ln — 指定した対象を指すリンクまたはディレクトリを作成する
loadfont
loadkmap
logger
login — システムの新しいセッションを開始する
logname
logread
losetup
lpd
lpq
lpr
ls — ファイルまたはディレクトリのリストを表示する
lsattr
lsmod
lzmacat
lzop
lzopcat
makemime
man
md5sum
mdev — udev に似たコマンド
mesg
microcom
mkdir — ディレクトリを作成する
mkdosfs
mkfifo
mkfs.minix
mkfs.vfat
mknod
mkpasswd
mkswap
mktemp
modprobe
more — ファイルまたは標準入力を1画面ずつ表示する
mount — ファイルシステムをマウントする
mountpoint
mt
mv  — ファイルを移動する
nameif
nc — ネットワークに関するスイスアーミーナイフ
netstat — ネットワークの情報を表示する
nice
nmeter
nohup
nslookup
od
openvt
passwd
patch
pgrep
pidof — 指定した名前に一致したすべてのプロセスのPIDの一覧を表示する
ping — 指定したネットワークホストにICMP ECHO_REQUESTのパケットを送信する
ping6
pipe_progress
pivot_root
pkill
popmaildir
printenv
printf
ps — プロセスのステータスを表示する
pscan
pwd — ワーキングディレクトリを表示する
raidautorun
rdate
rdev
readlink
readprofile
realpath
reformime
renice
reset
resize
rm — ファイルを削除する
rmdir — ディレクトリを削除する
rmmod
route
rpm
rpm2cpio
rtcwake
run-parts
runlevel
runsv
runsvdir
rx
script
scriptreplay
sed — テキストストリームエディタ
sendmail
seq
setarch
setconsole
setfont
setkeycodes
setlogcons
setsid
setuidgid
sh
sha1sum — SHA-1メッセージダイジェストを計算・検証する
sha256sum — SHA-256メッセージダイジェストを計算・検証する
sha512sum — SHA-512メッセージダイジェストを計算・検証する
showkey
slattach
sleep — プログラムの実行を指定した時間一時停止する
softlimit
sort
split
start-stop-daemon
stat
strings
stty — ターミナルの行の設定を変更・表示する
su — 他のユーザーアカウントの権限でコマンドを実行する
sulogin
sum — ファイルのチェックサムの計算・ブロック数のカウントを行う
sv
svlogd
swapoff
swapon
switch_root
sync — ファイルシステムブロックのすべてのバッファをディスクに書き込む
sysctl
syslogd
tac — ファイルを逆順に結合して表示する
tail — ファイルの最後の部分を出力する
tar
taskset
tcpsvd
tee — 標準出力を複数のファイルに送信する
telnet
telnetd
test
tftp
tftpd
time
timeout — コマンドにタイムリミットを指定して実行する
top
touch — 指定したファイルの最終更新日時を更新する
tr — 文字の変換や削除を行う
traceroute
true
tty
ttysize
udhcpc — 小型のDHCPクライアント
udhcpd
udpsvd
umount — ファイルシステムをアンマウントする
uname — システムの情報を表示する
uncompress
unexpand
uniq
unix2dos
unlzma
unlzop
unzip
uptime — システムの起動後の経過時間を表示する
usleep — Nマイクロ秒一時停止する
uudecode
uuencode
vconfig — VLANの設定プログラム
vi — ファイルを編集する
vlock — 仮想コンソールのロックプログラム
volname — ボリューム名を表示する
watch — プログラムを定期的に実行する
watchdog — software watchdogのデーモン
wc — 単語数、行数、バイト数、文字数をカウントする
wget
which — コマンドのフルパスを表示する
who — 現在システムを利用しているユーザーを表示する
whoami — 現在使用しているユーザーのuseridを表示する
xargs — 引数リストを組み合わせてユーティリティを実行する
yes — 文字列を繰り返し表示する
zcat — 圧縮ファイルを標準出力に展開する
zcip

3. 実行例
------

BusyBox内のプログラムを実行するには、次のように、その名前をBusyBoxの引数として指定すればよい。

/bin/busybox ls通常は、使用したいコマンド名をBusyBoxの実行ファイルへのリンクとして作成する。BusyBoxは指定されたコマンド名をargvから読み取り、適切なコマンドを実行する。たとえば、///bin/ls//を///bin/busybox//へのリンクとして作成したあと、次のコマンドを実行するような使い方をする。

/bin/lsこれが機能するのは、プログラムに渡された第1引数は、プログラムの呼び出しに使用されるからである。この例では、第1引数は"/bin/ls"となる。

Busyboxは、「プログラムの名前」が"ls"であると判断して、"ls"プログラムと同じように動作する。

4. インストール
---------

通常、それぞれのコマンド名をBusyBox実行ファイルにリンクする。BusyBoxは呼び出されたときの名前を調べ、適切なコマンドを実行する。例えば、///bin/ls//を///bin/busybox//にリンクした状態で/bin/lsを実行する。

コンパイル後にmake installすることで、各種コマンド /bin、/usr/bin、/sbinなどにシンボリックリンクが作成される。Linuxカーネルから最初に起動される/sbin/initもシンボリックリンクでちゃんと作成される。これらに、加えて、/tmpを作り、/procと/sysのマウントと/devの生成を/etc/init.d/rcSに書くことにより、一つのLinuxディストリビューションが出来上がる。

Debianなどでは、パッケージマネージャーからbusyboxパッケージをインストールした後、busybox --install -s DIRとすることで指定されたディレクトリにシンボリックリンクが作成される。

5. 利用している機器
-----------

Linuxを使った機器でBusyBoxを採用しているものは多い。以下に例を挙げる。

Actiontec GT701 DSLモデム/ルーターQwest製DSLを採用。
Actiontec M1000 DSLモデム/ルーター Qwest製DSLを採用。
Actiontec MI424WR MoCA 無線ルーター Verizon FiOSを採用。
Amazon Kindle・電子ブックリーダー
ASUS 無線ブロードバンドルーター WL-500g、AM604G、RT-AC68U
AZTECH 無線DSLブロードバンドルーター 605EW
BT無線ルーター BT Home Hub
ディーリンク製品
Dream Multimedia Dreambox ホビースト用DVBサーバ
Edimax 製品
Emprex ME1 HD Multimedia Enclosure
フランスの通信業者 Iliad が配布しているDSLモデム/ルーター Freebox
Gamepark Holdings のオープンソースLinuxゲーム機 GP2X
HP Media Vault
IBM Hardware Management Console 
LaCie Ethernet Big Disk 1TB
LevelOne 製品
リンクシス製品
Motorola A780
Mvix MX-760HD メディアプレーヤー
Netcomm NB1 ADSLモデム
NTT ルータ 
ネットギア製ルーター
Neuros OSD MPEG ビデオレコーダー
Nokia 770, Nokia N800, Nokia N810
OvisLink製品
OpenMoko
Open Networks iConnect612 ADSLルーター
Picotux
QNAP NAS
Qtopia Greenphone
ザウルス
Sonos Digital Music System
ソニー Digital Video Recorders DHG-HDD250 & DHG-HDD500
Synology NAS
Telindus 1130 ADSL Router
Thecus NAS
TP-Link 製品
Western Digital My Book
Zipit Wireless Messengerより完全な一覧は公式サイトにある。

6. GPL違反問題
----------

BusyBoxの組み込み機器での使用が、初のGPL違反問題として法廷に持ち込まれた。2007年9月20日、AndersenとLandleyの付託を受け Software Freedom Law Center  がMonsoon Multimedia Inc.を訴えた。同社のファームウェアアップグレードの中にBusyBoxのコードが見つかり、同社に連絡しようとしたができなかったのが発端である。この件はMonsoon版のソースの公開と、AndersenとLandleyへの賠償金の支払いで決着した。

2007年11月21日、SFLCはAndersenとLandleyの付託を受けてさらに2社を訴えた。XterasysとHigh-Gain Antennasである。Xterasys の件は12月17日、High-Gain Antennasの件は2008年3月6日、Monsoonの件と同じような決着をした。2007年12月7日にはベライゾン・コミュニケーションズが同社のActiontecルーター用ファームウェアについて訴えられた。この件は2008年3月17日、ライセンスに従うこと、今後のライセンス遵守を監督する役員の指定、賠償金の支払いで決着した。次に2008年6月9日、Bell Microproductsと Super Micro Computerが訴えられ、Super Microの件は2008年7月23日に決着し、Bell Microproductsは出廷しなかったため、2008年9月10日に同社が訴訟費用も含めた懲罰的な賠償金を支払うことで決着した。

7. 脚注
-----

8. 外部リンク
--------

[1] - Windows 版