2011/05/10

リカバリイメージの作成

今更ながら、SC-02B (Android 2.2, SC02BOMJJ1)のリカバリイメージを作成したので手順をまとめておく。Windows PC 上で作業した。
当然ながらメーカー保証外の作業を含むため自己責任で。

まずはバックアップから。
マーケットから Titanium Backup をインストールする。無償版でも良いが、リストアが不便なので有償版がお勧め。

Titanium Backup は要 root なので、SuperOneClick を用いて root を取得する。
メニュー -> 設定 -> アプリケーション -> 開発 -> USBデバッグ にチェックを付ける。
Samsung Kies をインストールしていない場合はインストールする。
MicroUSB で PC に接続して SuperOneClick を起動し、Root ボタンをクリックする。
途中でいくつか問い合わせのダイアログが表示されるが、Android のバージョンが 2.0 以上かどうか、Busybox をインストールするかどうか、root を取得できるかテストするかどうか、寄付するかどうかの4種類。Android のバージョンは 2.2 なので、「はい」を、Busybox については後々作業が面倒になるのでインストールしない。

無事 root が取得できたら、MicroUSB を外した後、SC-02B 本体の電源ボタンを長押しして再起動する。
Titanium Backup を起動し、Superuser リクエストで許可をタップする(記憶するのチェックは任意)。「お困りですか?」をタップして busybox をインストールした後、再度 Titanium Backup を起動し直す。バックアップ/リストア タブを開く。メニューから環境設定を開き、バックアップフォルダを /mnt/sdcard/external_sd/Titanium Backup に設定する(親フォルダに移動するには戻るボタンをタップする)。microSD の空き容量が十分あることを確認しておく。
次に、メニューからバッチ処理を選択し、「バックアップ:全ユーザーアプリ+システムデータ」を実行。設定は触らずそのまま「バッチ処理を実行」をタップする。バッチ処理が終了したら Titanium Backup を終了する。
これ以降に、例えばアプリの設定を変更したり、ゲームをセーブしたり、メールを受信したりした場合、その設定やセーブ内容、メールはバックアップ対象に含まれないため、リストア時になくなってしまう。そのため、必要であれば Titanium Backup を使って随時バックアップしておく。

ここまでで、システム設定と、インストールしたアプリとその設定、またアプリが保存したデータ(内蔵SD上と microSD に保存したデータを除く)がバックアップできたので、次はシステムそのもののリカバリイメージを作成する。
まずは、/system を元の状態に戻すため、MicroUSB で PC に接続して SuperOneClick を起動し、Unroot ボタンをクリックする。そして MicroUSB を外して SC-02B を再起動する。起動したら再度 MicroUSB で PC に接続して SuperOneClick を起動し、Shell Root ボタンをクリックする。

Android SDK をインストールする。
コマンドプロンプトを開く。カレントディレクトリを任意の空フォルダに移動する。
ここでは、C:\SC02BOMJJ1 とした。

cd C:\SC02BOMJJ1

ADB で実機に接続する。Shell Root で接続しているので、プロンプトが # になっている。
C:\SC02BOMJJ1> adb shell

以下のようにリカバリイメージの元になるイメージを抽出する。ここでは内蔵SD上に backup フォルダを作成して保存することとした。内蔵SDに 700MB くらいの空き容量があること。factoryfs.rfs や dbdata.rfs はサイズが大きいため少し時間がかかる。

# mkdir /sdcard/backup
# dd if=/dev/block/bml1 of=/sdcard/backup/boot.bin
# dd if=/dev/block/bml2 of=/sdcard/backup/sc02bomjj1.pit
# dd if=/dev/block/stl3 of=/sdcard/backup/efs.rfs bs=4096
# dd if=/dev/block/bml4 of=/sdcard/backup/sbl.bin
# dd if=/dev/block/stl6 of=/sdcard/backup/param.lfs bs=4096
# dd if=/dev/block/bml7 of=/sdcard/backup/zImage
# dd if=/dev/block/stl9 of=/sdcard/backup/factoryfs.rfs bs=4096
# dd if=/dev/block/stl10 of=/sdcard/backup/dbdata.rfs bs=4096
# dd if=/dev/block/stl11 of=/sdcard/backup/cache.rfs bs=4096
# dd if=/dev/block/bml12 of=/sdcard/backup/modem.bin

続いてプリインストールアプリの DioDict の辞書データの領域を抽出する。これもサイズが大きいため時間がかかる。

dd if=/dev/block/mmcblk0p3 of=/sdcard/backup/mmcblk0p3.dat

ADB を終了してコマンドプロンプトに戻る。

# exit
$ exit

実機上に抽出したイメージを、PC 上に取り出す。

C:\SC02BOMJJ1> adb pull /sdcard/backup/boot.bin
C:\SC02BOMJJ1> adb pull /sdcard/backup/sc02bomjj1.pit
C:\SC02BOMJJ1> adb pull /sdcard/backup/efs.rfs
C:\SC02BOMJJ1> adb pull /sdcard/backup/sbl.bin
C:\SC02BOMJJ1> adb pull /sdcard/backup/param.lfs
C:\SC02BOMJJ1> adb pull /sdcard/backup/zImage
C:\SC02BOMJJ1> adb pull /sdcard/backup/factoryfs.rfs
C:\SC02BOMJJ1> adb pull /sdcard/backup/dbdata.rfs
C:\SC02BOMJJ1> adb pull /sdcard/backup/cache.rfs
C:\SC02BOMJJ1> adb pull /sdcard/backup/modem.bin
C:\SC02BOMJJ1> adb pull /sdcard/backup/mmcblk0p3.dat

