Tech:android:root

出典: Tariki

目次

ROM遊びとは

IBM PC互換機でもdual bootなどといって、WindowsとFreeBSDとか2つ以上のOSを選んで使う、というのは私はふつーにやってきた。別にフリーのOSでなくても、最近のMac (Intel Mac)はWindowsとMacOSの2つをdual bootしているひとがふつーにいる。

androidマシンでは、OSそのものを入れ替えて遊ぶことができる。それはSDカードを入れ替えて電源ON/OFF、そしてちょっとの操作である。これを可能にしたのがroot取り、そして偉大なnandroidツールである。

root取り

以下ちょっと、ふつーのUNIXユーザとしての認識に立って解釈しているが、私はandroid初心者でありLinuxも本命では使っていない。だから誤っていたら謝る。

UNIXで動く携帯電話は(といってもandroidとiPhoneくらいしか知らないが)、通常一般ユーザ権限で動いている。もちろんインストールなどはroot権限でなされているし、いくつかのツールはsetuidで動いている。カーネルも特権モードで動いている。まあこれはいい。

携帯電話として購入しておまけツール(インストール済みツール)のみを使っている分には、ユーザ権限などどうでもよいように思える。しかしandroidはMarketからアプリをダウンロードしたりとか、自分で作ったりとかできるので、その中にshとかがあると、地がスーパーユーザでは何でもできてしまうことになる。

ではスーパーユーザで何かすると危険なのか (電話会社にとって、あるいはユーザにとって) といえば、これはよく分からない。電話機能のアカウンティングなどは携帯電話会社のホストがやっているだろうから特権ユーザを取ったところで不正はできないだろうし、たとえば将来電子マネーチップが電話機に内蔵されたとしても、TRM (tamper registant module)などで保護され、特権ユーザも不正はできないだろう。現行の衛星放送のデコーダに挿し込むカードや電子マネーもそうだが、要は『ホストの信頼できる手先』をいじれないチップに封じ込め、それを(不正を行なうかもしれない)ユーザの懐に預託するわけである。

ただしウィルスとかクラッキングプログラムを踏んだ場合は、もちろん一般ユーザ権限のほうが安全だ。たとえば電話帳を開くのは『メーカが信頼するおまけプログラム』であるダイヤラーとか電話帳プログラムに限定し、これはsuidで動かす。電話帳そのものは一般ユーザで開けない、というようにしておけば、クラッキングプログラムを踏んで一般ユーザ権限で実行しても何も起きない。

とにもかくにも、androidやiPhoneはエンドユーザにroot権限を解放していない。ただしandroidはGoogle developers phone (GDP) というのがあるので、これではroot権限で何かが実行できるようになっている(しかし建前ではGDPでは電話はしない、ということになっていたのではないだろうか)。

しかし世の中にはハッカーというのが必ずいるものである。rootを取りたい。そんなわけで、セキュリティホールをついてrootを奪いシェルを実行してしまうプログラムを書いたやつらがいた。iPhoneではjailbreakというが、androidでは単にsuとか言われている。

いったんrootのシェルを取ってしまえば、以後いつでもrootになれる。shをコピーしrootのsetuidを立ててしまう。

ここまでの処理は、いまでは単なるアプリになってしまって(例えば『setupsu』)、1.5ベースで売られている電話機で単にroot取りアプリを実行するだけである。これらのアプリはMarketに登場したこともあるが、削除されたか自主的に削除したか、ともかく然るべきところから野良で拾ってきて実行する。

ではrootを取れると何かよいことがあるのか。これはあるのである。いわゆる『ROMを入れ替え』好きなチューニングを施されたOSを勝手にインストールして楽しめる。実用上も、端末まるごとのバックアップを取れたりするので安全だ。このページではそれについて述べる。

偉大なるnandroid

nandroidというのは、CyanogenmodというROMの作者、Cyanogenさんの配布物に含まれていた(?)ものである。本体フラッシュメモリ (NAND ROM) 全体のバックアップをSDカードに取るツールであるが、boot時に選択できるもう一つの簡易OS、recovery flashの勝手アップグレードバージョン(メーカ非純正)に組み込まれている。このアップグレードrecovery flashを広義にnandroidなどとよぶこともある。

recovery flashの勝手バージョンへの置き換えおよびどういった機能が追加されるかということについては、『recovery flash』の項に分けたのでそちら参照。

