SH-03Cが大復活しました

この度、死闘の末にSH-03Cが元通りの環境で使えるようになりました。

この話をする前に、事の始まりを説明しなければなりません。

まず、一言で言うならば「大ミスをしてしまった」ことが原因です。

以前の日記で「システムパーティションの書き換えも可能である」ということに気づき、調子に乗って色々弄りまくっていた自分ですが、この度非常に大きなミスをしました。

何をしようとしたのかというと
/system/binの中にあるsuバイナリを置き換える時に、別の箇所に配置したsuへシンボリックリンクを貼るとどうなるのか?
という実験をしてしまったのが運の尽き。

ここに「タイプミス」という非常にアレなミスが重なってしまい、何が起きたのかというと・・・。

suバイナリへのシンボリックリンクを「sh」に上書きしてしまったのです。

気づいた時には時既に遅し、即座にシェルは閉じられ、二度と繋がらなくなりました。

というのも、「/system/bin/sh」はLinuxのシェルコマンドに必須なファイルです。

コレがなくてはシェルコマンドは実行できません。

USBで繋いで「adb shell」をしても何も返ってこず、「端末エミュレータ」は何を入力しても反応しません。

その上、shコマンドが使えない場合、SH-03Cの一時Root化に必須の「SHBreakV2」もエラーで使用できないのです。

20121215-181946.png
▲SHBreakV2のエラー

「シェルを使わないなら関係ない」と思うかもしれませんが、そうも行きません。

どうやら、Wi-Fiの接続にはshを使うようで、Wi-Fiをオンにするとフリーズしまくりの再起動しまくりです。

やむを得ず電波OFFモードにして、音楽を聴いたり写真を撮ったりすることにしか使えなくなってしまうのです。

あまりに不便だったので、どうにか直そうと考えました。これが去年の12月頭の話。

以下は自分用のメモとして記録しておこうと思って記載しています。

あまりにも長いので、興味のない人は見る必要のない記事になっていると思われます。

さて、ここからは本当に試行錯誤の繰り返しでした。
とりあえず、手近に試せそうだった方法を取ります。
<事前準備>
・正しいshファイルを端末のSDカード直下においておく。
��shファイルはCyanogenMod6のファイルから入手)
・Bootkitが導入されていて、/data/localに「ae2break」「busybox」がある前提。
①PCと接続しコマンドプロンプトを実行し、adbからリカバリーへ。
adb reboot recovery
②Bootkit導入済みなのでシャッターボタン半押しでカウントを止める。
③PCからadb shellし、system・data・sdcardをマウントする
C:\Windows\System32> adb shell
$ _su
# /bin/sh
~# sd
~# rw /mnt/sdcard
~# mount -t yaffs2 -o rw /dev/block/mtdblock4 /system
~# mount -t yaffs2 -o ro /dev/block/mtdblock8 /data
④cpコマンドでファイルをコピーする
~# cp /mnt/sdcard/sh /system/bin
さて、うまくいくはずがありません。
というのも、NANDLOCKを解除していないからです。
SDBoot挑戦者はだれでもやったことのある作業をする必要があります。
��/data/localにae2breakが配置されている必要あり)
~# stop mediayamaha
~# kill -9 `/data/local/busybox pidof mediayamahaserver`
~# /data/local/ae2break
※途中でエラー出ますが無視
さて、この状態で再度④を実行するのですが、やはりエラーになってコピーできません。
調べてみると、どうやらこのブートキットはsystemパーティションを直接弄れないようです。
・・・駄目じゃん!!!!
というわけで、この方法がダメだった次点で諦めていました。
他の手段を特に思いつかなかった上、「電波OFFモード」にすれば、何とか使えてはいたので。


さて、今日の夕方のことですが、ふと訪れたとあるサイト・・・正確にはP-01DのRoot化Wikiですが。
そこに載っていたのは「システムパーティションのTARバックアップ」でした。
「ふ~ん」と見ながら思いついたのは、「このTARバックアップしたtgzファイルを編集した上でSDブート時の/systemパーティションに戻せばうまくいくのでは?」ということでした。
思いついたら即実行です。
上記の①~③までを実行して、NANDLOCKの解除も行います。
その後
~# mkdir /mnt/sdcard/system_backup
~# busybox tar cvzf /mnt/sdcard/system_backup/system.tgz /system
これで、SDカード内のsystem_backupフォルダ内に「system.tgz」の圧縮ファイルが出来上がります。
一度Windowsで見てみると、7-zipなどで開いてみれば分かりますが、パーミッションや管理者もそのまま保存されています。
ですが、Windows上でファイルの追加を行うと、このパーミッションの追加等ができないのです。
ここで必要なのがLinuxベースのマシンです。
他のAndroid端末を所持している場合はそれでも構いませんし、ない場合はUbuntuやAndroid-x86などを利用しても構いません。
自分はAndroidOSの方が慣れているという理由+既にインストールされているという理由でAndroid-x86を利用しましたが、基本は一緒のはずです。


