2017年5月17日水曜日

IS01での失敗と再興

1年くらい前にIS01を買って放置していた。なんとなく気が向いたので色々いじっていたら、shをbashに入れ替えようとした時にbashをchmodしないまま入れ替えてrebootしてしまった。気づかずにターミナルを起動するも落ちる。is01rootも動かない。ここでchmodし忘れたことに気づき絶望。そんなわけで諦めて一か八かオールリセットを試すことにした。

目次

さらば初代


設定app>リセット>オールリセットをタッチ、暗証番号を求められるけど、覚えがなければ初期設定の1234のはず。暫く待つと再起動する。とりあえず起動した!と喜ぶのもつかの間。

解像度が戻ってない

iPhoneみたいにシステムごと復元するんじゃないんだね…まずいと思いつつとりあえずwifiをonにしてみる。

ならない

表示は「wifiを利用できません」。絶対にやばいやつだと思いながら仮想マシンのUbuntuに接続、adb接続してみる。
$ adb shell- exec '/system/bin/sh' failed: No such file or directory (2) -
終わった…完全に終わった…本来ならこういう時はrecovary_kitなるものをリカバリー領域に用意しておくらしいのだが、そんなこと知らない頃に手に入れて放置していた代物。もちろん用意されているわけもなく投了です。コマンドが一行も実行できないので、apkを持ってきてもインストールできず。泣きそうです。
が、gdpWinを諦めた身としては安価な物理キーボード端末でまだ遊びたい…そこでメルカリでサクッと検索。ちょうどいいのがあったのでぽいっと購入。カードって怖いね。

こんにちは2代目


今度は水色!ちょっとかわいく見えて個人的には気に入ってる。
初期化されてたから特に手間はなし。幸運にもBBが10.00.07だったから簡単にrootが取れた。ちなみにBB10.00.10以降はroot権取得やsystemを書き換え可能にする作業が違う。system内を書き換えるのは前述の通り危険!自己責任です!以下は覚え書きな感じで。

rootを取る



  1. wi-fiに接続。この段階ではなぜかadbで認識できない。
  2. marketでsuperSuのインストール。supersuを更新やアップデートすると使えなくなるので注意
  3. ブラウザで「is01 rooter」を検索し、トップヒットするここからis01rooter.apkをダウンロード、インストール
  4. step1-3を実行

これでrootを取れた。

アプリをインストール


この状態で以下の物をマーケットからインストール
  • ClockSync
    •  ネットワークを通して時刻を修正 
  • TimeZone Changer 
    • タイムゾーンを修正(いらないかも) 
  • Jota Text Editer 
    • テキストエディタ 
  • Wi-Fi 高速接続アプリ 
    • 電波強度でAPを切り替えてくれる。APが多い我が家では役に立つ 
  • Android Terminal Emulator 
    • 読んで字のごとく、ターミナル 
  • Gscript Lite 
    • 設定したコマンドをワンタッチで実行できるアプリ。この後のsystemの書き換え可能マウントなど、何回も実行しそうなコマンドライン作業を簡単にできるので便利。 
  • OI File Manager 
    • この後ESファイルエクスプローラーを入れるまでのつなぎ
これが済んだらブラウザを開き、「is01 アップローダー」で検索。トップヒットするここ(IS01用アップローダー)から以下の物をダウンロード
  • ADW 
    • ホームランチャー。ここにあるのはis01用に調整してあるらしい。全画面で使える上に解像度を上げてもきれいに見える気がする。記事作成時に使ったのはADW136.apk 
  • ESファイルエクスプローラー 
    • 名前通りのファイラー。なんとなくこれに落ち着く。Verが3.2.5.3のものもあるけど、なぜかうまく行かなかったので、使ったのはES ファイルエクスプローラー_1.6.1.0.apk。
ダウンロードしたらOIFileManagerで開いてインストール。ESのインストールが済んだらOIはもういらない。その他にも初代のときにネットから拾ったものもインストール。
  • Opera mini 5 beta 
    • ブラウザ。標準は証明書が古くて警告が出まくるからこれじゃないとやっていられない。 
  • twicca 
    • twitterクライアント。初期設定のときのPINが一瞬しか表示されない問題はあるけど、それを超えれば普通に使える。動作を確認したバージョンは0.C.9。 
  • Airplane mode Wi-fi Tool 
    • 電波OFFモード(3G,wifi,bluetooth使用不可)中にwifiを有効にするツール。セルスタンバイ問題があるようなので入れたほうがいい。

NANDロックを回避してSystemをいじる準備


