月曜日

IS01のバックアップとrecovery_kit導入

IS01をあれこれする前に「何かやっちゃった時のための備え」を用意します。
バックアップと、安全装置(recovery_kit)の導入です。

バックアップ

パーティションによってddを使ったりtarを使ったりするようです。
# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00b00000 00020000 "boot"
mtd1: 00500000 00020000 "cache"
mtd2: 00b00000 00020000 "recovery"
mtd3: 00180000 00020000 "splash"
mtd4: 00b40000 00020000 "ipl"
mtd5: 10000000 00020000 "system"
mtd6: 00300000 00020000 "log"
mtd7: 06420000 00020000 "userdata"

# mkdir /sdcard/is01rom
# dd if=/dev/mtd/mtd0 of=/sdcard/is01rom/mtd0_boot.img
# dd if=/dev/mtd/mtd2 of=/sdcard/is01rom/mtd2_recovery.img
# dd if=/dev/mtd/mtd3 of=/sdcard/is01rom/mtd3_splash.img
# dd if=/dev/mtd/mtd4 of=/sdcard/is01rom/mtd4_ipl.img
# tar -jcf /sdcard/is01rom/system.tar.bz2 -C /system --exclude ./logphy_mapping.bin .
# tar -jcf /sdcard/is01rom/sqlite_journals-YYYYMMDD_MMSS.tar.bz2 -C /sqlite_journals .
# tar -jcf /sdcard/is01rom/data-YYYYMMDD_MMSS.tar.bz2 -C /data .
/systemのバックアップでlogphy_mapping.binというファイルを除外してるのは、これが含まれてるとtarがエラー終了するから。
何のために使われるファイルなのかは知らないけど、「これをバックアップしなかったためにハマった」という事例はないみたいなので、気にしないことにします。

recovery_kitの導入(まずはrecovery領域で練習)

IS01をいろいろ弄る前に入れておきたいのがrecovery_kit
recovery_kitは「このパーティションだけで起動と復旧作業が行える」という、カーネルといくつかのコマンドのセットです。

これを入れると何がありがたいかというと、例えばsystem領域を壊したとき。
Androidはboot/recovery領域から起動しますが、システムはsystem領域に入っています。シェルは/system/bin/shです。
何か作業に失敗してsystemを壊してしまって「起動しない!文鎮完成だ!」という場合でも、recovery_kitが導入してあればsystemの復旧作業を行なえるのです。

実際に私も後日、shをbashと入れ替えようとして失敗し、シェルが実行できなくなったことがありました。そんなときもrecovery_kitを起動して/system/bin/shを書き戻して元通り。危ういところを助けられました……。

さて、recovery_kitはboot領域に焼くのですが、導入に失敗すればこれまた文鎮化です。
そこでまずは、失敗しても取り返しの効くrecovery領域に焼くことにします。
(recovery領域が壊れても、boot領域から起動できればrecovery領域を焼き直すことができます)

recovery_kitをえぬえす工房からダウンロード。
> adb push recovery_kit.img /sdcard/
> adb shell
$ cat /proc/mtd
(recovery_wrがあることを確認)
$ su
# flash_image recovery_wr /sdcard/recovery_kit.img

導入したrecovery_kitが起動するか確認するため、recovery領域からブートします。
> adb reboot recovery
IS01にrecovery_kitの表記が表示された後、暗転したらすかさずHome+電源を押し、メニューが表示されたらすかさずトラックボールを転がします
(メニューが表示されたらすぐトラックボールを触る必要があります。何秒か経ってから転がしても受け付けてくれません)

なお、recovery_kitは一定時間操作がなかった場合、recovery領域からブートするために自動で再起動します。
(今回はrecovery領域に焼いたので、recovery_kitが無限ループで起動することになります)

recovery_kitを導入したらやること

まずは「Enable QXDM」を選びます。adb接続するのに必要とのこと。

次に「Start adbd recovery」して数分ほど待つと、adbで接続できるようになります。
# ls
ls: not found
とか言われてビビりますが、toolboxやbusyboxにパスが通ってるので「# toolbox ls」のようにすればOK。

いちおう、通常のboot領域からの起動に問題がないことも確認しておきます。

boot領域にrecovery_kitを導入

ではいよいよ、boot領域にrecovery_kitを焼きます。
> adb shell
$ cat /proc/mtd
 (boot_wrがあることを確認)
$ su
# flash_image boot_wr /sdcard/recovery_kit.img

boot領域から起動します。
リカバリメニューに入ったら、再び「Start adbd recovery」でadbでつながることを確認。

なお、リカバリメニューに入るのに失敗した場合、放っておけば再びrecovery_kitが起ち上がりますが、2回目以降に起動するのはrecovery領域のrecovery_kitです。boot領域から起ち上がるのは初回だけだということに留意。

recovery領域にカスタムカーネルを導入

boot領域のrecovery_kitに問題がないようなら、recovery領域にはシステムを起動するカーネルを焼きましょう。
バックアップしておいたboot領域を書き戻してもいいですが、せっかくなので改造カーネルを焼いてみます。
IS01でcompcache(ramzswap)を有効にする(2) | Weboo! Returns.からubi-compcache-0.2.imgをダウンロード。
> adb push boot.img /data/
(ファイル名が長いと手入力が面倒なので、短くしておくとラク)
> adb shell
# flash_image recovery /data/boot.img
recovery_kitでは、パーティション名は「recovery_wr」を指定する必要はなく、recoveryに直接書き込めます。

焼けたら、再起動してみます。
まずはboot領域のrecovery_kitが起ち上がりますが、ここで何も操作しないでおくとrecovery領域から再ブートします。
無事システムが起動すれば一安心。

LinkWithin


Related Posts with Thumbnails