SDカードをLinuxマシンに差し、マウントします。
私はAndroidベースだったので、Nexus7でもお世話になった「StickMount」を使ってマウントしました。
SDカードは「/mnt/sdcard/usbStorage/sdb1」にマウントされました。
場合によってここは違うので、適宜読み替えて下さい。
こちらでも端末エミュレータを起動し、コマンドを入力します。
①SDカード内のtgzファイルを、/data/localに展開する。
※/mnt/sdcard内に展開すると権限管理が面倒なため/data/localに展開。
$ su
# cd /data/local
# busybox tar zxvf /mnt/sdcard/usbStorage/sdb1/system_backup/system.tgz
②cpコマンドを利用して正しいshファイルを転送する
# cp /mnt/sdcard/usbStorage/sdb1/sh /data/local/system/bin
③権限を変更する
# cd /data/local/system/bin
# chmod 777 sh
# chown root.root sh
④再度system.tgzデータに固め直す
# busybox tar cvzf /mnt/sdcard/usbStorage/sdb1/system_backup/system.tgz --exclude='sharp_movies'
これで作業は終了です。
SDカードをAndroid端末から抜き、再度SH-03Cに装着。
リカバリー起動を行なって再度Bootkitへ向かいます。
ここから先はSDBootの作業と大差ありません。
リカバリーカウントダウンを止め、PCからコマンドを入力します。
C:\Windows\system32> adb shell
$ _su
# /bin/sh
~# sd
~# rw /mnt/sdcard
~# mkdir /mnt/sdcard/sdboot
~# dd if=/dev/zero of=/mnt/sdcard/sdboot/system.ext2 bs=1M count=384
~# dd if=/dev/zero of=/mnt/sdcard/sdboot/data_app.ext2 bs=1M count=384
~# losetup /dev/block/loop0 /mnt/sdcard/sdboot/system.ext2
~# losetup /dev/block/loop1 /mnt/sdcard/sdboot/data_app.ext2
~# mkfs.ext2 /dev/block/loop0
~# mkfs.ext2 /dev/block/loop1
~# mkdir /data_app
~# mount -t ext2 /dev/block/loop0 /system
~# mount -t ext2 /dev/block/loop1 /data_app
ここまでの作業は、通常のSDboot化作業と変わりません。
異なるのはこの部分です。
~# mkdir /data0
~# mount -t yaffs2 -o ro /dev/block/mtdblock8 /data0
~# cd /system
~# tar zxvf /mnt/sdcard/system_backup/system.tgz
~# (cd /data0/app && tar cf - .) | (cd /data_app && tar xvf -)
赤文字の部分が、通常とは異なります。
コレで、tgzの中身が/systemの中に展開されるのですが、経過を見れば分かりますが、元々/data/localの中で作成したものなので、/systemの中に/data/localが新たに作られ、その中に本来の/systemが展開されてしまいました。
コレでは起動できないので、移動する必要があります。
~# mv /system/data/local/system /
~# rm -r /system/data
この後は通常のSDBoot化作業と同じく、data領域のコピーを行なっていきます。
~# (cd /data0/app && tar cf - .) | (cd /data_app && tar xvf -)
~# cd /mnt/sdcard
~# unzip sdboot.zip
~# reboot recovery
以上で作業は終了です。
端末のメニューボタンを押すとSDBootが実行されます。
��英語がずらずら表示され、一番下にstarting zygoteと出れば成功)
SDBootで起動すると、動作がヌルヌル!これは来たか!
PCと接続して「adb shell」をすると「$」が返ってきました!
端末エミュレータを開いてみると、先頭に「$」が表示されています。
しかし、この状態ではまだSDBoot領域が修復されたにすぎません。
ここから、NAND領域内の/systemパーティションを修復する必要があります。


①SHBreakV2を実行し、NANDUNLOCKをし、ISTweakでSUコマンドを有効にしておく。
②PCと接続し、adb shellを実行。
C:\Windows\system32> adb shell
$ su
③ae2breakを使ったNANDロック解除も行う。
# stop mediayamaha
# kill -9 `/data/local/busybox pidof mediayamahaserver`
# /data/local/ae2break
④NAND内のsystem領域をマウントする
# mkdir /system0
# mount -t yaffs2 -o rw /dev/block/mtdblock4 /system0
⑤system領域内に正しいshを配置する
# cp /mnt/sdcard/sh /system0/bin
# cd /system0/bin
# chmod 777 sh
# chown root.root sh
⑥再起動する
# reboot

これで、全作業が終了になります。
この作業によって、SH-03Cは元通り、シェルコマンドがきちんと使える端末に戻りました。
Wi-Fiにすら繋げない電波OFF専用機からも解放され、約1ヶ月ぶりに同期をしております。
アプリのアップデートもたんまりと・・・。
目的がこれだけの人は、SDBootを削除した上で、リカバリーパーティションをデフォルトのものに復元しても構いません。
とりあえず、今回は自分用のメモ代わりに長々と書いたので、最後まで読む方はあまりいないかと思っています。
ですが、もしもこの記事が誰かの何かのお役に立てば幸いです。

コメント