ここでadbで認識されるようになったのでPCで作業。sysremount_atmyownrisk.shが使えるとホント楽ちんだぁ…2行目以降をAndroid上のTerminalでやっても問題なし。
@PC $ adb shell //これでandroidに接続、terminal操作できる$ su# cd /sqlite_journals/is01root# ./sysremount_atmyownrisk.sh
ここまですると、/にsystem.rwディレクトリができる。ここにsystemディレクトリが読み書き可能な状態でマウントされていて、ここで変更を加えると再起動後に反映される。ちなみに再起動後はis01rooterのstep3と一緒で実行しないとマウントされない、永続的なものではないってこと。Gscript Liteでこのsysremount_atmyownrisk.shを実行するようにすると、再起動が多い作業中は楽ちん。

バックアップとリカバリ作成


危なかっしいことをする前にバックアップとリカバリを作成する。過去からの反省です。長いコマンドが多いのでadb shellでの作業推奨、念のためroot権限で作業する。
バックアップを作る
コマンドの参考はここ(is01wiki)
  • bootのイメージ
# dd if=/dev/mtd/mtd0 of=/sdcard/boot.img
  • recoveryのイメージ
# dd if=/dev/mtd/mtd2 of=/sdcard/recovery_org.img
  • systemの中身
# tar cvzf /sdcard/system.tgz /system
  • dataの中身
# tar cvzf /sdcard/data.tgz /data
下の2つは、諸々に変更を加えた後問題ないようなら再度実行してバックアップを取ると復旧が楽になって良い。後の作業をするならば、boot.imgはPCに転送しておくといい。
recovery_kitを準備する
これを探すのが大変だった…自分はTwitterのタイムライン検索から見つけたけど、Googleでrecovery_kit_v130と検索するとトップヒットする4shareの中継サイトからrecovery_kit_v130.7zがダウンロードできる。
この中継してるサイトってなんなんだろう。ダウンロードして展開するとフォルダ内にrecovery_kit.imgがあるので、これをSDカードにコピーしておく。以下の作業は前項の手順でsystemを読み書き可能でマウントしていることが前提。
//systemやrecoveryがマウントできているか確認//ここでsystem_rwやrecovery_wrがない場合はsystemがマウントできていない# cat /proc/mtddev: size erasesize namemtd0: 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"mtd8: 00b00000 00020000 "boot_wr"mtd9: 00b00000 00020000 "recovery_wr"mtd10: 10000000 00020000 "system_rw" //念のためコマンドがあるか確認# which flash_image/system/bin/flash_image //recovery_kit.imgを置いたディレクトリへ行く# cd /sdcard //まず、バックアップをとったmtd2.binを焼く# flash_image recovery_wr mtd2.bin//次にrecovery_kitを焼く# flash_image recovery_wr recovery_kit.img
ここまですると、recovery領域にrecovery_kitが準備されたことになる。
recovery_kitの起動を確認する
PC側でadb reboot recoveryとするか、Android上のターミナルでreboot recoveryを実行してリカバリー領域から起動。ロゴと一緒にrecovery_kit~みたいな文字が見えたらひたすらhomeと電源ボタンを交互に連打。黒地に青文字のメニューが見えたらトラックボールを動かして、カーソルが動けばOK。Enable QXDM -> Start adbd recoveryの順で実行すればadb接続できるようになる。この状態でadbに認識されていればrecovery_kitのイメージは正常であることが確認できる。確認できたらBoot boot partitionを選んで再起動する。

ここからの工程は途中でやめてはいけない。
recovery領域にboot領域のイメージを書き込まないと延々とrecovery_kitが起動することになる

recovery_kitをboot領域に焼く
いつもどうりに起動したらシステムを読み書き可能でマウントしてboot領域にrecovery_kitを焼く。なんでこんなことをするかというと、is01は電源が落ちている状態からリカバリブートできないからだ。リカバリ領域にrecovery_kitを焼いておいたままでは、万一「起動しない!やっちまった!」となってもadbで認識できなければrecovery_kitが使えない。
これでさらに1台潰した
//recovery_kitを置いたディレクトリで# flash_image boot_wr recovery_kit.img# reboot
これでいきなりrecovery_kitが起動するようになるので、すかさずhomeと電源ボタン交互連打でメニューに入ってadb接続する。

recovery領域にbootを焼く

adb接続があることを確認。
//PCにboot.imgをコピーしていればそれを再度is01に渡す。していなければ、/system2以下に元の/以下があるので探し出す。SDカードにある時は、usb接続したまま思い切って電池パックを抜いて取り出してもなんとかなる(自己責任)@PC $ adb push boot.img /data/@PC $ adb shell# cd data# flash_image recovery boot.img# reboot
この作業をすることで、電源投入後(boot領域の)recovery_kit -> (recovery領域の)boot -> 通常起動 の順で起動する。recovery_kitは何も操作しないとrecovery領域から再起動するので、何も用がない時はなにもしなければ今まで通り起動する。これで万一通常起動ができなくなってもrecovery_kitが最初に起動するのでこれを使えば直せる、という保険が得られた。systemの書き換えを安心して(?)できる。
気を抜いてはいけない
ちなみにこの項目の作業後は絶対に設定>リセットのオールリセットを実行してはいけない。本当に再起不能になるのでお気をつけ。

