フラッシュメモリストレージへの直接アクセス
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
領域は一般的なノートパソコンなどの「リカバリイメージ」ではない。Linux や Windows などで 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 フラッシュ・ファイルシステムの徹底調査 はフラッシュメモリ一般における知識についても記載されており参考になる。