BusyBoxは軽くて便利だけど使いたかった機能が含まれていない!! そんなときはBusyBoxを拡張して、自由にアプレットを追加しよう。
連載第1〜5回では、BusyBoxにすでにある機能を使ってシステムを構築する方法を紹介しました。
しかし、現実には、
「BusyBoxにある機能だけでは、想定しているシステムを構築できない!」
といったことも起こり得ます。例えば、フラッシュメモリやファイルシステムを取り扱う必要がある場合、BusyBoxにはこれらに関する「アプレット」はあらかじめ用意されていません。
というわけで今回は、BusyBoxを拡張して機能(アプレット)を追加する方法を紹介します。自由にアプレットの追加ができるようになれば、開発の幅も広がるはずです。
アプレットを追加するには、まずBusyBoxのソースコードの構成を知っておく必要があります。
「組み込みLinuxで際立つ『BusyBox』の魅力」で説明したとおり、BusyBoxはアプレットの集合体ですので、ソースコードのほとんどは登録されているアプレットに関するものです。BusyBoxの設定画面「make menuconfig」で出てくるカテゴリごとに、ディレクトリが作られており、その中にアプレットのソースコードが格納されています。例えば、「editors」というディレクトリには、「Editors」カテゴリのアプレットのソースコードが格納されています(「Editors」カテゴリのアプレット「vi」の場合、「editors/vi.c」のようにソースコードが格納されています)。
アプレットのほかに知っておく必要のあるものは、「libbb」です。libbbとは、アプレット間で共通して使う関数を集めたもの(定義したもの)で、各アプレットは、libbbで定義された関数をできるだけ使うように実装されており、BusyBoxのサイズ削減に効果を発揮しています。なお、libbbのソースコードは「libbb」ディレクトリ以下に格納されています。
関連リンク: | |
---|---|
⇒ | 組み込みLinuxで際立つ「BusyBox」の魅力 |
アプレットのソースコードを理解するには、どのようにしてアプレットが起動するのかを理解しておく必要があります。
BusyBoxは、
「/bin/busyboxへのシンボリックリンクである/bin/lsを実行すると、lsアプレットが起動する」
ようになっています。これはどのようにして実現されているのでしょうか? その鍵となるソースコードが、「libbb/appletlib.c」にあります。
(1)BusyBoxのmain関数です。(2)0番目の引数argv[0]が、applet_nameにセットされます。applet_nameには、実行したシンボリックリンクの名前が入ります。例えば、「/bin/ls」と実行したならば、「/bin/ls」がapplet_nameに入ります。(3)(2)のapplet_nameからディレクトリ名を除去する関数です。applet_nameが、「/bin/ls」ならば、処理後はアプレット名である「ls」となります。(4)applet_nameに格納されたアプレット名に対応したアプレットを呼ぶ関数です。最終的にはこの関数から、<アプレット名>_mainという関数に処理が渡ります。applet_nameが「ls」ならば、ls_mainという関数になります。<アプレット名>_mainという関数は、各アプレットのソースコードで必ず定義されているものです。
例えば、「ls」アプレットのソースコードである「coreutils/ls.c」を見てみると、
int ls_main(int argc UNUSED_PARAM, char **argv)
のように、確かにls_mainという関数が定義されています。これらの関数の中でアプレット特有の処理を行うわけです。
それでは、「BusyBoxにアプレットを追加」してみましょう!!
ちなみに今回と次回で、「mtd-utils」の中の「mtd_debug」コマンドを移植する作業を紹介しながら、具体的なアプレットの追加方法を解説していきます。
「mtd-utils」は、フラッシュメモリを扱うコマンド群で、組み込み開発で使うことが多いものですが、通常BusyBoxには格納されていません。この中にある「mtd_debug」コマンドは、フラッシュメモリの情報を閲覧したり、データを書き込んだりするために使うコマンドです。
以下に、新規アプレットを追加するために必要な5つの作業を示します。
今回は(1)〜(3)について触れ、必要最低限のアプレットを追加し、動作確認を行います。そして、(4)(5)については次回、実際のアプレットの機能を実装するとともに、チューニングについても解説します。
Copyright © ITmedia, Inc. All Rights Reserved.