nandroidはある瞬間のあるOSの状態・データの状態(ただしSDカードにあるものを除く)をすべて瞬間冷凍・保存できるようなものである。とはいってもOS動作中はnandroidは実行できないので(刻々書き換わっているものをダンプするのを防止するため起動メニューになっているともいえる)、正確には電源を切った直前の状態の冷凍保存である。

  • nandroidは通常、nandroidを含んだ置き換えバージョンのrecovery flash (ああややこし)から起動するが、/system/sbin/ の中に nandroid.sh というのがあってコマンドラインでも実行できる(随所で書いているようにnandroidを含んだreco(以下略)の起動中でもadb shellでrooted shからこれを実行できる)。
  • コマンドラインからのnandroidの利用については、バックアップの項にまとめました。

ROMとは

工場出荷時のフラッシュメモリ領域のイメージを、この世界ではROMとよぶ。上記Windows Mobile機のマスクROMに書き込まれているものと等価なのでROMっちゃーROMなんでしょうが、ふつうのファイルなのでROMってのもおかしな感じだ。

別のROMを新たに試す

ROMを入手してあなたのandroidのflash recoveryがnandroid化されていたら、あとは

  1. SDカードのFAT32(Windows)領域にROM (.imgファイル)を移す
  2. nandroidでboot
  3. (※ 通常はここで前のバージョンのイメージをバックアップ→SDカード入れ替え)
  4. メニューで『任意のzipを展開』でインストール
  5. 再起動

という手順でOSの書き換えが完了だ。

なお※のバックアップの手順については (1a) まったく別のROMに入れ替えたいけど今までのアプリの設定は要らない (1b) まったく別のROMに入れ替えたいけど今までのアプリの設定を残したい (2) 同じROMのアップバージョンに上げたい などによって異なる。さらに入れ替え前のOSがa2sdを使っているかどうかでバックアップの仕方も異なるので、後ろのほうにまとめて章を作っておいた。

この状態では、いわば工場出荷時(電気屋さんで端末を買って電源を入れた瞬間←この喜びを店員に奪われてしまった場合、もう一度体験することをお勧めする(笑))に戻すわけだから、『使える』状態に整備するのには手間が必要である。

いったんあるROMをインストールし使える状態に環境を整えたら、それ以降OSを入れ替えて遊ぶためにはインストール用のROM (.imgファイル) は要らない。異なるOSにほいほい入れ替えて遊ぶ場合は、ある瞬間のOSの『瞬間冷凍保存』が必要になる。

運用中のOSを別の運用中のOSに入れ替える

現在の状態を冷凍保存し、別の冷凍保存してあるOSに入れ替えたければ

  1. nandroidを含(略) recovery modeでboot
  2. 現在のバージョンのバックアップを取る
  3. 入れ替えたいnandroidバックアップがあるSDに入れ替えて
  4. nandroidリストア
  5. 再起動

という手順になる。電池を外さなくてもSDは入れ替えられるので、手順1.以降は電源を入れなおす必要もない。

  • なおこの手順は電池残量が十分(半分以上)ある状態で行なって欲しい。USB電源を接続していても、recovery modeではそちらは使われないようである (充電がなされるのは電源OFF(ハードウェア制御と思われる。充電が遅い)のときとandroid OSが起動しているとき(ソフトウェア制御と思われる)だけみたい)

これでSDカードごとROMを書き戻すとあら不思議、最後に電源を切った状態の続きからすべてがはじまる。もちろんクラウドなデータはオンラインにあるので最新のものに同期されるが、本当に器だけ同じで中身がまったく違ってしまっている。多重人格、ジキルとハイドの世界である。

だから私は、実用機・開発機とか2台以上必要かな、と思っていたが、実際使ってみると一台で事足りている(うーんでももう一台欲しいかなあ)。むしろ日本の3Gデータ通信が地獄のように悪い環境なので、音声通信用とデータ用(android)の2台になっちゃっている(笑)。

なおこれは、すべてのプログラム・データを丸ごとバックアップしてしまうときであるから、一部のプログラムやデータを残しつつOS本体のみ入れ替え(あるROMのバージョンアップ)するときには向かない。むしろ工夫 (必要なものだけバックアップを取り、前節のROMのインストールをし、バックアップを書き戻す) が必要で面倒だ。それらの工夫はバックアップの項に書く。