解像度の変更


続いて解像度変更のためにbuild.propを書き換える。当然だけどsystem.rwがある状態が前提。
# exit$ exit //ここでAndroidのterminalから出た@PC $ adb pull /system/build.prop40 KB/s (2144 bytes in 0.051s)
持ってきたbuild.propを適当なエディタで開きro.sf.lcd_density=240の箇所をro.sf.lcd_density=180に書き換える。小さいほど解像度が高くなるらしい。書き換えて保存したら、
@PC $ adb push build.prop /system.rw/build.prop
として、転送。書き換えはESファイルエクスプローラーで開いて行っても問題なし。PCで編集してpushした時は念のため/systemでls -lをしてbuild.propが全ユーザーで読み出し可かどうかを確認すること、二の舞いになる可能性あり。問題なければ再起動。目に見えて見やすさが変わる、モバイルPCっぽくなってよい。

標準アプリの退避


お次はメモリ確保のために標準アプリを退避する。
@PC $ adb shell$ su# cd /system.rw/app# mkdir escapeapk# mv [退避したいファイル] escapeapk
以降mvコマンドを繰り返して不要なものを移動させる。参考はIS01常駐タスクの削減|GHP。今のところ自分が退避しているのは以下。
# ls /system/app/escapeApkVoiceSearch.apkVoiceRecorder.apkTwitter.odexSoundMemoProvider.apkCompassApp.odexYouTube.odexSendCmailService.odexSoundMemo.odexMaps.odexWebFiltering.odexWebFiltering.apkVoiceSearch.odexVCardViewer.odexTalk.odexBlogUp.apkLauncher.apkMailProvi.odexTalk.apkRss.odexMaps.apkTwitter.apkMajorUpdate.apkFotaApp.apkmixiAppManager.apkMailProviDataProvider.odexMail.apkAuoneidSetting.odexLauncher.odexNetDictionary.odexPVWmdrmService.odexVCardViewer.apkMailProvi.apkNetDictionary.apkSoundMemo.apkCompassApp.apkYouTube.apkFotaApp.odexRss.apkMajorUpdate.odexMailProviDataProvider.apkAuoneidSetting.apkBlogUp.odexSendCmailService.apkVoiceRecorder.odexmixiAppManager.odexPVWmdrmService.apkSoundMemoProvider.odexMail.odex
今のところは支障がないので一安心。

bashの導入


shでも問題は無いけど、矢印キーが使えない上に履歴も残らないなんてむず痒いので懲りずにbashを導入する。とりあえず置き換えたりせず、安全な方法を使ってみる。
まずはこのページに行き、
if someone is interested, there it is for download
の下の行のリンクからbash本体を入手。adbでもsdカード経由でもなんでもいいのでis01に渡したあと、bashの置いてあるディレクトリにcdしてから、
# chmod 755 bash# cp bash /system.rw/bin/bash //bashの権限の確認(大切)# ls -l /system/bin | grep bash-rwxr-xr-x root root 2569259 2017-05-03 13:09 bash
のようになればok。権限が違っている場合は/system.rw/binに移動して、chmodのコマンドをやり直す。これで再起動後からターミナルでbashと実行すればbashがつかえる。
shとbashの入れ替え
入れ替えなくてもいいんだけれどもsuをするたびにshに戻ってしまうのでめんどくさい。前述の手順を踏んでいればbashは絶対実行可能!というわけで前回しくじった入れ替えもやってしまう。例によってsystem.rw前提。
# cd /system.rw/bin# mv sh sh.org# ln -s bash sh
これで入れ替えは完了、shをリネームしてbashのリンクをsh名義で貼ってるだけ。成功すれば、ターミナルの頭がsh-3.2$のように変化する。
後始末
shとbashを入れ替えるとsysremount_atmyownrisk.shが動かなくなる。この状態でsysremount_atmyownrisk.shを実行すると、systemがアンマウントされたままになってなんのコマンドも効かなくなる。が、再起動すると元通りになる。原因はis01rooterのautoexec.shが正しく動かなくなって、mtd10が作られなくなるため。対処のために書き換える。is01上でやってもいいけどPCで。
@PC $ adb pull //autoexec.shを引っ張り出す/sqlite_journals/is01root/autoexec.sh
引っ張り出したら、一行目を以下のように書き換える
#!/system/bin/sh //元
#!/system/bin/sh.org //変更後
shをsh.org以外の名前に変更した場合は、その名前に変更すること。adb pushでファイルを返した後、chmodでパーミッションを755に変更。済んだら再起動、rootを有効にしてcat /proc/mtdの出力にmtd8~10があれば成功。ダメなら何かがおかしい。

やったこと以上終わり


ファイルを必要なファイルを探し出すのになかなか骨が折れるが、こういう作業は楽しい。今後はブログ下書きなんかで大切に使っていきたい。

0 件のコメント:

コメントを投稿