« 2011年3月 | トップページ | 2011年5月 »

2011年4月

2011年4月28日 (木)

LifeTouch NoteにDebianを入れる1

Life Touch NoteにLinux(Debian)を入れ、ブートさせることに成功したのでメモ。
以下Life Touch Noteは長いのでLTNと略して書く。

手順は以下のとおり

  1. SDカード上にLinuxのルートファイルシステムを構築。
  2. Androidでchrootした環境でDebianの設定
  3. リカバリーモード用のinitramfsを書き換え
  4. Linuxブート後の設定

事前に必要なこと

  1. LTNのroot化
  2. LTN上で動くbusyboxの用意
  3. Android上で無線LANの接続設定
  4. PCにadbでLTNに接続できる環境。またはLTN上で動く端末ソフトのインストール

この記事は上級者向けです。手順を間違えるとLTNが起動不能になる可能性もあります。

入れるLinuxはDebianのlenny。
最新のsqueezeにしたかったが、LTNのLinuxカーネルとの相性が悪くudevが動かない。(squeezeには、signalfdを有効にしたカーネルが必要だが、LTNのカーネルは有効になっていない)

今回は16GのSDHCカードを使用した。

SDにパーティションを切ってext3でフォーマット。
1番目はext3。2番目のパーティションはスワップ用に確保。
Command (m for help): p
Disk /dev/sdc: 15.9 GB, 15931539456 bytes
256 heads, 63 sectors/track, 1929 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1        1793    14458720+  83  Linux
/dev/sdc2            1794        1929     1096704   82  Linux swap / Solaris

最初この実験のため、SanDisk 16GB (Extreme Class6)のカードを購入し、それにLinuxの起動に必要なデータを入れて試していたが、apt-get 中、頻繁にwriteエラーやmmapエラーが出る。すごく不安定で使い物にならないので、違うPanasonicのSDカードで試してみると、エラーはまったく出なく調子が良くなった。

私のLTNと購入したSanDiskのカードとの相性が悪いのか、SanDiskのカードが壊れたのかわからない。でもSDカードにLinuxを入れて使うなら、PanasonicのSDカードが良いかもしれない。
使用しているのがPanasonicのSDHC 8GB(Class4)とPanasonicのSDHC 4GB(Class10)のもの。なるべくなら読み書きが早いほうがいい。

1.SDカード上にLinuxのルートファイルシステムを構築。

SDカード上にfdiskでパーティションを作成し、ext3でフォーマットする。ext4にしたかったがLTNのカーネルがext4をサポートしていなかったのでext3にする。
以下の作業はPCで行う。

私の環境だと、sdc1がSDカードの第1パーティション(PCのHDDと間違わないように注意すること)。

#mkfs.ext3 /dev/sdc1

次に、debootstrapコマンドで、最小構成のルートファイルシステムを作成する。
debootstrapコマンドがなければインストールする。

#apt-get install debootstrap

PCにディレクトリを作り、そこにLTN用のルートファイルシステムを作成する(/xxx/yyy/deb5以下に作成)。

#mkdir /xxx/yyy/deb5
#cd /xxx/yyy/deb5
#debootstrap --foreign --arch armel lenny /xxx/yyy/deb5 http://ftp.debian.org/debian/

昔、SharpのZaurusをDebian化しようとしてdebootstrapを使ったとき、--foreignオプションがうまく機能しなかった。今ならできるようだ。

apt-getでソフトを入れるために、SDカードに/etc/apt/sources.listを入れておく。
PCでDebianが動いているならPC上のsources.listが使えるので、
それをSDカードにコピーする。sources.listの中身にsqueezeを指定してあるなら、
編集してlennyにする。ここではいったん規定の/etc/apt/の下ではなく/にコピーしておく。

#cp /etc/apt/sources.list /xxx/yyy/deb5/

deb5をtarで固めてSDカード上で展開(/mnt/hd1はマウント先の例)。

#tar cfz ../deb5.tar.gz *
#mount /dev/sdc1 /mnt/hd1
#cd /mnt/hd1
#tar xfpz /xxx/yyy/deb5.tar.gz
#umount /mnt/hd1

2.Androidでchrootした環境でDebianの設定

ここからはLTN上で作業する。