ROM遊びのコツ

バックアップとリストア

まず、新しいROMを試す前に古い使用状態でのバックアップを取っておくというのは、単純に元に戻すために必須である。バックアップについては奥が深いので (んなことない) バックアップとリストアの項に書いておいた。本体ROMだけなら上記のようにnandroidでOKで、a2sdパーティションがある場合はRA recovery flash状態でadb shellして、SDのlinux領域のtar ballをFAT領域に作りましょう、というのが要約である。

次に、(1a) まったく別のROMに入れ替えたいけど今までのアプリの設定は要らない (1b) まったく別のROMに入れ替えたいけど今までのアプリの設定を残したい (2) 同じROMのアップバージョンに上げたい といったケース別で準備は異なる。

まず別のROMに入れ替えたい場合は、次に述べるようにSDカードは分けたほうがよい。新しいSDさえ用意すれば(1a)のケースはいちばん簡単といえる。新たな気分で本体を全部wipeしてSDを入れ替え、新しいROMをインストールするだけである。

(1b)は移行したいアプリの設定がいちばん面倒だ。クラウド環境はバックアップ→リストアの必要はなし、アプリはアプリ自体のバックアップを取るツール(Astroのアプリケーションマネージャなど)を使うかMarketから再インストールする。SDにそもそもとっておくべき音楽や写真データは古いSDから新しいSDへ泣きながらコピーすればよい (※ パーティショニングされたSDは単純にWin/Mac母艦に挿せないので、その場合は古いOSが動いている時点で母艦にいったん吸い上げる)。だからいちばん面倒なのは、アプリの設定(ブックマークやプレイリストなど)だろう。だから古いOSが動いている時点でいろいろな準備が要る。これについてはバックアップとリストアの項に詳しく書いた。

(2)はちょっと後で述べますね。

SDカードは分ける

このような理由で、SDカードは一OSにつき一枚、というのが楽である。上記では書いていないが、FATパーティション以外にSDカードをパーティション分けしてlinuxのext2/ext3パーティションが必要な場合がある(後述・a2sdを利用するROM) し、linux-swapパーティションが必須のROMもある。

このような場合でも、本体フラッシュの中身は全部SDのFAT領域に移動してくれるため、上記のようにバックアップ→SD入れ替え→リストアで全環境が元に戻る。なお別項でext2/3パーティションのバックアップ(これは純然たるバックアップ、リスク回避のためにコピーを残しておくという意味だ)について述べているが、SDごと丸々入れ替える場合はSD領域は移転してしまうのだからSD領域の移転のためのバックアップは必要ない (なんのこっちゃ)。

2GのマイクロSDなど、きょうびはスーパーのレジの脇 (買い忘れはありませんか? ってやつ) の吊るしで、Class 6のが千いくらで売られていた(泣)。だからけちけちする必要もないのだが、物理的にSDカードが足りなければ、今度はSDカードのFAT領域を母艦PC(ディレクトリを切っておくとよい)に移転してしまって、SDカードを空にして別のOSに入れ替えるということもできる。このときはext2/3パーティションのバックアップをFAT領域に作っておいて一緒に母艦に移動(母艦がLinuxなら直接SDをマウントしてバックアップをとってもよいと思うが)しないと、再度書き戻すときに元に戻らない領域があることになる。

私は気に入ったOSが安定していないときなどは、マイクロSDを4枚くらい(あとSIMも3枚くらい)を、SDカードのアダプタの入ったプラケース(3センチ四方くらいのやつ)にしゃらしゃら入れて持って歩いている。これって電源を同時には入れられないandroid機を5台持って歩いているのと同じわけだから、すごい(笑)。時間はそれなりに掛かる(5分くらい)が、マクドナルドでコーヒーを飲みcupcakeを食べながらOSを1.5→1.6に入れ替えたりしている (実話ですけど(爆))。

同じROM内でのバージョンアップ

同じROM内では、必ずしもwipeは必要ないことがある。親切なROM作者なら掲示板に「どれどれのバージョンからのアップグレードの場合wipeが必要」とか書いてくれている。wipeというのは他項で書いたが、いわゆる『あなたが買った状態』になるわけではなくて、『ふつーの(ROM遊びとかしない)いじりかたをしていていじられたと思われる部分を消すだけ』なので、ほんとうの意味の工場出荷時に戻るわけではない。

