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、asmutils（英語版）、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は指定されたコマンド名をargv[0]（英語版）から読み取り、適切なコマンドを実行する。たとえば、/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 より完全な一覧は公式サイトにある。 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日に同社が訴訟費用も含めた懲罰的な賠償金を支払うことで決着した。