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

第3回Linuxルートファイルシステムを構築する

ファイルシステム概要

T-SH7706LSRでのLinuxインストールは第1回で解説しましたのでそれがベースとなりますが、第1回ではルートファイルシステムとなる第2パーティションにはダウンロードしたrootfs.tar.gzをそのまま展開しました。今回はダウンロードしたrootfs.tar.gzをそのまま展開せず、ルートファイルシステムを自分で構築する方法を解説します。

ダウンロードしたrootfs.tar.gzでもひととおりは使えるようにはなっていますが、組込みLinuxが利用される用途や環境は千差万別なので、自前でルートファイルシステムを構築できるようになれば、組込みLinuxが利用される用途や環境に対してより最適なLinuxシステムに仕上げることができます。

ルートファイルシステムはいくつかの要素によって構成されていますが、一番大きな比重を占めているのがコマンドファイル群です。コマンドファイルはLinuxシステムが起動した後にシェルによるコマンドプロンプトによってコマンド操作するので、基本的にはシェルによるコマンドプロンプトで使いたいコマンドファイルだけ用意すればいいわけですが、ユーザが使いたいコマンドだけ用意すればいいわけでなく、システム初期化や稼働に必要なコマンドファイルも用意しなければなりません。

Linuxシステム構築に慣れていれば問題ないわけですが、慣れるまではシステム初期化や稼働に必要なコマンドファイルがイメージしにくいと思います。とりあえず、慣れるまでは最低限のシステム初期化や稼働に必要なコマンドファイルをおまじないのように用意してから、一般コマンドについては使いたいものだけ用意するということでいいと思います。

コマンドファイルの場合、静的リンクでコンパイルした場合は不要ですが、動的リンクでコマンドファイルをコンパイルした場合は、別途ライブラリファイルがファイルシステム上に必要になってきます。普通に自作コマンドをコンパイルした場合のデフォルトは動的リンクとなります。ルートファイルシステムの要素でコマンドファイルの他には各種スクリプト群とデバイスファイル群となります。

各種スクリプト群はUNIXの慣習で/etc以下に用意することになっています。一般的なPC Linuxの場合はシステムが肥大化しているので/etc以下の各種スクリプト群は膨大なものとなっており、とても簡単に把握できるものではありませんが、T-SH7706LSRではハードウェア自体がシンプルなので、必要な各種スクリプトはたいした数ではありません。

デバイスファイル群は、これもUNIXの慣習で/dev以下に用意することになっています。デバイスファイル群に関しては基本的にPCLinuxの/dev以下にあるものをそのまま持ってきても構いませんが、あきらかにT-SH7706LSRにないハードウェアに対するデバイスファイルは持ってきても意味はないです。ただ、一部にはSuperHアーキテクチャ特有のデバイスファイルもあるので、それは独自に用意をする必要があります。

コマンドファイル群について

Linuxディストリビューションの構成は純粋にLinuxの部分は膨大なディストリビューションのなかのほんのわずかなLinuxカーネルという核のみであり、Linuxディストリビューションの大半の部分はGNUコマンドファイル群なので、実態はDebianの名称のようにGNU/Linuxといっていいでしょう。

T-SH7706LSRでもGNUコマンドファイル群によってルートファイルシステムを構築することができます。GNUコマンドファイル群のもととなるソースコードはGNUのFTPサイトで入手できますので、それらの中から必要なものを1つずつソースコードからコンパイルしていく積み重ねをしていけばルートファイルシステムを構築することができます。

また、FedoraCore6ベースのsh3向けrpmバイナリパッケージもSH-Linuxのサイトで公開されているので、ここからコンパイル済みのGNUコマンドファイル群を得ることができます。

どちらにしろ、GNUコマンドファイル群には必要なものはほとんど揃ってはいますが、各コマンドごとにそれぞれ分かれているので、それらのソースコードを1つずつコンパイルしていくのは一苦労です。T-SH7706LSRのようなシンプルな組込みLinux向けには、BusyBoxというシンプルな組込みLinux向けのGNU準拠のコマンドファイル群を1つのバイナリファイルに集約させたものがフリーソフトとして公開されています。

BusyBoxのコンパイルとインストール

BusyBoxの概要と変遷

BusyBoxはGNU準拠のコマンドファイル群を1つのバイナリファイルに集約させたものなので、GNUのようにフルセットの機能はありませんが、GNUコマンドのオプションで主に使われる中核的機能はなるべく採り入れるようにしてあります。

T-SH7706LSRのLinuxシステムではBusyBoxにスクリプトファイルとデバイスファイルを追加するだけでシステム稼働できるようになるので、T-SH7706LSRでのコマンドファイル群はBusyBoxでほぼ十分です。

最初のBusyBoxは基本的なコマンドを集約させたものに限定され、それ以外は他から持ってくるようにしてファイルシステムを構築していきましたが、やがて、BusyBox-1.10あたりに一通りのコマンドも揃ってそれだけでシステムが稼働できるくらいまでに進化しました。その後、一時期はファイルシステム関係のコマンドが脱落しファイルシステム関係のコマンドだけは外部からもってこないといけない事態になっていましたが、現在ではファイルシステム関係のコマンドも完備し、また、ネットワーク関係のデーモンやコマンド群も充実し、BusyBoxだけで各種サーバクライアントシステムを構築できるようになっています。

BusyBoxは下記URLで公開されており、2010年8月時点での最新版はバージョン1.17.1となっています。

BusyBox
URL:http://www.busybox.net/

BusyBoxのコマンド群はGNUコマンド群のサブセットではありますが、完全な互換性はありません。BusyBoxのサイトでBusyBoxのコマンドの機能を参照することができます。

