組み込みLinuxの世界で「万能コマンド」「コマンドの十徳ナイフ」と称されるオープンソース“BusyBox”とは? その概要と魅力について解説する。
皆さん、「BusyBox」をご存じでしょうか?
BusyBoxとは「主に組み込みLinuxで使われるオープンソースの“万能コマンド”のこと」です。
こう聞くと「万能コマンド? なんだか信用できないなぁ」と感じる方もいることでしょう。
そこで、本特集ではBusyBoxの概要を紹介するとともに、(実際に触れてみる)体験を通じて、少しでも多くの方にBusyBoxの魅力を理解していただくことを目的とします。
さて、冒頭でBusyBoxのことを“万能コマンド”と表現したのには理由があります。
それは、「cp」「init」「ping」をはじめとするさまざまなコマンドの働きを1つの実行ファイルに持たせており、BusyBoxがこれらのコマンドの代わりを果たしているからです(詳しい内容は以降で解説しています)。
「ふ〜ん。じゃあ、BusyBoxって実際どれくらい使われているのよ?」と疑問に思うことでしょう。
あまり認知されていないかもしれませんが、実は組み込みLinuxをベースとしたテレビやオーディオ、ブロードバンドルータ、小型サーバなど、さまざまな機器にBusyBoxが搭載されており、組み込みLinuxの世界では「常識」といえる存在でもあります。
「えぇ〜、初めて聞いた」という方は、以下のサイトで公開されているソースコードをダウンロードして、中身をのぞいてみてください。
関連リンク:機器にBusyBoxが使われていることを確認できるWebサイト | |
---|---|
⇒ | テレビ−ソニーのサイト |
⇒ | オーディオプレーヤ−ケンウッドのサイト |
⇒ | ブロードバンドルータ−Planexのサイト |
⇒ | 小型サーバ−NTTコムウェアのサイト |
いかがですか? 「へぇ〜、結構使われてるじゃん!」と少しは興味を持っていただけましたか? 実際に、BusyBoxが組み込みLinuxをベースとしたさまざまな機器に搭載されていることを理解していただいたところで次にいきましょう。
前述の内容で、BusyBoxが組み込みLinuxをベースとしたさまざまな機器に採用されていることが分かったと思います。
次に、「じゃあ、なぜ“組み込みLinuxの世界”でBusyBoxが広く使われているの?」という疑問がわいてくるのではないでしょうか?
その理由は以下の2つにあります。
これだけではイメージしづらいと思いますので、以下でもう少し詳しくこの2つについて解説します。
組み込み機器の場合、システムファイルを格納する補助記憶装置として、信頼性とコストの点からFlash ROM(数Mbytes〜数十Mbytes程度)を採用するケースが多いため、補助記憶装置の容量に限りがあります。
組み込みエンジニアの方が「システムのサイズをできる限り小さくすることが重要」とリソースを気にされるのはそのためです。ましてや、組み込み機器上でLinux OSを動作させる場合などは“いかにファイルサイズを小さくするか”がとても重要となります。
通常、Linuxのシステムを動作させるためには多くのコマンドを導入する必要がありますが、導入したこれらのコマンドには“あまり使わないオプション”や“同じような処理を行う関数”などが定義されており、組み込み機器にとって“無駄”となるものが含まれています。そのうえ、コマンドごとにプログラム実行に必要な管理情報(2〜4kbytesあります)が含まれるため、コマンド数が多くなると管理情報の合計サイズも増大していきます。
これに対して、本特集の主役であるBusyBoxはというと、コマンドの無駄な機能を徹底して省いて作られているうえ、“管理情報についてもBusyBoxの1つ分だけで済む”というメリットがあり、ファイルサイズを小さくすることができます。
PCでアプリケーションを動作させる場合は、Linuxディストリビューションが用意するバイナリをインストールするだけで済みます。しかし、組み込み機器の場合は使われるハードウェアやその用途が多種多様であるため、そのようなバイナリは用意されていません。そのため、複数のアプリケーションを動作させるには、それぞれソースからコンパイルを行う必要があります。さらに、このソースからのコンパイル作業ですが、アプリケーションごとにその方法が異なるため、作業が煩雑になりがちです。
一方、BusyBoxはというと、それ(BusyBox)自身にさまざまなアプリケーションの機能が集約されていますので、“BusyBox1つをコンパイルするだけで済む”というメリットがあります。
「なるほど、BusyBoxの中にはさまざまなアプリケーションの機能が集約されているんだ」ということが分かってきたところで、次はBusyBoxの構成について説明します(図1)。
アプレットとは、“コマンドの機能に相当するもの”です。例えば、「initアプレット」は、initコマンドの機能を提供し、「pingアプレット」はpingコマンドの機能を提供します。そして、libbbは“アプレット間で共通して使う関数を定義”しています。各アプレットは、libbbの関数をできるだけ使うように実装されており、BusyBoxのサイズ削減に貢献しています。また、アプレットの実装はオリジナルのコマンドのソースを使い回さずに、サイズを優先して一から書き直されていることがほとんどです。
これに加え、BusyBoxはlibbbの利用以外にもサイズ削減の努力がなされています。例えば、利用頻度の低いオプションが省かれていたり、エラー・メッセージも1byteでも短くなるように簡潔な表現になっています。さらには、メモリ解放のためのfree関数が省かれていたりします(コマンド終了時に、メモリは解放されますので、本当にfreeが必要な場合は限られます)。
次に、BusyBoxの具体的な機能について見ていきましょう。
BusyBoxは、さまざまなコマンドの機能を持っています。つまり、さまざまなコマンドに対応したアプレットが用意されています(これまでの解説でイメージできますよね?)。大げさに聞こえるかもしれませんが、“BusyBoxだけでディストリビューションができてしまう”ぐらいのアプレットが用意されているのです。
例えば、シェル、エディタ(vi、sed、awkなど)、システム管理コマンド(coreutils、tar、bzipなど)、ネットワークコマンド(ping、ifconfig、wgetなど)、ユーザー管理コマンド(login、su、useraddなど)、各種デーモン(crond、syslogd、httpdなど)、SELinux管理コマンド(load_policy、restoreconなど)が用意されています。
「いろんなコマンドの機能が集約されているのは分かった! でも、コマンドの機能を使うときって、どうせ独自の特別な命令で実行しないと使えないんでしょ? 覚えるの面倒くさいなぁ〜」。
いえいえ、そんな心配は無用です。コマンドの機能を使いたいとき、“BusyBoxを意識せずにコマンドとしてそのまま実行する”ようにできています。
例えば、/bin/catを実行すると、BusyBoxの中にあるcatアプレットが呼ばれ、catコマンドとして動作します。
「ふ〜ん。じゃぁ、その仕組みって一体どうなっているの?」と疑問に思った方のために、以下にBusyBoxが入っているシステムのディレクトリ構造を示します(リスト1)。
# ls -l /bin (省略) /bin/cat -> /bin/busybox /bin/ls -> /bin/busybox
リスト1を見ると、/bin/catや/bin/lsが、/bin/busyboxへのシンボリック・リンクになっていることが分かります。そして、/bin/busyboxはBusyBox本体のことです。この/bin/busyboxは、argv[0](実行しようとしたファイル名)によって振る舞いを変えるようになっています。
例えば、/bin/catを実行すると、そのリンク先である/bin/busyboxが実行されます。ここで、argv[0]は/bin/catとなります。/bin/busyboxはargv[0]が/bin/catであるのを見て、catアプレットを呼び出し、catコマンドの働きをするわけです。同様に、/bin/lsを実行したときも、lsアプレットが呼び出され、lsコマンドの働きをします。
以上が、BusyBoxの概要となります。
「なるほど、使えそうだなぁ」とさらに興味がわいたところで次は、より具体的なイメージをつかんでいただくために、実際にBusyBoxを導入し、使用してみましょう。
Copyright © ITmedia, Inc. All Rights Reserved.