任意のツールを使用して、抽出したイメージの MD5 を計算する。個人的には FastHash が高速で使いやすいのでお勧め。
参考までに、抽出したイメージのサイズと MD5 は以下のようになっていた。サイズがおかしい場合や、MD5 が一致していない場合は抽出ミスだと思われるので、再度抽出し直すこと。
ファイル名サイズ(byte)MD5
boot.bin262,1447EAF30AD33B99185179A4DC57ED5D78B
cache.rfs32,768,000不定
dbdata.rfs120,586,240不定
efs.rfs6,553,600不定
factoryfs.rfs301,465,600不定
mmcblk0p3.dat209,715,200不定
modem.bin16,777,216700ABAE411A472767AF984BDC89959D2
param.lfs1,310,720B179911EA173C450D01919C67BC35C33
sbl.bin1,310,7206B852BB6644AA71BFA28B53B101F7074
sc02bomjj1.pit262,1445CBCF29481A3F81783F775D2CB7056C2
zImage7,864,320D86139B073C99C62ED40F574BF20D5C1

Linux 環境に必要なファイルをコピーして以下の作業を行う。ここでは、VMware Workstation 上に Ubuntu 11.04(x64)をインストールして、VMware の機能の共有フォルダで C:\SC02BOMJJ1 を指定して作業を行った。Ubuntu 上では /mnt/hgfs/ に共有フォルダで指定した名前でマウントされるので、ここでは /mnt/hgfs/SC02BOMJJ1 を指定している。

$ cd /mnt/hgfs/SC02BOMJJ1
$ tar --format=ustar -cf MODEM_SC02BOMJJ1.tar modem.bin
$ md5sum -t MODEM_SC02BOMJJ1.tar >> MODEM_SC02BOMJJ1.tar
$ mv MODEM_SC02BOMJJ1.tar MODEM_SC02BOMJJ1.tar.md5

$ tar --format=ustar -cf CODE_SC02BOMJJ1.tar zImage param.lfs dbdata.rfs factoryfs.rfs cache.rfs
$ md5sum -t CODE_SC02BOMJJ1.tar >> CODE_SC02BOMJJ1.tar
$ mv CODE_SC02BOMJJ1.tar CODE_SC02BOMJJ1.tar.md5

$ head -c 1876 sc02bomjj1.pit > sc02bomjj1_odin.pit

MODEM_SC02BOMJJ1.tar.md5, CODE_SC02BOMJJ1.tar.md5, sc02bomjj1_odin.pit の 3 つのファイルを Windows 上の C:\SC02BOMJJ1 にコピーする。VMware で共有フォルダを使用した場合は、直接 C:\SC02BOMJJ1 に保存されているのでコピーする必要はない。
Linux 上での作業はここまでで、再び Windows 上で作業する。

参考までに、sc02bomjj1_odin.pit の MD5 は以下の通り。
ファイル名サイズ(byte)MD5
sc02bomjj1_odin.pit1,876ACB09296A0AC135A8840BB1955744F4F

次に、内蔵SDの内容を microSD にバックアップする。内蔵SDの使用量に応じた空き容量の microSD を用意すること。まず最初に、上述の作業で内蔵SDに抽出したイメージは不要なので削除する。
# cd /sdcard
# rm -r /backup
# tar zcf /sdcard/external_sd/internal_sd.tar.gz ./ --exclude "external_sd"

念のため、/data と /system も microSD にバックアップしておく。

# tar -czvf /sdcard/external_sd/data.tar.gz /data
# tar -czvf /sdcard/external_sd/system.tar.gz /system

次に、本体の IMEI(国際移動体装置識別番号(端末識別番号))が保存されている /efs をバックアップしておく。
SC-02B の各個体固有の情報なので超重要。
あらかじめ SuperOneClick のフォルダ内にある busybox ファイルを C:\SC02BOMJJ1 にコピーしておいた後に作業を行う。SuperOneClick v1.9.1 だと Dependencies フォルダ内に busybox がある。

C:\SC02BOMJJ1> adb push busybox /data/local/tmp/
C:\SC02BOMJJ1> adb shell
$ su
# /data/local/tmp/busybox tar zcvf /sdcard/efs-backup.tar.gz /efs
# exit
$ exit
C:\SC02BOMJJ1> adb pull /sdcard/efs-backup.tar.gz

Shell Root 状態なので、SC-02B は再起動しておく。ここまでで作業終了。以下のファイルは大切に保管しておく。
C:\SC02BOMJJ1 内の
・boot.bin
・CODE_SC02BOMJJ1.tar.md5
・efs-backup.tar.gz
・efs.rfs
・mmcblk0p3.dat
・MODEM_SC02BOMJJ1.tar.md5
・sbl.bin
・sc02bomjj1_odin.pit

microSD 内の以下のフォルダやファイルも必要に応じて保管しておくとよい。
・Titanium Backup フォルダ
・data.tar.gz
・internal_sd.tar.gz
・system.tar.gz


~おまけ~
root も取得したことがなく、システム設定もアプリのデータも破棄してしまうことを前提に、リカバリモードで起動して wipe data/factory reset した状態でイメージを抽出すると、よりオリジナルの状態に近いイメージを作成できる。
この場合、SuperOneClick で Shell Root を取得するところから作業を始めることになる。
例え Unroot したとしても、root を取得することで /system 内のいくつかのフォルダの更新日付が変更されるため、それに伴い抽出した factory.rfs の system フォルダの更新日付も変更されてしまう。そういうのが嫌であれば、余計なことをする前にリカバリイメージを作成した方が良い。

0 件のコメント:

コメントを投稿