nandroid restore のあとブートしない件

Last edited on 2010/01/26 (火) - 23:06

HT-03AにHEROカスタムROMを入れた。CyanogenMod 4.0.4 を経て、今使っているのはJACxHEROSkiv1.6r2 - MoDaCo custom Hero 1.51 mergeというやつ。

それはそれでちゃんと動いていて楽しんでいる。ところが、Cyanogen Recovery 1.4のメニューから restore latest backup をするとその後、決してブートしない。最初のDoCoMoの画面で固まったままである。そこから、電池を抜いて、リカバリーモードで起動することはできて、さらに、apply any zip from sd コマンドでROMをFlashすることはできる。その後はちゃんとブートする。

リカバリーモードで立ち上げて、コンソールに落として、中を見てみると、nandroid-mobile.sh というスクリプトがあり、nandroid backup/restore の実体はどうやらこれである。きっとこのシェルスクリプトを呼んでいるだけかもしれないな、と思ってコマンドプロンプトから手動で実行してみた。

するとこんなエラーメッセージが出て、boot.imgの書き込みに失敗している。

mtd: erase failure at 0x000c0000 (Input/output error)
mtd: erase failure at 0x000c0000 (Input/output error)
mtd: skipping write block at 0x000c0000
error writing boot: No space left on device

これって何? ひょっとしてNANDメモリが壊れてんのか?
なんかもう手が出ない領域のような感じなのでここまでで終了。しかし、なぜZIPファイルのApplyはうまくいって書き込みできるのかがよくわからない。不思議だ。

ともかく今はちゃんと動いているのでそのままにしてあまり触りたくない感じではある。

この件に関して、xda-developersのforumで聞いてみた。nandroid backup/restore と update ではboot.imgのサイズが異なるらしい。

http://forum.xda-developers.com/showpost.php?p=4506521&postcount=1496

いろいろ調べてわかったこと
・nandroidはShellスクリプトであり、restore には flash_image というコマンドを使っている。
・flash_image はFlash ROMへの書き込み前に Eraseを行うが、Bootパーティションの 0x000c0000 アドレス直後のブロックに不良があり、Eraseに失敗する。
・不良ブロックはスキップして書き込みを続ける。しかし、nandroid でBackupしたboot.imgはBootパーティションをまるごとダンプしたものなので、不良ブロックをスキップすると最後に書き込みスペースが足りないといって失敗する。
・リカバリーモードのメニューからの .zip ファイルの適用に関しては、bootパーティションのerase をせずにboot.img を書き込んでいるのでうまくいくようだ。たいていのカスタムROMのboot.imgのサイズは1.7M~2M程度、nandroid backup はbootパーティション全体をDumpするので boot.img のサイズが2.5Mある。
・最近の 10M RAM increase hack の boot.img など、Bootパーティションより小さなboot.imgならば、erase failure が出てもちゃんと書き込めているので、きちんとブートする。