« mmcblk3の領域 | トップページ | Linux kernel ビルド »

2011年4月 7日 (木)

リカバリーモード時のadb接続

Android のリカバリーモード(HOMEキーを押しながら電源ON)したときにでも、
PCとUSBケーブルで接続し、ADB経由でファイルのpushやshellで入れるように設定する。
その方法のメモ。

Life Touch Noteをadbで接続するときに必要となるUSBのIDは以下のとおり。

Life Touch Noteの設定も「USBデバッグ」をONにしておく。

ベンダID:0409
プロダクトID:0301
/etc/udev/rules.d/に51-android.rulesというファイルを作って認識するようにしてある。
SUBSYSTEM="usb",SYSFS{idvendor}="0409",mode="0301",GROUP="xxxxx"
xxxxxはLinuxでログインしているユーザー名

必要なもの

  • root化
  • busybox
  • sdcard
  • Linux PC
  • バイナリエディタ
  • android sdk(adb、mkbootfs、mkbootimg)

busyboxはLifeTouch Noteで動くものを入手する。
私はPC上でクロスコンパイルした。
(どこかでダウンロードしたbusyboxは起動しなかった)。
busyboxのdd、mount、shコマンドを使用する。

まず、コンソールを表示する。
これはLifeTouchNote本体にTerminalソフトを入れるか、
PCとUSBケーブルを接続し、adb shell コマンドを使用する。

リカバリーモードのイメージはddコマンドで吸い出す。
イメージが格納されているパーティションは、ロットとかモデルによって違うかもしれない。
操作を誤ると起動しなくなったり、メーカー修理になることもあるので注意すること。

suでsuper userになる。
そのあと、mountコマンドでマウントされているパーティションを調べる。
(busyboxのmountじゃなくてもいいかもしれないが、元からmountコマンドが使えたか忘れた)

$su
#busybox mount
/dev/block/mmcblk3p2 /fdt
/dev/block/mmcblk3p6 /system
/dev/block/mmcblk3p9 /data
/dev/block/mmcblk3p7 /cache
/dev/block/mmcblk3p1 /misc

とか出てくる。
マウントされていないmmcblk3p3が、リカバリー用パーティションと仮定する。
(/dev/block/mmcblk3p4は拡張パーティションだった)

ddで抜き出し、SDに保存する。
#dd if=/dev/block/mmcblk3p3 of=/sdcard/recovery.img

ついでにバックアップ目的で/systemも保存しておく。
#dd if=/dev/block/mmcblk3p6 of=/sdcard/system.img

このrecovery.imgがAndroidのboot.imgもしくはrecovery.imgなら以下のようになってる。
ファイルの先頭から
Offset:0-7:ANDROID!
Offset:8-11:Linuxカーネルのサイズ
Offset12-15:Linuxカーネルがメモリーにロードされるアドレス
Offset16-19:initramfsのサイズ
Offset20-23:initramfsがメモリーにロードされるアドレス

実際に抜き出したものは以下のようになっていた。
Offset0:ANDROID!
Offset8:002BDEA4
Offset12:10008000
Offset16:00029DD1
Offset20:11000000

recovery.imgをzImageとinitramfsに分解する。
PCのLinuxで操作する。

分解用のperlスクリプトがあるみたいだが、リンク切れで入手できなかった。
なので、自分でc言語で抜き出しソフトを書いた。

「android_split.c」をダウンロード
gccでコンパイル可能。
gcc -o android_split android_split.c

以下のようにするとファイルが抜き出せる。
$android_split recovery.img

できるファイルは3つ。
android.header.bin
android.kernel.bin
android.ramdisk.bin

android.header.binはファイル中の先頭から2KB。ヘッダやコマンドライン等が入っている。android.kernel.binはzImageそのもの。android.ramdisk.binはinitramfs。

抜き出したinitramfsを以下のようにしてファイルとして取り出す。
ramdiskというディレクトリを作ってその中に書き出す。rootになって行う。

#mkdir ramdisk
#cd ramdisk
#zcat ../android.ramdisk.bin | cpio -id

ファイルを変更する。
<が変更前、>が変更後の行
adbで接続可能にして、接続後はroot。

[default.prop]
#ro.secure=1
ro.secure=0

#ro.debuggable=0
ro.debuggable=1

#persist.service.adb.enable=0
persist.service.adb.enable=1

必要なファイルのコピー(PC上のrootで)
Life Touch Note上で動作するbusyboxをramdisk/sbin/にコピーする。
#cp ../busybox sbin/
#cd sbin
#chmod 755 busybox
必要そうなコマンドも作っておく。
#ln -s /sbin/busybox /sbin/ash
#ln -s /sbin/busybox /sbin/dd
#ln -s /sbin/busybox /sbin/mkdir
#ln -s /sbin/busybox /sbin/mount

adbでの接続時は、/system/bin/shが必要なので
mkdirでディレクトリがなければ作って。
/sbin/busyboxへリンクしておく
#cd system/bin
#ln -s /sbin/busybox sh

変更準備が終わったら、新recovery.imgを作る。

ramdiskの上の階層へ戻って以下のコマンドを実行。
$mkbootfs ./ramdisk | gzip > android.ramdisk-new.bin
$mkbootimg --kernel android.kernel.bin --ramdisk android.ramdisk-new.bin --base 0x10000000 -o recovery2.img

これをLife Touch Noteに書き込む。
(最初に抜き出したrecovery.imgをとっておけば、いつでも戻せる)
$adb push recovery2.img /data/local/tmp/
$adb shell
ここからLife Touch Note
$su
#cd /data/local/tmp
#ls
でファイルがあるかを確認。
そして、リカバリーパーティションへ書き込み。
(間違って違うところに書き込まないように注意)
busybox dd if=/data/local/tmp/recovery2.img of=/dev/block/mmcblk3p3

これで、HOMEキーを押しながら電源ONにすると、リカバリーモード上からadbで接続可能になる。

« mmcblk3の領域 | トップページ | Linux kernel ビルド »

LifeTouch Note」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: リカバリーモード時のadb接続:

« mmcblk3の領域 | トップページ | Linux kernel ビルド »