インストール - 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の構成を下図に示す。
- BusyBox
- 1つのコマンド
- BusyBoxの内部構成
- アプレットとlibbb
アプレットとは、コマンドの機能に相当するものである。
例えば、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アプレットを呼び出す。
BusyBoxの設定とインストール
まず、BusyBoxの最新のソースコードを公式Webサイトからダウンロードする。
ダウンロードしたファイルを展開して、展開先のディレクトリに移動する。
tar xf busybox-<バージョン>.tar.bz2 cd busybox-<バージョン>
次に、どのアプレットを含めるのかを設定するため、以下のコマンドを実行して、設定画面を開く。
make -j $(nproc) menuconfig
これは、Linuxカーネルのコンパイルと同様の画面である。
例えば、Coreutilsを選択すると、下図の画面が表示される。(catアプレットやcpアプレット等が選択されている)
[Y]キーを押下するとアプレットが選択され、[N]キーを押下すると選択が解除される。
使用するアプレットの選択が完了した後、[Exit]を選択して、[Yes]を選択すると選択内容の保存を行う。
次に、上記で選択したアプレットを含むBusyBoxをコンパイルしてインストールする。
標準では、カレントディレクトリ下の_installディレクトリにインストールされる。
(BusyBoxの実行ファイルは、_install/bin/busyboxである)
make -j $(nproc) make install
最後に、_install/binディレクトリの中を確認する。
上記に記載したように、各アプレットがBusyBoxへのシンボリックリンクになっている。
# 入力 ls -l _install/bin
# 出力 lrwxrwxrwx 1 user group 7 Jan 7 22:36 addgroup -> busybox lrwxrwxrwx 1 user group 7 Jan 7 22:36 adduser -> busybox lrwxrwxrwx 1 user group 7 Jan 7 22:36 ash -> busybox -rwxr-xr-x 1 user group 626080 Jan 7 22:36 busybox lrwxrwxrwx 1 user group 7 Jan 7 22:36 cat -> busybox rwxrwxrwx 1 user group 7 Jan 7 22:36 chgrp -> busybox lrwxrwxrwx 1 user group 7 Jan 7 22:36 chmod -> busybox lrwxrwxrwx 1 user group 7 Jan 7 22:36 chown -> busybox lrwxrwxrwx 1 user group 7 Jan 7 22:36 cp -> busybox ...略...
BusyBoxの動作を確認するため、以下のアプレットを実行する。
ファイルの一覧が表示されれば、BusyBoxが正常に動作している。
./_install/bin/ls
ここでは、Linux PC上で動作させたが、実務においては、組み込み機器のMCUに合わせてクロスコンパイルする必要がある。
クロスコンパイルの手順は、make
コマンドでコンパイルする時、CROSS_COMPILE
オプションを付加して、クロスコンパイル向けGCCファイルのパスを指定する。
(クロスコンパイル向けGCCファイルのパスから、gccを除いた文字列を指定する)
例えば、Renesas SH向けGCCのファイル名がsh-linux-gccの場合、
CROSS_COMPILE=/<Renesas SH向けGCCのインストールディレクトリ>/sh-linux-
と指定して、Renesas SHで動作するBusyBoxをコンパイルする。
# 例1. Renesas SH向け make -j $(proc) CROSS_COMPILE=/<Renesas SH向けGCCのインストールディレクトリ>/sh-linux- make install # 例2. AArch64向け make -j $(proc) CROSS_COMPILE=/<AArch64向けGCCのインストールディレクトリ>/aarch64-linux-gnu- make install
最後に、生成された_installディレクトリ下のファイルを、組み込み機器に配置する。