BusyBox

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

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

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

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

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

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

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

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

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

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

コマンド 
公式の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 (UNIX) — ファイルを移動する
 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（802.1q）の設定プログラム
 vi — ファイルを編集する（visual edit）
 vlock — 仮想コンソールのロックプログラム
 volname — ボリューム名を表示する
 watch — プログラムを定期的に実行する
 watchdog — software watchdogのデーモン
 wc — 単語数、行数、バイト数、文字数をカウントする
 wget 
 which — コマンドのフルパスを表示する
 who — 現在システムを利用しているユーザーを表示する
 whoami — 現在使用しているユーザーのuseridを表示する
 xargs — 引数リストを組み合わせてユーティリティを実行する
 yes — 文字列を繰り返し表示する
 zcat — 圧縮ファイルを標準出力に展開する
 zcip

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

 /bin/busybox ls

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

 /bin/ls

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

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

インストール 
通常、それぞれのコマンド名を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とすることで指定されたディレクトリにシンボリックリンクが作成される。

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

 Actiontec GT701 DSLモデム/ルーター（GT701-WG 無線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
 ディーリンク製品（DSL-500B, DSL-504T, DSL-524T, DSL-564T, DSL-584T, DSL2500U, DSL2540U, DSL2640U, DSL-2640T, DSL-G604T, DSL-G624T, DSL-G664T, DSL-G684T など）
 Dream Multimedia Dreambox ホビースト用DVBサーバ
 Edimax 製品（EW-7206APg Wifi Access Point など）
 Emprex ME1 HD Multimedia Enclosure
 フランスの通信業者 Iliad が配布しているDSLモデム/ルーター Freebox
 Gamepark Holdings のオープンソースLinuxゲーム機 GP2X
 HP Media Vault
 IBM Hardware Management Console (HMC)
 LaCie Ethernet Big Disk 1TB
 LevelOne  製品（WBR-3460A など）
 リンクシス製品（NSLU2 NAS、WRT54Gブロードバンドルーターなど）
 Motorola A780
 Mvix MX-760HD メディアプレーヤー
 Netcomm NB1 ADSLモデム
 NTT ルータ (RT-200-KI)
 ネットギア製ルーター（DG834G など）
 Neuros OSD MPEG ビデオレコーダー
 Nokia 770, Nokia N800, Nokia N810
 OvisLink製品（WL-5460AP WiFi AccessPoint、Evo-DSL04 Modem/Router ADSL2+ など）
 OpenMoko
 Open Networks iConnect612 ADSLルーター
 Picotux（Linuxの動作する世界最小のコンピュータ）
 QNAP NAS （TS-101、TS-201など）
 Qtopia Greenphone
 ザウルス
 Sonos Digital Music System
 ソニー Digital Video Recorders DHG-HDD250 & DHG-HDD500
 Synology NAS
 Telindus 1130 ADSL Router
 Thecus NAS
 TP-Link 製品（TD-88xx ADSLルーターなど）
 Western Digital My Book
 Zipit Wireless Messenger

より完全な一覧は公式サイトにある。

GPL違反問題 
BusyBoxの組み込み機器での使用が、初のGPL違反問題として法廷に持ち込まれた。2007年9月20日、AndersenとLandleyの付託を受け Software Freedom Law Center (SFLC) がMonsoon Multimedia Inc.を訴えた（訴訟番号07-CV-8205、ニューヨーク州南部地区連邦地方裁判所）。同社のファームウェアアップグレードの中にBusyBoxのコードが見つかり、同社に連絡しようとしたができなかったのが発端である。この件はMonsoon版のソースの公開と、AndersenとLandleyへの賠償金の支払い（金額は未公開）で決着した。

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

脚注

外部リンク 
 
 busybox-w32 - Windows 版

組み込みオペレーティングシステム
Linux
フリープログラミングツール
POSIX準拠シェル