Tech:android:recoveryflash
出典: Tariki
目次 |
recovery flash - android機のもうひとつのOS
ROM遊びの項で紹介したように、神バックアップツールnandroidを含んだ高機能recovery flash (これまた神) について紹介する。これはRamonさんが作ったもので、RA recovery flashなどとよばれている。
このバージョンのrecovery flashでは
- (工場出荷時に初期化 ※後述)、○ SDや本体のdalvikキャッシュだけの消去
- (rebootやsh)
- 端末フラッシュメモリ丸々バックアップ/リストア、○版を選んでリストア
- 任意の.zipファイルを展開
- ○SDカードのパーティショニング、ext2(3)パーティションの修復
- ○その他: SDカードの母艦へのマウント、おかしなパーミッションのファイルの復旧
といったことができる (上記『(…)』内はデフォルトのrecovery modeにもある機能、無印はRA recovery flash 1.2.1にある機能、○印は1.3.2の機能)。
nandroidは安全なのか
『ROM遊び』の項で紹介したように、nandroidでほいほいOSを書き換え。こんなメーカ非推奨の危険な遊びをして危険はないのか。
ここでandroid (magic)の構造について述べておく。
本体フラッシュは3つの領域に分かれていて、(1) android OS (2) recovery flash (改造後はnandroid付き) (3) fastboot という3つの実行主体がある。(1)は通常の起動、(2)はHome + 電源ボタンで起動、(3)はback ← + 電源ボタンで起動すると入れる。
(2)実行時に(1)を書き換える (必要があれば(1)実行時に(2)を書き換える) ことで、安全にOSのバージョンアップができる、という仕掛けである。なお(3)で(1)や(2)を元に戻せるらしいが、私はメニューに入ってみただけで何も実行したことはない。
iPhoneではよくOSの入れ替えに失敗して『レンガになった』(電源が入らないiPhoneはただのレンガにみえるから) というが、androidもよくレンガにはなる(最悪アプリケーションのバグでレンガになったことがある)。だが修理に出す必要はほとんどなく (iPhoneは故障修理扱いなのかな?)、慌てず騒がずnandroidを起動してバックアップしてある任意の (正常に動いていた) ROMのイメージを流し込んでやれば元に戻る。
なおデフォルトでもnandroidでも、(2)起動のメニューにある『工場出荷時に戻す』というのは、/data/ (および /system/ 領域の一部?) をクリアしてしまうだけである。買った状態には戻らない。
- このへんは他のモバイルOS (Windows Mobileなど)とは異なると思う。つまりWindows Mobileでは、フラッシュメモリ(書き換え可能)に初期イメージが書き込まれているが、これは書き換えることができる。工場出荷時イメージはマスクROMみたいなものに書き込まれていて、工場出荷時リセットをするとこれを再ロードしてくれる。
- androidではそのようなイメージがどこにもなく、単なる『後からいじられた/作られたエリア』をクリアするという動作をする。だからクリアされない領域をいじっていれば、それは残ってしまう。不調があればクリアしても起動しないことがある。
- nandroidができてから、上記Windows Mobileの初期化用イメージのようなもの (グレーかもしれないが配布もされている) を母艦PCに取っておくことで、ほぼ同様の初期化ができるようになった。
nandroid領域が壊れたらというと、これはrecovery flasherなどのツールで通常のandroid OS起動時にここを書き換えられるので (もちろんrootが取れている場合に限るが)、これも問題ない。
だからnandroidが危険かといわれると、むしろnandroidがなくてバックアップが取れないメーカ純正の状態のほうが危険であるといえる。
- ただしnandroidリカバリ中は、リカバリ領域のリカバリもしているみたいなので(? よくわからないが)、まずいバックアップを書き戻している途中で電池を抜いたりしたら、両方ともダメになるかもしれぬ。
- → 実際私は、最初にnandroidへの書き換えを行なったとき失敗してしまった(ようだ) (おそらく原因は、それ以前にインストールしていたsuid shellとbusybox (後述) (←recovery flasher自体がrootを奪ってくれるので、これらは必要ない) がrecovery flashで書き込まれるそれらとかち合ってしまったことにある)。だが通常のandroid領域はそのままなので、もういちどnandroidをインストール、今度はうまくいった。ただしこのおかげでオリジナルイメージのrecovery flash領域のイメージは失われてしまった。
高機能recovery flash (nandroid/busyboxもご一緒に) の初回インストール
まずRA recovery flashのイメージ(.imgファイル)を入手する。なおこれは32A用と32B用があるので、自分の機種に相当するほうを間違いなく落として当てないといけない(日本で一般的なNTTのOEMは32Bだ)。
初回の書き換え作業は、recovery flasherというアプリを使うのが楽だ。
rootedでないROM (ただし1.5ね) でこのアプリを実行すると、rootになって上記recovery flash領域を指定したrecovery flashイメージに書き換える。とその前に、オリジナルのrecovery flash領域もダンプを取れるので取っておく(修理に出すときなどは戻そうね)。
あとはnandroidで起動すれば、好きなバージョンのROMで本体(メインOS領域)を書き換えられる。好きなだけROM遊びを楽しんでくれたまえ。
ちなみに高機能版のrecovery flash (オリジナルも) はLinuxで動いている(高機能版はsetuid shだ)。だからより複雑な操作をしたい場合は、母艦PCに接続し、adb shellを実行すれば、通常起動時と同じようにUNIXコマンドが使える。recovery flashのメニューに『shellを実行する』というのがあるので、長らくこれを選んでからshellを実行していたが、実はrecovery flashが起動した瞬間からadbとの通信はできるので、そのまま裏でadb shellが実行できる。
それからbusyboxというのもインストールしてくれる。これは小規模・非常時用UNIXでよくある複合バイナリで、スタティックリンクでツール群を32個とか64個とか用意したいけどライブラリのprintf()が32倍とか64倍コピーされるのはムダでしょ、じゃあshとtarとddとかのソースをまとめてコンパイルして(同一バイナリにリンク張って)、argv[0]をみてshになったりtarになったりddになったりとかするツールを作りましょ、というアレ(知らねえって)である。FreeBSDでいえば、/sbin/ の中のコマンド(知らねえってば)である。
androidのbusyboxはリンクが張られていないのかな? (かなりのコマンドが増えたように感じたがもともとあったかも知れぬ)
busybox tar 引数...
のように使う。
オリジナルのrecovery flashとオリジナルの配布ROM
そういうわけでオリジナルのrecovery flashは一回も有用に使ったことがないので、以下は憶測になるが。
オリジナルではおそらく、実行されるシェルも一般ユーザの権限だろう。バックでadb shellも動くかもしれないだろうが、suはできない。そして公的な配布ROM (たとえば最近ではHTCやNTTから配布された1.6のバージョンアップがある)は、suidされたインストーラでインストールされるのだろう。
これがどんな野良ROMでも働いてしまわないように、ROMには署名されていることが求められている (そうでなければ適当なROMを作り、suidしたshを潜ませておけばrootを奪えてしまうことになる)。もっともこれすら署名ツールみたいなのがあるみたいである。
もちろんnandroidでは署名されていないROMでもインストールできる(? と思う)ので、いったんrootの垣根を乗り越えてしまえば何でもやり放題(笑)ということになる。
つまり『あればより安全な』フルバックアップツールを許していない、というのは、ひとえに一般ユーザ→rootの垣根を一回も乗り越えられないための対策なのである。だいたいrootで何が電話会社に損失になるのかよくわからない (現状のビジネスモデルではtetherを動かされると損、とかあるが、それは別の問題だろう)。危ないかもしれないとか予断に基づく過保護な禁止ならやめていただいて、rootをふつーに開放してほしいものである。
recovery flashのアップグレード
- http://forum.xda-developers.com/showthread.php?t=530492 [Recovery] [32A & 32B] [15-Nov-2009] RA-magic-v1.3.2
最近、RA recovery flash 1.3.2が出ていたので書き換えてみた。もともとの1.2.1でもROM遊びには使えていたのだが、およそ考えられるrecovery flashにいるときの欲しい機能 (このページ一番上参照) がすべて実装されていたのには驚いた。
これも上記と同じrecovery flasherでできるだろうが、今回はコマンドラインから。
まず再起動し、recovery flashに入る。あれっと思ったのだが、これができるということはrecovery flashが動いている状態でrecovery flash領域は書き換えられる、ということだ。
adb shell ← Win母艦のコマンドプロンプトから # mount /sdcard # exit ←※ adb push recovery-RA-magic-v1.3.2H.img /sdcard/ ←※ Win母艦のコマンドプロンプトから adb shell ←Win母艦のコマンドプロンプトから # flash_image recovery /sdcard/recovery-RA-magic-v1.3.2H.img # reboot
なんて簡単。なお※は別にここでやらなくても、再起動する前にSDカードにコピーしておけば何でもいいです。
