Armadilloのデフォルト設定では、ルートファイルシステムはramfsを使用していますので、ファイル等へおこなった変更は、リブートすると全て消えてしまいます。[1]
これは、組み込み機器としては、起動時の状態が変わらないという点で利点となるものですが、やはり、変更した内容をリブートしても保持しておいてほしいという状況もあるかと思います。
そこで、ルートファイルシステムを、フラッシュメモリ用のファイルシステムであるjffs2[2]で作成し、読み書き可能なルートファイルシステムを構築する方法を紹介します。
おおまかな手順は下記のようになります。
- NAND用jffs2に関するオプションを外したカーネルのイメージを作成する。
- fstabを編集し、ルートファイルシステムにmtdblock2を使用するように指定したユーザランドのイメージを作成する。
- 2.で作成したイメージを、jffs2でフォーマットしたユーザランド領域に書き込む。
- hermitのKernel Command Lineを変更し、ブートする。
なお、本 Howto では、以下の環境を想定しています。
ご利用の環境に合わせて適宜読みかえてください。
- 対象製品:Armadillo-220
- atmark-dist: v20080617
- linux-kernel:linux-2.6.12.3-a9-15
1. NAND用jffs2に関するオプションを外したカーネルのイメージを作成する。
今回使用するlinux-kernelでは、NORフラッシュメモリ用とNANDフラッシュメモリ用のjffs2ファイルシステムを共存させることができません[3]。
今回は、NORフラッシュメモリをルートファイルシステムに使用するので、NAND用のオプションを外します。
make menuconfigを使用した場合は、下記のようにkernel configurationで、「JFFS2 support for NAND flash」のチェックを外してください。
File systems ---> Miscellaneous filesystems ---> <*> Journalling Flash File System v2 (JFFS2) support (0) JFFS2 debugging verbosity (0 = quiet, 2 = noisy) [ ] JFFS2 support for NAND flash <-チェックを外す [ ] JFFS2 support for ECC'd NOR flash (EXPERIMENTAL) [ ] Advanced compression options for JFFS2
2. fstabを編集し、ルートファイルシステムにmtdblock2を使用するように指定したユーザランドのイメージを作成する。
次に、ユーザランドの設定をおこないます。
必ず設定しなければならないのは、/etc/fstabのルートファイルシステムに使用するデバイスノードに関する設定のみです。
下記のように、ユーザランド領域(mtdblock2)をルートにし、そのファイルシステムにはjffs2を使用するように設定します。
/dev/mtdblock2 / jffs2 defaults 0 1 #/dev/hda1 / ext2 defaults 0 1 #/dev/hda2 none swap sw 0 0 proc /proc proc defaults 0 0 usbfs /proc/bus/usb usbfs defaults 0 0 sysfs /sys sysfs defaults 0 0
また、/etc/init.d/rcの先頭に記述してあるfsckに関する処理も、現在のatmark-distに含まれているfsckではjffs2ファイルシステムに対応していないため、削除します。
以上の設定をおこなったあと、通常どおりmakeし、カーネルとユーザランドのイメージを作成します。
3. 2.で作成したイメージを、jffs2でフォーマットしたユーザランド領域に書き込む。
作成したユーザランドのイメージをArmadillo自身を使用して、フラッシュメモリに書き込みます。
まず、対象のArmadilloを、recover imageなどで起動します。
次に、NORフラッシュメモリのユーザランド領域をjffs2でフォーマットします。
flash_eraseall -j /dev/mtd2
2.で作成したイメージをArmadilloにコピーします。
今回はwgetでサーバ(IP address: 172.16.23.1)からダウンロードしてきましたが、ftpで転送しても、USBメモリで持ってくるなどでも構いません。
mount -t ramfs ramfs /home/ftp/pub/ cd /home/ftp/pub/ wget http://172.16.23.1/img/romfs.img
次に、2.で作成したイメージとフラッシュメモリのユーザランド領域をマウントし、イメージの内容を全てフラッシュメモリにコピーします。
mkdir /mnt/romfs /mnt/nor mount -t ext2 -o loop /home/ftp/pub/romfs.img /mnt/romfs/ mount -t jffs2 /dev/mtdblock2 /mnt/nor/ cp -a /mnt/romfs/* /mnt/nor/
アンマウントし、リブートします。
umount /mnt/romfs umount /mnt/nor
4. hermitのKernel Command Lineを変更し、ブートする。
最後に、hermitのsetenvコマンドを使用して、Kernel Command Lineを指定し、起動します。
hermit> setenv noinitrd root=/dev/mtdblock2 rootfstype=jffs2 hermit> b
jffs2を使用するときの注意点
読み書き可能で、ジャーナリング機能を持つjffs2は大変便利なように思いますが、使用するにあたっては、いくつか注意点があります。
アクセス時間: jffs2は、マウント時に全てのノードをスキャンします。そのため、ファイル数が多くなるにつれ、マウントに必要な時間が長くなっていきます。また、ファイルを頻繁に変更した場合、折角のジャーナリング機能が災いして、読み込み時間が極端に長くなるといった現象も報告されています[4]。
フラッシュメモリの寿命: jffs2はウェアレベリング機能を持っているので多少は軽減されるとはいえ、フラッシュメモリを使用する以上、書き込み回数には上限があります。特にログファイルなどの用途のために、毎秒syncするといった運用をしてしまうと、あっというまに上限に達してしまいます。
関連ページ
下記の関連ページもご参照ください。
NANDフラッシュメモリに保存したルートファイルシステムで起動する
[1] flatfsdでconfig領域に書き込んだものを除いて
[2] JFFS2: The Journalling Flash File System, version 2
[3] そのため、ユーザランド領域をjffs2にした場合、外部NANDフラッシュモジュールは使用できません。