BusyBoxのコンパイル

BusyBoxはPC上でクロスコンパイルをするので、PCの適当なフォルダに以下のようにBusyBoxの最新版を展開し、ソースパッケージ内に入って、BusyBoxのコンパイルオプションメニューを起動します。

 # tar xvjf busybox-1.17.1.tar.bz2
 # cd busybox-1.17.1
 # make menuconfig

BusyBoxは基本的にはデフォルトのコマンド選択オプションでもT-SH7706LSRでも動作をしますので、とりあえずは、そのままのコマンド選択でT-SH7706LSRのルートファイルシステムとする方針とします。基本的にBusyBoxはアーキテクチャ非依存の透過的なシステムなので、アーキテクチャを選びません。

そのコンパイルオプションではPCLinux向けにコンパイルされ、SH3向けでのクロスコンパイルをさせるために図1のように「Busybox Settings 」を選択し、さらに図2のように「 Build Options」を選択します。

図1
図1
図2
図2

クロスコンパイルの設定をするために図3のように「Cross Compiler prefix 」を選択し、図4のようにSH3向けクロスコンパイラのプリフィックスである「sh3-linux-」と指定をしてOKでメニューを抜けます。

図3
図3
図4
図4

ふたたび上のメニューに戻り図5のように「Cross Compiler prefix 」が「sh3-linux-」と指定されていることを確認し、Exitでメニューを抜けます。

図5
図5

BusyBoxではインストール先も指定できるので、もし、インストール先を指定する場合は、図6のように「Installation Options」を選択し、図7「BusyBox installation prefix」でインストール先フォルダを指定します。

図6
図6
図7
図7

デフォルトではソースパッケージ内の _install というフォルダにインストールされるようになっています。トップメニューに戻ってExitで抜けようとすると、図8のような質問があるのでそのままOKとしてBusyBoxのコンパイルオプションメニューを終了させます。

図8
図8

BusyBoxのコンパイルは以下のように行います。

 # make

そうすると、SH3向けクロスコンパイラとBusyBoxの相性の問題と推測されますが、以下の2ヵ所でコンパイルエラーが発生します。

miscutils/ionice.c
networking/libiproute/ipaddress.c

ionice.cは、BusyBoxのコンパイルオプションメニューで「Miscellaneous Utilities 」を選択し、図9のように「ionice」の指定を外します。

図9
図9

libiproute/ipaddress.cは、BusyBoxのコンパイルオプションメニューで「Networking Utilities」を選択し、まず、図10のように「ifupdown」の選択を外してから、同じメニュー内で図11のように「ip」を外します。そうするとコンパイルエラーもなくBusyBoxのコンパイルが終了します。

図10
図10
図11
図11

BusyBoxのインストールは以下のように行います。

 # make install

ルートファイルシステム

ルートファイルシステムの構築

第1回の解説のとおり、まずは、ダウンロードしたルートファイルシステムの内容であるrootfs.tar.gzをそのままSDカードの第2パーティションに展開します。

ただし、今回はコマンドファイル群は自前で用意するので、第2パーティション上の bin sbin usr/bin usr/sbin 以下のファイル群を削除してから、自前でコンパイルしたBusyBoxのインストール内容を第2パーティション上にコピーをします。

そのときにコピーコマンドを使う場合は属性やフォルダをそのままでコピーをするオプションである -a オプションを必ず指定をします。

コマンドファイル以外の内容について

デバイスファイルについてはPCLinuxに準じてmknod コマンドで /dev 以下に作成します。

T-SH7706LSRのシステムではコンソールやRAMディスクを使うのでこれらは最低限用意しておきます。コンソールはシリアルポートを使いますは、IBMPC標準仕様のシリアルポートである8251ベースのものをSH7706で使う場合はPCと同じ名称とメジャー番号でいいです。

日立独自仕様のSH7706内蔵シリアルポートの場合は、名称は ttySCx でメジャー番号は204番、マイナー番号の開始は8番からとなります。T-SH7706LSRで標準に使うシリアルポートは内蔵シリアルポート1番なので、ttySC1となるので、/dev以下ではttySC1に対して consoleやttyxのソフトリンクを設定します。

/lib以下のライブラリに関しては、PCにインストールしたSH3クロスコンパイラのライブラリからそのまま持ってきます。今回の場合は、PCにインストールしたSH3クロスコンパイラのライブラリである /usr/sh3-linux/sh3-linux/lib からそのまま持ってきています。

/etc以下の各種スクリプト群での一番の元締めであるのが、inittabです。各種スクリプト群は基本的にリスト1のinittabの内容に従って動作をしています。

リスト1 /etc/inittab
::sysinit:/etc/rc.d/rc.sysinit
::respawn:/sbin/getty -L ttySC1 115200 vt100
::ctrlaltdel:/bin/reboot
::shutdown:/etc/rc.d/rc0
::shutdown:/bin/umount -a -r
::restart:/sbin/init

sysinitではシステムの初期化スクリプトを指定しています。respawnではログイン時の動作指定、ctrlaltdelでは再起動時の動作指定、shutdownではシステム停止時の終了化スクリプトの指定、restartは再起動時の動作指定をそれぞれ記述しています。

この場合、sysinitでは/etc/rc.d/rc.sysinitを初期化スクリプトとして指定しているので、何か自分のシステム独自の初期化処理をさせたい場合はそのスクリプトにその内容を追加をします。

次回は

次回はRAMベースの小規模ファイルシステム構築について解説します。

おすすめ記事

記事・ニュース一覧