Nandroid system.imgからファイルを抽出する

ふとパッチを当てたlibnfc.soを元に戻そうとしたんだが、オリジナルのイメージは自宅のPCの中にしかないことに気がついた。Nexus Sの/sdcardにはClockworkMode RecoveryでバックアップしたNandroidイメージはある。なので、この拡張子.imgのNandroidイメージから元々のファィルを抽出できないのかと調べてみたらできるらしい。

Nandroidイメージは"yaffs"と呼ばれるファイルシステムとして生成されている。yaffsは"Yet Another Flash File System"のアクロニムであり、NANDフラッシュメモリデバイス用のファイルシステムであり、unyaffsはyaffsからファイルを抽出するプログラムだ。

早速ダウンロードして使ってみようと思ったが、そもそもWindows用のバイナリなんてあるはずもなく途方にくれていたのだが、どうやcygwingccするだけでいけそうだったのでやってみた。

ソースコードをダウンロードしてcygwinを起動、以下のコマンドを実行

Kazz@Kazz-pc /cygdrive/f
$ gcc -o unyaffs unyaffs.c

これでunyaffs.exeが生成されるので実行すると、cygwin1.dllが無いと怒られる。調べてみるとgccのオプションに"-mno-cygwin"と指定することでこのcygwinのランタイムに依存しないバイナリをコンパイルできるとあったので試したが

Kazz@Kazz-pc /cygdrive/f
$ gcc -mno-cygwin unyaffs unyaffs.c
unyaffs.c: In function `process_chunk':
unyaffs.c:70: error: too many arguments to function `mkdir'

と今度はコンパイル自体が通らない。仕方が無いのでcygwin1.dllにパスを通して実行。system.imgをunyaffsする。

F:\>unyaffs system.img
end of image

これでNTFSにも関わらずカレントディレクトリにNexus Sの/system下が展開された。素晴らしい。

あとは/libのlibnfc.soで復旧。
今まではファイル数個のためだけにROMを全て元に戻していたが、これで手間を省ける。

入れててよかったCygwin