SDカードをLTNに挿入してLTNを普通に起動する。
LTN上で動いている端末ソフトか、PCからLTNへadb経由で接続し、LTN上のコンソールにて操作できるようにしておく。

SDカードに作ったルートファイルシステムにchrootする。
chrootした環境でdebootstrapの2nd stageを実行する。
Android上で無線LANにてネットワークに接続可能になっていれば、chrootした後の環境でもネットワークに接続することが可能。それを利用して必要なソフトもインストールできる。

以下LTN上のコンソール。
(mmcblk2p1 はSDカード)

$su
#busybox mount /dev/block/mmcblk2p1 /sdcard
#busybox chroot /sdcard
#export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/debootstrap
#export TERM=linux
#mount -t proc none /proc
#mkdir /dev/pts
#mount -t devpts none /dev/pts
#mount -t sysfs none /sys
#debootstrap/debootstrap --
second-stage

Base system installed successfully.
と出て終了するはず。

apt-get コマンドで必要になりそうなものをインストール。
/にコピーしてあったsources.listを規定の場所へ移動しupdate。

#mv /sources.list /etc/apt/
#apt-get update
#apt-get install wireless-tools
#apt-get install wpasupplicant

Debianで起動させるための事前設定をする。

ユーザーの追加やrootパスワード、hostname、キーボードの設定をする。

#adduser xyz
#passwd
#echo "xxx" > /etc/hostname

タイムゾーンをTokyoに設定。
#dpkg-reconfigure tzdata
キーボードをJapaneseの106に。
#apt-get install console-tools

chroot環境を抜けて、Android上の/dev/ファイルの中身をSDカードの/dev/へコピーする。
#exit
lsでAndroidのルートファイルシステムが表示されることを確認。
initやinit.rcが見えればよい。

#cd /sdcard/dev
#busybox cp -R /dev/* .

続きは2で。



| コメント (0) | トラックバック (0)

2011年4月10日 (日)

Linux kernel ビルド

Tegra dev-kit 用のLinux kernelを取得して、実機の/proc/config.gzを元にLinux kernelをコンパイルしてみた。

コンパイルは問題なく終わり、試しにリカバリー用のrecovery.imgに新しくコンパイルしたzImageを入れかえて起動させてみた。
すると、起動中のUSB Ehci のメッセージが出るところで
「!!! Error in accessing ULPI」
と出て止まってしまった。

USBのHost側を無効にして再びトライ。
今度は、タッチパネル系のメッセージでリードできないというのが永遠と出力され続ける。

タッチパネル系の機能も無効にするとやっと起動した。
でも、
本体のキーボードをいじっても反応なし。
本体のSDHCスロットも使えない。

tegraのdev-kitとHW構成が違うからだめかも。

せっかくなので、/sys/bus/platform/devicesの内容以下にメモしておく。
(どのH/Wが有効になっているかの手がかり)

  • 普通に本体を起動したとき

alarm
android_usb
asari-gps-rfkill.0
headset-switch
lbee9qmb-rfkill.0
nvaes
nvec
nvecUpdate
nvec_leds
nvrm
nvtegrafb
power.0
serial8250
serial8250.0
tegra-ehci.2
tegra-sdhci.0
tegra-sdhci.2
tegra-sdhci.3
tegra-udc.0
tegra-Msensor
tegra-battery
tegra_gart
tegra_grhost
tegra_i2c.0
tegra_i2c.1
tegra_i2c.3
tegra_regulator
tegra_rtc_odm
tegra_spi.0
tegra_thermal
tegra_touch
tegra_uart.1
tegra_uart.2
tegra_vibe
usb_mass_storage

  • ビルドしたカーネル

alarm
android_usb
lbee9qmb-rfkill.0
nvaes
nvec
nvrm
nvtegrafb
serial8250
serial8250.0
tegra-sdhci.0
tegra-sdhci.1
tegra-sdhci.3
tegra-udc.0
tegra-battery
tegra_gart
tegra_grhost
tegra_i2c.0
tegra_i2c.1
tegra_i2c.3
tegra_nand
tegra_regulator
tegra_rtc_odm
tegra_spi.0
tegra_uart.1
tegra_uart.2
tegra_uart.3
usb_mass_storage

| コメント (1) | トラックバック (0)

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で接続可能になる。

| コメント (0) | トラックバック (0)

« 2011年3月 | トップページ | 2011年5月 »