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 版