体験!マイコンボードで組込みLinux

第5回BusyBoxの活用[前編]

BusyBoxとは

LinuxのシステムではLinux本体であるカーネルがコンパクトであってもカーネル単体では動作をせず、多くのUNIXコマンド群を集約した大規模なLinuxディストリビューションでないとLinuxを利用することができません。PCの場合はハードディスク容量が潤沢であるので、Linuxディストリビューションが大規模であってもあまり問題が発生しません。

PCでは、贅肉満載の巨艦級のWindows VistaやWindows 7が無駄なメモリ容量とハードディスク容量を要求するため、それに対応するためのハードウェア資源がPCに要求されています。このため、Linuxディストリビューションが大規模であっても、相対的に贅肉満載の巨艦級のWindows VistaやWindows 7に比較すればたいした問題ではないのです。

しかし、Windowsを前提にしない組込みボードコンピュータでは,必ずしも潤沢なハードウェア資源があるとは限りません。むしろ組込みボードコンピュータでは資源が乏しいケースが多いので、そのような場合、大規模なLinuxディストリビューションの導入には問題があります。資源が乏しい組込みボードコンピュータでも多くのUNIXコマンド群を利用でき、かつ、大きな資源を要求しないのがBusyBoxです。

オリジナルのUNIXコマンドは1つのコマンドが1つの実行ファイルとなっていて、1つのコマンドの実行ファイルはさほど大きくなくとも、塵も積もれば山となるので、トータルとして大きな容量となってしまいます。BusyBoxでは複数のコマンドを1つの実行ファイルに納めることにより、ファイル容量を節約しています。

それだけでなく、オリジナルのUNIXコマンドは多くオプションがありますが、あまり活用されないオプションも多いので、BusyBoxではオリジナルのUNIXコマンドは多くオプションのうちよく利用されているもののみをオリジナルのUNIXコマンドのサブセットとして実装しています。そのことにより、さらにファイル容量を節約し、BusyBox-1.17ではデフォルト設定では約2Mバイト前後にファイル容量を節約することができます。

RAMベースの運用

Linuxファイルシステムを格納するメディアとしては、ハードディスクやメモリカード、RAMメモリなどがあります。PCでよく利用されるハードディスクの容量は1Tバイトを超えるものが珍しくなくなりました。組込みボードコンピュータでよく利用されるメモリカードでも4~32Gバイトの大きなディスク容量を使うことができます。ただし,組込みボードコンピュータでT-SH7706LSRのようにメモリカードが使える場合であっても、運用によってはRAMベースでファイルシステムを構築することもあります。

RAMの容量はハードディスクやメモリカードに比べて大きくはないので、RAMベースでファイルシステムを構築する場合はファイル群の内容を精選しないといけません。一般的なBusyboxの使いかたは、ファイルシステムのメインをBusyBoxで構築してからBusyBoxを補完する若干のコマンドとユーザ独自のアプリケーションプログラムを追加するというかたちです。

ここで問題となるのは、BusyBoxを補完する若干のコマンドとユーザ独自のアプリケーションプログラムのファイル本体のファイル容量が小さくとも、それに必要な共有ライブラリのファイル容量が大きくなるということです。BusyBoxのデフォルト設定では共有ライブラリを必要としますが、設定によっては共有ライブラリを不要にすることができます。

以前のBusyBoxではファイルシステムに関連するコマンドが欠落していたので、BusyBoxを補完する若干のコマンドを必要としていました、BusyBox-1.17では特殊な用途は別として、一般的な用途ではBusyBoxのみでLinuxファイルシステムを構築できるようになりました。

ただし、ユーザ独自のアプリケーションプログラムはBusyBoxでサポートされることはありえないので、BusyBoxの進化のみではファイル容量が大きな共有ライブラリを不要にすることはできません。幸いなことにBusyBoxはユーザ独自のアプリケーションプログラムを追加可能なしくみが備えられていますので、BusyBoxにユーザ独自のアプリケーションプログラムを組込むことにより、ファイル容量が大きな共有ライブラリを不要にすることができ、ごく小さなRAM容量でRAMベースのファイルシステムを実現することができます。

inside BusyBox

組込み概要

BusyBoxソースファイルのトップフォルダには、BusyBoxコマンド群をカテゴリー分類されたフォルダがあります。BusyBoxのコマンド群の個別のソースファイルはカテゴリー分類されたフォルダの下に存在します。BusyBoxではカテゴリー分類されたフォルダの下に存在するコマンド群の個別のソースファイルを統制下に置いていますが、その統制系統は単系統ではなく、以下に挙げるような主に4つの統制系統があります。

  • コンパイル構成設定系統
  • コンパイル実行系統
  • リンク系統
  • ヘルプテキスト系統

BusyBoxに新たにユーザ独自のアプリケーションプログラムを組込むにはこれら4つの統制系統に登録しなければなりません。