ROMというのは何かというと、カーネルやUNIXのツール群 (dalvikのエンジンなんかも含まれるかも)、『工場出荷時』(野良ROMの場合は『ROM作者出荷時』) に入っているアプリ群 (Google/HTCアプリとか。ホームアプリも含まれる)、場合によってはアイコンや壁紙といったテーマ、など (なんか忘れているかもしれないけど) の集合体である。

だから古いROMが動いている状態でwipeしないで起動しません、というのは、おおむね

  • UNIX/dalvik vmが使うファイルののディレクトリ構成が変わった
  • 『工場出荷時』に入っているアプリがバージョンアップされていて、古いアプリのキャッシュが残っていて悪影響

などという場合のような気がする。

まあ原則他のROMから移行する場合はwipeしたほうがよいと思うが、同じアプリでディレクトリ構成が変わったとかいうことはあまりない(稀にある)。

キャッシュの消去についてはRA recovery flash状態でadb shellして手でキャッシュのディレクトリを消してもよいのだが、RA recovery flashの最近のバージョン (1.3.2とか)では、『キャッシュの消去』『dalvikキャッシュの消去』(どう違うんだ? 両方やっとけばよいけど)というのがついている。

だからまとめると、データ移行をなるべくしたくない場合は

  1. 古い動作状態でnandroid(ほか)で瞬間冷凍
    →データ移行もできるように準備はしておく
  2. まず新しいROMを上書き、再起動
    →動けばらっきー(笑)。
  3. ダメなら古い動作状態まで戻して、キャッシュの消去だけしてみる。
  4. もう一度新しいROMを上書き、再起動
    →動けばらっきー
  5. ダメならきちんとwipeする
  6. 新しいROMを展開、再起動
  7. データをリストア

という手順を試してみればよいと思う。

その他

Can't format systemエラー

上記のようなバックアップを行なってからそのまま(再起動せず)RA recovery flash内でROMをインストールしようとしたら

E:Can't Format SYSTEM 

なるエラーで展開が止まってしまったことがあった。原因は、マウント状態のようである。つまりrecovery flash内でいろいろ作業をするためにmount -aとかしていると、recovery flashが新しいROMをインストールできないようだ。

  • On recovery flash, after "mount -a" , do something from adb shell, then try to install new ROM causes "E:Can't Format SYSTEM" . This can be prevented by rebooting before installing new ROM.

