フラッシュメモリストレージへの直接アクセス

Android 端末では MTD サブシステムを経由してフラッシュメモリストレージを利用している。MTD については http://tiki.is.os-omicron.org/tiki.cgi?c=v&p=MTD 参照。

とある実機でフラッシュメモリがどのように区分けされているのか見てみる。

# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00640000 00020000 "boot"
mtd1: 03300000 00020000 "cache"
mtd2: 00640000 00020000 "recovery"
mtd3: 13d20000 00020000 "system"
mtd4: 000a0000 00020000 "misc"
mtd5: 24800000 00020000 "userdata"

name 欄があるのでそれぞれの区画がどのようなものであるかなんとなくわかる。

  • boot がブート時,というか通常時の root FS だろうし
  • recoveryリカバリ時の FS だろうし((後日書くが recovery 領域は一般的なノートパソコンなどの「リカバリイメージ」ではない。LinuxWindows などで CD-ROM からレスキューブートするようなそういうものだ。))
  • system/system ツリーだろうし
  • userdata/data ツリーだろうし
  • cache/cache ツリーだろうし*1

といった感じだ。misc が何かはよくわからない*2 (他機種にはなさそうだ; 参考資料にもあった,順番が違っていたので見落とした)。

erasesize というのはおそらくフラッシュメモリの消去単位だろう。意外に大きいものだな。


フラッシュメモリストレージに直接アクセスするには /dev/mtd/ 以下のデバイスノードを使う。

# ls /dev/mtd/
mtd0 mtd0ro mtd1 mtd1ro mtd2 mtd2ro mtd3 mtd3ro mtd4 mtd4ro mtd5 mtd5ro

cat 等でイメージを吸いだしたりできる。書き込んだりもできる (たぶん)。


さきほどの推測をたしかめるためにどのようにマウントされているのか mount コマンドでみてみる。

# mount
rootfs / rootfs rw,relatime 0 0
tmpfs /dev tmpfs rw,relatime,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
/dev/block/mtdblock3 /system yaffs2 ro,relatime 0 0
/dev/block/mtdblock5 /data yaffs2 rw,nosuid,nodev,relatime 0 0
/dev/block/mtdblock1 /cache yaffs2 rw,nosuid,nodev,relatime 0 0
(以下略)

推測はただしかった。ただし利用しているデバイスノードは /dev/block/mtdblock* のようだ。


/dev/mtd/*/dev/block/mtdblock* の違いを見てみる。

# ls -l /dev/mtd*
crw------- root     root      90,   0 2011-02-28 21:40 mtd0
crw------- root     root      90,   1 2011-02-28 21:40 mtd0ro
crw------- root     root      90,   2 2011-02-28 21:40 mtd1
crw------- root     root      90,   3 2011-02-28 21:40 mtd1ro
(以下略)

# ls -l /dev/block/mtd*
brw------- root     root      31,   0 2011-02-28 21:40 mtdblock0
brw------- root     root      31,   1 2011-02-28 21:40 mtdblock1
(以下略)

名前からあからさまにわかるとはいえ,/dev/mtd/mtd* はキャラクタデバイスであり((*ro なんて名称にするなら w パーミッションも外しておけばいいのにと思うが,デバイスノードとはそういうものなのかもしれない。)) /dev/block/mtdblock* はブロックデバイスである。


手元の実機では system, userdata, cache パーティションは YAFFS2 ファイルシステムらしい。YAFFS については YAFFS - Wikipedia および開発元の http://www.yaffs.net/ 参照。Linux フラッシュ・ファイルシステムの徹底調査フラッシュメモリ一般における知識についても記載されており参考になる。

*1:/cache ツリーの存在意義はまだよく知らない。

*2:吸いだしてダンプしてみたら全部 0xFF フィルだった。貴重なストレージ容量返せ。