ユーザ独自のアプリケーションプログラムを組込むといってもBusyBoxで実際に統制を実行するファイルに対して直接に登録をするわけではありません。基本的にBusyBoxで実際に統制を実行するファイルは書き換えや更新をしてはいけないようになっています。BusyBoxに新たにユーザ独自のアプリケーションプログラムを組込むには、間接的に統制系統に登録しなければなりません。

コンパイル構成設定系統

BusyBoxはLinuxカーネルに準拠したかたちでLinuxカーネル再構築の設定に相当するコンパイル構成設定ができ、その構成設定によってどのコマンドや機能を組込むか、外すかを決めます。

トップフォルダにあるConfig.inというファイルに構成設定のメニューを記述します。ただし、BusyBoxのコマンド群の個別のソースファイルはカテゴリー分類されたフォルダのなかにあるコマンドの構成設定は、フォルダ内の構成設定のメニューに任されていますので、トップフォルダにあるConfig.inではカテゴリー分類されたフォルダ内にあるConfig.inを指定するようになっていますリスト1⁠。

リスト1
〈前略〉
comment "Applets"

source archival/Config.in
source coreutils/Config.in
source console-tools/Config.in
source debianutils/Config.in
source editors/Config.in
source findutils/Config.in
source init/Config.in
source loginutils/Config.in
source e2fsprogs/Config.in
source modutils/Config.in
source util-linux/Config.in
source miscutils/Config.in
source networking/Config.in
source printutils/Config.in
source mailutils/Config.in
source procps/Config.in
source runit/Config.in
source selinux/Config.in
source shell/Config.in
source sysklogd/Config.in

コンパイル構成設定のメニューはカテゴリー分類されたフォルダ内で構成設定のメニューを記述します。

実際にコンパイル構成設定メニューを決定するファイルはカテゴリー分類されたフォルダ内の Config.in となりますが、このファイルは書き換えや更新が禁止されており、Config.src という別のファイルにカテゴリー分類されたフォルダ内コンパイル構成設定メニューを記述し、Config.in は自動生成させるようにします。

コンパイル実行系統

BusyBoxでのコンパイル実行はトップフォルダにあるMakefileというファイルにコンパイル実行内容を記述します。ただし、BusyBoxのコマンド群の個別のソースファイルはカテゴリー分類されたフォルダのなかにあるコンパイル実行内容は、フォルダ内のコンパイル実行内容に任されていますので、トップフォルダにあるMakefileではカテゴリー分類されたフォルダを指定するようになっていますリスト2⁠。

リスト2
〈前略〉

# Objects we will link into busybox / subdirs we need to visit
core-y		:= \
		applets/ \

libs-y		:= \
		archival/ \
		archival/libunarchive/ \
		console-tools/ \
		coreutils/ \
		coreutils/libcoreutils/ \
		debianutils/ \
		e2fsprogs/ \
		editors/ \
		findutils/ \
		init/ \
		libbb/ \
		libpwdgrp/ \
		loginutils/ \
		mailutils/ \
		miscutils/ \
		modutils/ \
		networking/ \
		networking/libiproute/ \
		networking/udhcp/ \
		printutils/ \
		procps/ \
		runit/ \
		selinux/ \
		shell/ \
		sysklogd/ \
		util-linux/ \
		util-linux/volume_id/ \

endif # KBUILD_EXTMOD

〈後略〉

コンパイル実行内容は、カテゴリー分類されたフォルダ内ではKbuildというファイルの内容に従ってコンパイルを実行しますが、このファイルは書き換えや更新が禁止されており、Kbuild.srcという別のファイルにカテゴリー分類されたフォルダ内コンパイル実行内容を記述し、Kbuild は自動生成させるようにします。

リンク系統とヘルプテキスト系統

コンパイル構成設定とコンパイル実行のみではBusyBox本体に個別のコマンドの実行コードがリンクされるわけではありません。個別のコマンドの実行コードをBusyBox本体にリンクさせるには、BusyBoxソースファイル中の includeフォルダ内にあるapplets.src.hというファイルにBusyBox本体にリンクさせるための個別のコマンドの実行コードの内容を登録します。

このapplets.src.hというファイル自体がリンク動作に直接にかかわることはなく、このファイルをもとにいくつかのリンク動作に直接にかかわるファイルを自動生成させなければなりません。ただ、リンク系統のみの登録ではコンパイルエラーが発生し、リンク系統と併せてヘルプテキスト系統も登録しなければいけません。

個別のコマンドのヘルプテキストは、BusyBoxソースファイル中のincludeフォルダ内にあるusage.src.hというファイルに個別のコマンドのヘルプテキスト内容を登録します。このusage.src.hというファイル自体がリンク動作に直接にかかわることはなく、このファイルをもとにusage.hというヘルプテキストの実体であるファイルを自動生成させなければなりません。

次回はBusyBoxを使った独自アプリケーション追加の方法について解説します。

おすすめ記事

記事・ニュース一覧