それでは、tarファイルシステムをAndroidに組み込んでみましょう。
実装済みのソースは、以下にあります。
ソースの種類は「コマンド」と「カーネル」があり、これらをAndroid用にコンパイルし、組み込みボードにROM焼きすればよいわけです。コンパイルするには、いくつかの手順が必要となりますので以降で解説していきます。
そして、最後に動作確認を兼ねたデモとして、組み込みボード上で動画ファイルが入っているtarファイルをマウントし、Androidのエクスプローラでその動画ファイルを再生してみます。それでは始めましょう!
連載第5回「tarファイルに魔法をかけてみよう! その2」で説明したtarfsコマンドを、Androidで使用するためには、Androidプラットフォーム上でコンパイルする必要があります。
tarfsのような外部コマンドソースは、「platform/external」配下にディレクトリを作成し配置します。今回は「tarfs」ディレクトリを作成しました(platform/external/tarfs)。
そして、Androidプラットフォームを全ビルドすれば、自動的にtarfsコマンド群がインストールされたファイルシステムイメージを作成できます。これをそのまま組み込みボードにROM焼きすればよいわけです。
Linuxカーネルソース(Android)では、「fs」ディレクトリ直下に、それぞれのファイルシステムモジュールを配置するようになっていますので、tarfsも同様に配置する必要があります。具体的な作業の流れは以下のとおりです。
1.tarfsカーネルソースの配置
tarfsのカーネルソースは、Linuxカーネルソースのファイルシステム専用のディレクトリ(fs)配下に「tarfs」ディレクトリ(「fs/tarfs」)を作成し、配置します。
2.カーネルコンフィグレーションの設定ファイルの修正
Linuxカーネルの「fs」ディレクトリ直下にある「Kconfig」を以下のように修正し、tarfsのコンフィグができるようにします。
config FS_MBCACHE # Meta block cache for Extended Attributes (ext2/ext3/ext4) tristate default y if EXT2_FS=y && EXT2_FS_XATTR default y if EXT3_FS=y && EXT3_FS_XATTR default y if EXT4_FS=y && EXT4_FS_XATTR default m if EXT2_FS_XATTR || EXT3_FS_XATTR || EXT4_FS_XATTR source "fs/reiserfs/Kconfig" source "fs/jfs/Kconfig" source "fs/tarfs/Kconfig" ←★★ここにKconfigを追加★★
3.カーネルMakefileの修正
Linuxカーネルの「fs」ディレクトリ直下にある「Makefile」を以下のように修正し、tarfsがコンパイル対象になるようにします。
obj-$(CONFIG_BTRFS_FS) += btrfs/ obj-$(CONFIG_GFS2_FS) += gfs2/ obj-$(CONFIG_TARFS_FS) += tarfs/ ←★★ここにtarfsディレクトリを追加★★
これでコンパイルの準備ができました。
後は、カーネルのコンフィグレーションでtarfsを選択し、コンパイルすればtarfsが組み込まれたカーネルイメージが作成されます。こちらも同様に組み込みボードにROM焼きすれば、tarfsインストールの完了です。
この段階で、組み込みボードの空き容量は57Mbytes程度しかありません。そこに、動画ファイル(2個)が入ったtarファイル(約47Mbytes)を転送すると、空き容量は10Mbytes程度となってしまいます。これでは、tarファイルを展開できるだけの余裕はありません……。
通常、このままだとtarファイルに入っている動画を見ることができませんが、こうした状況でこそ、真の力を発揮するのがtarファイルシステムなのです!
それでは、組み込みボードを立ち上げて動作確認をしていきましょう。まずは、tarファイルの転送からです。
(1)tarファイルをAndroidに転送する
tarファイルを組み込みボードに転送するために、以下のように「adb」コマンドでpushします。
$ ls -lh porting_android.tar -rw-r--r-- 1 tmori tmori 47M 2011-02-05 19:40 porting_android.tar $ ./adb push porting_android.tar data/ 1364 KB/s (49059840 bytes in 35.118s)
次に、「adb shell」でtarファイルが組み込みボード上に転送されているかどうかを確認します。
# ls -l -h /data/porting_android.tar -rw-rw-rw- 1 0 0 46.8M Feb 5 2011 /data/porting_android.tar
tarファイルが転送されていることを確認できたら、ここでファイルシステムの使用状況を確認してみましょう。
# df -h Filesystem Size Used Available Use% Mounted on /dev/root 192.0M 182.2M 9.8M 95% /
空容量は10Mbytes弱しかありません。tarファイルのサイズは47Mbytes近くありますので、展開する余力はもはやありません。
これで、tarファイルシステムが大活躍する状況は整いました!
(2)tarファイルをマウントする
まず、tarファイルに対して「mkfs」コマンドを実行します。
# mkfs.tarfs /data/porting_android.tar # ls -l -h /data/porting_android.tar -rw-rw-rw- 1 0 0 47.0M Feb 5 18:53 /data/porting_android.tar
メタデータを作成しても、それほどサイズは大きくなりません(いい感じです)。
次に、ループバックデバイスファイルを以下のように作成します。
# mknod /dev/loop0 b 7 0 # ls -l /dev/loop0 brw-rw-rw- 1 0 0 7, 0 Feb 5 18:56 /dev/loop0
そして、ループバックデバイスとtarファイルを関連付けます。
# losetup /dev/loop0 /data/porting_android.tar # losetup /dev/loop0 /dev/loop0: 0 /data/porting_android.tar
これで準備は完了です。早速マウントしてみましょう。マウントポイントは、「/mnt」です。
# tarfsmount /dev/loop0 /data/porting_android.tar /mnt
(3)Androidで動画を見てみよう!
Androidのエクスプローラを開くと、「mnt」フォルダが見えますのでこれをタップします。
すると、「porting_an…」というフォルダがあります(何となくtarファイルをマウントできたような気がします)。ドキドキしながら、このフォルダをタップします。
おぉ、動画ファイルが見えました! これを正しく再生できれば、tarファイルシステムが正しくデータを読み込むことができたことになります。早速やってみましょう。
ちゃんと動画が再生されました!! 感動の瞬間です(涙)。
以上、Android搭載の組み込みボードにtarファイルシステムを組み込むことができました。tarfs自体は、あまり実用性はないかもしれませんが、tarファイルを展開せずに中のデータを参照できる点は非常に魅力的ではないでしょうか? 特に、組み込み機器のようにメモリ量やフラッシュメモリサイズが制限されているような環境下では、今回のように余分な領域を使わずに手軽にファイルを見ることができるので便利だと思います。
本稿を持ちまして、本連載は最終回となります。本連載では、多少脱線しながらもファイルシステムの仕組み、Linuxカーネルのファイルシステムの構造、そして、オリジナルのファイルシステムの作り方について紹介してきました。普段当たり前のように使っているため、なかなかファイルシステムのありがたみを感じることはできないかもしれません。しかし、あって当たり前のファイルシステムの役割は、非常に重要なものなのです。
以前、Linusは「ext4」のバグ修正に当たっていたとき、こんな言葉を残していました(注9)。
だって、ファイルシステム破損はほかのどんなバグよりも僕をナーバスにさせるからね。
ファイルシステムのバグは、大切なユーザーデータの破壊につながります。もしあなたの大切なデータが突然消えてしまったら目も当てられませんよね。「上善は水の如(ごと)し」――ファイルシステムはそんな存在だと筆者は考えます。
ファイルシステムを自ら作る必要性に迫られる機会はあまりないと思いますが、その仕組みを、オリジナルのファイルシステムを自ら作って理解することは、大変有意義だと思います。本記事が読者の方の理解の手助けになることができれば幸いです。長期間ご愛読いただきありがとうございました。(連載完)
Copyright © ITmedia, Inc. All Rights Reserved.