したがっていろいろ作業をした後続けて新しいROMをインストールする場合でも、いったんrebootしてからのほうがよいと思う。なおrebootするときは、メニューを選んですぐHome (+ 電源? 要らないかも) ボタンを押せば、次もrecovery flashでちゃんと立ち上がる(wipeとかしちゃってるんだったら、OSが立ち上がりそうになったら電池を抜こう。

adb lolcat logcatの活用(?)

新しいROMをインストールした後は、起動に5分くらいかかることがある。この間起動しないスクリーンを見つめて不安に……というのを防ぐために笑う猫、いやadbのlogcat機能がある(うそだけど)。

まず初回起動に時間がかかるというのは、毎回の起動時は(キャッシュが存在しない)アプリのdalvik cacheを作っているからだ (逆にいえばキャッシュは消してしまっても構わないということである)。これはインストーラ(Marketから)でインストールしたときでも行なわれていることだが、1アプリずつではなく『工場出荷時』の全アプリ(上記のようにキャッシュは消してアプリは残して新しいROMを上書きしたらもっとあるだろう)のキャッシュを作っているから時間が掛かる。

この間はlogcatの出力をみていると『installd』『dalvikvm』ではじまる行がわんさか出てくるのでそれとわかる。

次にシステムの起動にかかるが、ここでいわゆる『レンガ化』してしまった場合は、理由はともかく(もしROM作者にフィードバックするならログを残しておくとよいだろう)、起動シーケンスがループするからなので、みていると繰り返し同じ出力が出てくるからわかる。

まあ新規インストール後30分経っても起動しなかったら諦めましょう、みたいにいわれているが、上記観察があればもっと早く諦められる(笑) (精神的にも楽でしょ)。


1.6ではrootは取れるか

さて公式1.6ROMであるが、現状(2009. 12現在)では1.6のrootを簡単に奪えるツールはない (セキュリティホールがみつかっていない) らしい。

最初にrootを奪うためのセキュリティホールは1.6では塞がれ、なおかつ1.5→1.6への公式アップデート時にはrecovery flash領域も、各ディレクトリのsetuidフラグも元に戻されてしまうからである。とはいってもそうなったら下記のようにダウングレードで1.5に戻せるが。

  • 現状で1.6でrootが取れている端末というのは存在するが、これは最初から1.6でなかったもので(まだ世の大半のandroid端末はそうだろう)、1.5でrootを奪っておいて、公式1.6のスクリプトを改造して実行し上記のrecovery flash領域・setuidフラグを元に戻す操作を削ってしまう、というものである。詳しくはHT-03A 公式1.6 with rooted (コムギドットネット)などにあるので参照してほしい。
  • そのほか、購入時に1.6であった端末はHT-03公式1.6から1.5へダウングレードしてみたなどにある方法で1.5にダウングレードし、その後ROM遊びできます。

したがってROM遊びができる状況では、公式1.6にするメリットはほとんどない。野良ROMはインストールするとき上記の『rootedを塞がれる』おそれなく入れ替えられる。またたいていの野良ROMは、野良と書いているがより進んだスケジューリングアルゴリズムを組み込んだLinuxカーネルなどのおかげで、公式ROMより速い。公式のメリットは『安定している』こと、全デバイスが問題なく使えること(野良はやれLEDが灯かないのGPSが動かないのMVNO (3Gモデムの電源制御) がうまくいかないの、ということが起こる)、くらいだろう。

逆に公式にしてしまうと(ダウングレードの逃げ道は残っているが)それ以降ROM遊びができないというデメリットがある。それはおそらく近い未来、2.0が出ても2.1が出ても同じである。iPhoneで問題になっているセキュリティホール塞ぎとハッキングのいたちごっこ状態になるかもしれない。

私自身はというと、まず1.6では野良ROMでさんざ試しており、MVNOのSIMが使えないことを確認しているので、あえてアップグレードしていない(実は公式では使える可能性もあるのだが、そういう報告はみたことがない)。SuperMagic系では1.5ながら1.6ツール・UIも(ほとんど)使えているので不満はない。dalvik cacheで速くなるのは魅力であるが、32Aではメモリも多いこともあり、あまり不自由は感じない。1.5で使えず1.6で使えるもので欲しいアプリといえば、Google Maps 3.2とVoiceSearchくらいか。

したがって私もHTCのページから公式ROMはダウンロードはしたものの、一回もインストールしてみていない (いやふつーは一回しかしない(笑))。

ROM遊びはこの先生きのこるか

HTCはハードウェア依存のカーネルデバイスドライバなどのソースも自社webで公開している。これがLinuxとかandroid OSのポリシに基づくもので必ず守られなければならないのかどうかはわからないが、もしそうでないとすると、今後他社から発売されるであろう多数の機種ではROM遊びはできないことになる。

またもしユーザが勝手に野良ROMを作ってコンパイルすることができたとしても、インストールがままならないであろう。1.6や2.0以降で簡単『す』ができる手法がみつからない限り、いまの1.5ダウングレードの手法で勝手にROMを載せかえることができるのは、公式で1.5が存在したことがある機種(つまりHTCのdream/magic/hero、SAMSUNGのGalaxy)に限られると思う。

野良ROMでチューニングされている部分は、機種依存の部分が多いように思う。また野良で、ある機種が備えているデバイス(センサや通信機能など)の一部が使えなくなってしまうことはよくある。

だからどんなにCPUパワーが非力でもメモリが少なくても、現在のmagic/heroあたりがROM遊びとしては頂点になるのかもしれない。

あともうひとつ心配しているのは、ハッカーの分散ぐあいである。現在は、androidといえばほとんどHTC機(その間にハードの互換性もまあ、ある)なので、ROMも選り取りみどり状態である。だがこの先、android機の選択肢が増えると、android OS/Linuxカーネルそのものはフリーであっても、それを組み込んだROMのハード依存の部分はほとんどうまく動かないという状態になるかもしれない。現在でも32B開発者は32Aを相手にしない(数は少ないがその逆も)という現象があるので、ハッカーのパワーがメーカの数(メーカ内ではハードの互換性はある程度保たれるかもしれない)・機種の数だけに分散してしまうと、やはりいまがROM遊びのいちばん美味しい時期なのかな、と、ちょっとさびしく思う。