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

第4回RAMベースのコンパクトなLinuxルートファイルシステム

RAMベースLinux

ルートファイルシステム

T-SH7706LSRでの標準的なLinuxシステムは、メモリカードをルートファイルシステムにして稼働させる形態となっています。

一般的なPC-Linuxではルートファイルシステムはハードディスクに置くことが多いので、ハードディスクの内容をT-SH7706LSRではメモリカードに置くようなイメージとなっています。T-SH7706LSRになってからはメモリカードとしてSDカードだけでなくSDHCカードもサポートされたので、T-SH7706LSRでも大規模なルートファイルシステムを構築することができます。

SDHCの容量についての制限はないですが、現状では32GバイトのSDHCカードについてT-SH7706LSRにおいて動作確認済みとなっています。それとは反対方向にT-SH7706LSRではルートファイルシステムとしてメモリカードではなく、ボードオンボードメモリ上に小さなルートファイルシステムに置いて、メモリカードを完全にフリーにした状態でLinuxシステムを起動し稼働させることもできます。

RAMベースでLinuxシステムを構築する場合、オンボードメモリの容量はメモリカードにくらべて少ないので、ルートファイルシステムにおけるファイルサイズの総量をできるだけ削減するようにしなければなりません。また、起動するたびにRAM上にルートファイルシステムを展開するので、ファイルシステムそのものは内容を更新可能ですが、RAMは揮発性メモリのため、次回起動時にはその更新内容は失われることに注意しなければいけません。

逆にこのことはRAMベースでLinuxシステムが構築されている場合は、UNIX系システムのウィークポイントである突然の電源断によるファイルシステムの破壊を気にしなくてもよくなります。もともとルートファイルは揮発性RAMの上に構築されているので、いきなり電源を落としてもファイルシステム破壊が次回起動時に持ち越されないので、突然の電源断が当たり前の組込みの世界では相性がいいと思います。

Linuxカーネルの対応

RAM上にファイルシステムを構築する場合は、Linuxカーネルで物理メモリに対応したブロックデバイスに対応する必要がありますが、T-SH7706LSR用で標準に公開されているLinuxカーネルでは、MTD(Memory Technology Device)といわれる物理メモリに対応したブロックデバイスが有効になっています。

MTDはメモリデバイスとしてオンボードメモリ、PCMCIAデバイス、CFI(Common Flash Interface)対応フラッシュメモリ、コンパクトフラッシュなどが対象となっていますが、T-SH7706LSR用で標準に公開されているLinuxカーネルでは、メモリデバイスのうちオンボードメモリが有効になっています。他のメモリデバイスもLinuxカーネル再構築を行うことにより有効にすることができます。

T-SH7706LSR用で標準に公開されているLinuxカーネルでは、オンボードメモリの利用に関する柔軟性を持たせるために、具体的なオンボードメモリの場所やサイズを指定する情報は一切持っていません。Linuxブート時に指定するカーネルパラメータで、MTDの具体的なメモリアドレスとメモリサイズの値を指定します。

RAM上にファイルシステムを構築しない場合はMTDは不要なので、LinuxカーネルでMTDが有効であってもカーネルパラメータでメモリアドレスとメモリサイズの値を指定しなけば実際にもMTDが確保されないのでその分だけLinuxカーネル本体でメモリを有効利用することができます。

ブートローダ

RAMベースLinuxを実際に実現させるものはLinuxカーネルでなく、Linuxカーネルを起動させるブートローダとなります。

T-SH7706LSRで標準で公開されてブートローダでは何もオプションを指定しないとメモリカードをルートファイルシステムとして起動しますが、ブートローダのオプション指定により、メモリカード上にあるRAMディスクイメージのファイルをそのままオンボードメモリ上に展開します。Linuxブート時に指定するカーネルパラメータの設定もブートローダで行うので、MTDにおけるメモリアドレスとメモリサイズの値の設定とルートデバイスの指定をカーネルパラメータに設定をするのもブートローダの役割となります。

これらもT-SH7706LSRで標準で公開されてブートローダでオプション指定により行います。また、ブートローダに関してはソースコードがすべて公開されているので、そのソースコードを参考にネットワーク経由でルートファイルシステムのイメージやLinuxカーネルをダウンロードして、Linuxを起動することもできます。その場合は完全にメモリカードなしでLinuxを稼働させることができます。

ファイルシステムイメージの作成

概要について

RAMベースでのファイルシステムの作成は、基本的には前回に解説したメモリカード上へのルートファイルシステム構築方法と同じように行います。

前回に解説したメモリカード上へのルートファイルシステムのファイル容量で圧倒的に大きな比重を占めるのが共有ライブラリファイル群となります。したがって、共有ライブラリファイル群を除外するだけで、コンパクトでRAMベースに収まるようなファイルシステムになります。共有ライブラリファイル群が存在しないとBusyBoxを含むアプリケーションプログラムが動作をしなくなり、ファイルシステムとして機能をすることができません。幸いなことに、BusyBoxはコンパイルメニューで共有ライブラリファイル群が不要になるオプションがあるので、そうすれば共有ライブラリファイル群が不要となります。

