インストール - BusyBox
概要
BusyBoxとは、主に組み込みLinuxで使われるオープンソースの万能コマンドのことである。
BusyBoxは、cpコマンドやpingコマンド等の様々なコマンドの働きを1つの実行ファイルに持たせており、
BusyBoxがこれらのコマンドの代わりを果たしている。
ここでは、BusyBoxの概要を記載するとともに、実際に使用してBusyBoxを理解する。
BusyBoxのメリット
BusyBoxは、組み込みLinuxをベースとした様々な機器で使用されている。
組み込みLinuxでBusyBoxが広く使われている理由は、以下の2つにある。
- ファイルサイズを削減できる
- コンパイル作業が簡単
ファイルサイズを削減できる
組み込み機器の場合、システムファイルを格納する補助記憶装置として、
信頼性とコストの点からFlash ROM(例 : 10[MB]未満など)を採用するケースが多いため、補助記憶装置の容量に限りがある。
設計者が、"システムのサイズをできる限り小さくすることが重要"とリソースを気にするのはそのためである。
ましてや、組み込み機器でLinuxを動作させる場合などは、"いかにファイルサイズを小さくするか"が重要となる。
Linuxを動作させるために多くのコマンドを導入する場合、使用頻度の少ないコマンドや似たような処理を行うコマンドがあるため、
無駄になるものが多い。
その上、コマンド毎にプログラム実行に必要な管理情報(2[KB] - 4[KB]程度)が含まれるため、
コマンド数が多くなると管理情報の合計サイズも増大する。
これに対して、BusyBoxはコマンドの無駄な機能を省略して設計されているので、管理情報もBusyBoxの1つ分だけで済むため、
ファイルサイズを小さくできる。
コンパイルが簡単
Linux PCでソフトウェアを動作させる場合は、Linuxディストリビューションが用意するバイナリをインストールするだけで済むが、
組み込みLinuxの場合は、機器が使用するハードウェアや用途が多種多様であるため、そのようなバイナリは用意されていない。
そのため、ソフトウェアを動作させるには、それぞれソースコードからコンパイルを行う必要があり、
また、ソフトウェアごとにその方法が異なるため、作業が煩雑になる。
BusyBoxは、BusyBox自身に様々なソフトウェアの機能が集約されているので、BusyBox1つをコンパイルするだけで済むというメリットがある。
BusyBoxの構成
- BusyBox
- 1つのコマンド
- BusyBoxの内部構成
- アプレットとlibbb
BusyBoxの構成を下図に示す。
アプレットとは、コマンドの機能に相当するものである。
例えば、initアプレットは、initコマンドの機能を提供し、pingアプレットはpingコマンドの機能を提供する。
libbbとは、アプレット間で共通して使用する関数を定義している。
各アプレットは、libbbの関数をできるだけ使うように実装されており、BusyBoxのサイズ削減に貢献している。
また、アプレットの実装はオリジナルのコマンドのソースコードを使用せずに、サイズを優先して1から書き直されていることが殆どである。
上記に加えて、BusyBoxはlibbbの利用以外にもサイズ削減の努力がなされている。
例えば、利用頻度の低いコマンドが省略されており、エラーメッセージも1[byte]でも短くなるように簡潔な表現になっている。
更には、メモリ解放のためのfree関数が省略されている。(コマンド終了時に、メモリが解放されるので、freeが必要な場合は限られる)
BusyBoxの機能
BusyBoxは、多くのコマンド(アプレット)を持っている。
例えば、シェルやエディタ(vi、sed、awk等)、システム管理コマンド(coreutils、tar、bzip等)、
ネットワークコマンド(ping、ifconfig、wget等)、ユーザ管理コマンド(login、su、useradd等)、
各種デーモン(crond、syslogd、httpd等)、SELinux管理コマンド(load_policy、restorecon等)が用意されている。
BusyBoxのアプレットを使用する場合、BusyBoxを意識せずにコマンドとしてそのまま実行できる。
例えば、/bin/catを実行すると、BusyBoxの中にあるcatアプレットが呼ばれる。
以下に、BusyBoxが入っているシステムのディレクトリ構造を示す。
# 入力 ls -l /bin
# 出力 ...略... /bin/cat -> /bin/busybox /bin/ls -> /bin/busybox
上記の出力を見ると、/bin/catや/bin/lsは、/bin/busyboxへのシンボリックリンクになっていることが分かる。
そして、/bin/busybox(BusyBox本体)は、argv[0](実行しようとしたファイル名)によって振る舞いを変更するようになっている。
例えば、/bin/catを実行すると、そのリンク先である/bin/busyboxが実行されて、argv[0]は/bin/catとなる。
/bin/busyboxは、argv[0]が/bin/catであることを確認して、catアプレットを呼び出す。