バックアップと、安全装置(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 recoveryIS01に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.imgrecovery_kitでは、パーティション名は「recovery_wr」を指定する必要はなく、recoveryに直接書き込めます。
焼けたら、再起動してみます。
まずはboot領域のrecovery_kitが起ち上がりますが、ここで何も操作しないでおくとrecovery領域から再ブートします。
無事システムが起動すれば一安心。