昔のBusyBoxは機能が完全に揃っておらず、追加のコマンド等が必要になっていましたが、2010年9月現在のBusyBoxはそれだけで標準的なサーバシステムが構築できるまでに完成度が上がっています。ユーザ独自のプログラムが必要な場合は、BusyBoxに追加することもできるので、そうすれば、ルートファイルシステムのファイル容量で圧倒的に大きな比重を占める共有ライブラリファイル群は不要となります。

新規インストール

まず、標準で公開されているRAMベースでのファイルシステムイメージであるrootfs.imgをダウンロードします。今回は新規にインストールするので、以下のようにPC上でフォーマットをします。

通常、ファイルシステムの対象はブロックデバイスですが、今回は単なるファイルなので、その場合は Proceed anyway? と尋ねてくるので、y と回答します。

# mkfs -t ext2 rootfs.img
mke2fs 1.41.4 (27-Jan-2009)
rootfs.img is not a block special device.

Proceed anyway? (y,n) y

Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
2048 inodes, 8192 blocks
409 blocks (4.99%) reserved for the super user
First data block=1
Maximum filesystem blocks=8388608
1 block group
8192 blocks per group, 8192 fragments per group
2048 inodes per group

Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 37 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
#

ファイルシステムのマウントも通常はブロックデバイスが対象なので、原則としてブロックデバイス以外の単なるファイルではマウントを受け付けてくれません。ただし、オプションとしてループデバイス指定をすると単なるファイルでもマウントを受け付けてくれるので、以下のようにマウントします。

# mount -o loop rootfs.img /mnt

ファイルシステムに作成するフォルダの内容は、前回に解説したメモリカード上の内容と同じように作成します。

dev と etc 以下の内容も前回に解説したメモリカード上の内容と同じように作成しますが、lib のみは内容を空にします。

ただし、/etc/fstabの内容から以下の行は削除をします。

 /dev/shmmc1  /boot   vfat   defaults         0 0

BusyBoxのインストール

共有ライブラリファイル群のファイル容量に比較すればBusyBoxのファイル容量は相対的に少ないので、BusyBoxのオプションについては特に制限をしなくても問題はないです。基本的には前回に解説したBusyBoxのコンパイルオプション指定内容と同じ内容で問題ないですが、今回は共有ライブラリファイル群が存在しないので、共有ライブラリファイル群なしでBusyBoxが動作するようにしなければなりません。

図1のように、BusyBoxのコンパイルオプションメニューで「Busybox Settings」を選択します。

図1 BusyBoxのコンパイルオプションメニュー
図1 BusyBoxのコンパイルオプションメニュー

さらに図2のように「Build Options」を選択します。

図2 ⁠Build Options」を選択
図2 「Build Options」を選択

図3のメニューで「Build BusyBox as a static binary (no shared libs)」の項目をチェックします。

図3 ⁠Build BusyBox as a static binary」をチェック
図3 「Build BusyBox as a static binary」をチェック

このようにコンパイルオプションを指定したら、BusyBoxをコンパイル、インストールしてファイルシステムへインストール内容をコピーします。

最新のカーネルパッチ

概要

2010年9月時点でT-SH7706LSR向けのカーネルパッチレベル5を新規に公開しました。カーネルパッチレベル5では、RAMベースのLinuxシステムでの使い勝手をより向上させるために、T-SH7706LSR付属メモリカードのデバイスドライバを新規開発をしました。

従来は、T-SH7706LSR付属メモリカードのデバイスドライバはハードディスクベースの固定ドライブなので、せっかくメモリカードがフリーになっても取り外し可能なデータディスクとして活用できませんでした。T-SH7706LSR向けのカーネルパッチレベル5ではT-SH7706LSR付属メモリカードのデバイスドライバはリムーバブルディスクとして新規開発したので、メモリカードがフリーになると取り外し可能なデータディスクとして活用することができるようにしました。

メモリカード取り替えについて

T-SH7706LSR向けのカーネルパッチレベル5以降においては、RAMベースのLinuxを起動させた場合、メモリカードは取り外し可能となり、実際に取り外すと「shmmc: Media(MMC/SD) is removed.」というカーネルメッセージがダンプされます。

取り外しの注意点としては、取り外し時点でメモリカードへのマウントが全て解除されていなければなりません。メモリカードが取り外された状態で別のメモリカードを差し込んでも、その時点では特にLinuxカーネルは何もアクションはしません。

別のメモリカードを差し込まれた状態でメモリカードをマウントをすると、その時点でメモリカードの初期化を行ってから、メモリカード上のファイルシステムをマウントします。

次回は

次回は、BusyBoxにユーザ独自の自作プログラムを組込む方法について解説します。

おすすめ記事

記事・ニュース一覧