連載
» 2011年03月10日 14時28分 公開

tarファイルシステムをAndroidに組み込む!!作りながら理解するファイルシステムの仕組み(11)(2/2 ページ)

[森 崇、宮下 尚邦、上田 眞司、野村 昌平(株式会社 永和システムマネジメント),@IT MONOist]
前のページへ 1|2       

tarファイルシステムをAndroidに組み込む

 それでは、tarファイルシステムをAndroidに組み込んでみましょう。

 実装済みのソースは、以下にあります。

実装済みのソース:
https://github.com/esminc/tarfs
/tree/master/Android

 ソースの種類は「コマンド」と「カーネル」があり、これらをAndroid用にコンパイルし、組み込みボードにROM焼きすればよいわけです。コンパイルするには、いくつかの手順が必要となりますので以降で解説していきます。

 そして、最後に動作確認を兼ねたデモとして、組み込みボード上で動画ファイルが入っているtarファイルをマウントし、Androidのエクスプローラでその動画ファイルを再生してみます。それでは始めましょう!

tarfsコマンドのコンパイル

 連載第5回「tarファイルに魔法をかけてみよう! その2」で説明したtarfsコマンドを、Androidで使用するためには、Androidプラットフォーム上でコンパイルする必要があります。

 tarfsのような外部コマンドソースは、「platform/external」配下にディレクトリを作成し配置します。今回は「tarfs」ディレクトリを作成しました(platform/external/tarfs)。

 そして、Androidプラットフォームを全ビルドすれば、自動的にtarfsコマンド群がインストールされたファイルシステムイメージを作成できます。これをそのまま組み込みボードにROM焼きすればよいわけです。

tarfsカーネルのコンパイル

 Linuxカーネルソース(Android)では、「fs」ディレクトリ直下に、それぞれのファイルシステムモジュールを配置するようになっていますので、tarfsも同様に配置する必要があります。具体的な作業の流れは以下のとおりです。

  1. tarfsカーネルソースの配置
  2. カーネルコンフィグレーションの設定ファイルの修正
  3. カーネルMakefileの修正

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)。

だって、ファイルシステム破損はほかのどんなバグよりも僕をナーバスにさせるからね。


 ファイルシステムのバグは、大切なユーザーデータの破壊につながります。もしあなたの大切なデータが突然消えてしまったら目も当てられませんよね。「上善は水の如(ごと)し」――ファイルシステムはそんな存在だと筆者は考えます。

 ファイルシステムを自ら作る必要性に迫られる機会はあまりないと思いますが、その仕組みを、オリジナルのファイルシステムを自ら作って理解することは、大変有意義だと思います。本記事が読者の方の理解の手助けになることができれば幸いです。長期間ご愛読いただきありがとうございました。(連載完)


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.