NECのAndroid端末「Life Touch NOTE」にDebian GNU/Linux をインストールした時の覚え書きです。
root 権限の奪還
ホストマシンにAndroid SDKのインストールしたら、USBでホストとLTNをつないで、以下の手順でroot権限を取り返します。
まず、SuperOneClickのZIPをダウンロードし、適当な場所に解凍しておきます。配布物はWindows向けのアーカイブですが、気にせず解凍します。unzip後のディレクトリに移った後、
[bash]
adb push Exploits/psneuter /data/local/tmp
adb push Dependencies/busybox /data/local/tmp
adb push Root/su-v1 /data/local/tmp
adb push Root/su-v2 /data/local/tmp
[/bash]
と、必要そうなファイルをLTNの/data/local/tmpに転送します。次に、LTNに接続し、転送したものに実行権限を与えてからpsneuterを実行します。
[bash]
adb shell
(adb) cd /data/local/tmp
(adb) chmod 755 *
(adb) ./psneuter
[/bash]
上手くいけば勝手に切断されるので、接続しなおします。接続後、プロンプトが「#」になりスーパーユーザになっていることを確認してください。
[bash]
adb shell
[/bash]
次にデフォルトのPATHが設定されている位置に busybox をインストールします。
[bash]
(adb) set
/system/xbin がパスに登録されているが、このディレクトリは存在しない。
カスタムコマンドを設置するにはもってこい。
(adb) df
/system は /dev/block/mmcblk3p6 らしい。
(adb) mount -o remount,rw /dev/block/mmcblk3p6 /system
(adb) mkdir /system/xbin
(adb) chmod 755 /system/xbin
(adb) cd /system/xbin
cp コマンドがなかったので、busybox のアプレットで busybox をコピーする
(adb) /data/local/busybox cp /data/local/busybox .
リンクを展開
(adb) ./busybox –install .
[/bash]
ConnectBot で localhost 接続して、busybox が使える状態になっているか確認します。
[bash]
$ which wget
/system/xbin/wget
$ dc
1 2 + p
3
$ vi
[/bash]
よし、いい具合。これでroot権限が使え、かつ自由に作業する為の足がかりが整いました。
2. Debian GNU/Linux の導入
59414d41さんのハックの賜物であるLTN用Debian(Lenny)配布ページに従ってインストールします。ページを見ると詳しい事が書いてありますが、ここでは要点だけかいつまんで書いておきます。
まず、ホストマシンにSDカードを差して、起動用SDカードを作成します。ホストマシン上で次のコマンドを実行しました。
[bash]
mkdir backup
cp -r /mnt/sdcard/* backup/
su # ←ここからroot権限
mkfs.ext3 /dev/mmcblk0p1
mount -t ext3 -o rw /mnt/sdcard /dev/mmcblk0p1
cd /mnt/sdcard
wget http://205.196.121.246/q4mgjdew5pag/0rnq7nc7lc1d0uq/ltna-debian-010.tar.gz
tar xfpz ltna-debian-010.tar.gz
[/bash]
この時、カレントディレクトリである/mnt/sdcardには次のようなファイルが詰まっています。
busybox | … 作業用 busybox。 |
ltna-debian-010 tar gz | … 落としてきたアーカイブ。解凍したのでもう不要。 |
ltna-debian-rootfs cpio gz | … SD カードに展開する予定のルート・ファイルシステム。 |
recovery2 img | … init を書き換えた改造リカバリ領域データ。 |
setup_recovery sh | … リカバリ領域のバックアップと上書きをするスクリプト。 |
setup_rootfs sh | … 必要ファイルをコピーし、ルート・ファイルシステムを展開するスクリプト。 |
sh | … 作業用シェル。 |
アンマウントしてホストのrootを抜けます。
[bash]
cd
umount /mnt/sdcard
exit
[/bash]
SD カードをホストマシンから LTN に差し替え、USB デバッグ接続します。SDカードを/sdcardにマウントして中を見てみると、準備したファイル群が見えると思います。それらを実行します。
[bash]
(ホストから)$ adb shell
root権限
mount -t ext3 /dev/block/mmcblk2p1 /sdcard
cd /sdcard
./setup_rootfs.sh ….. ルートファイルシステムを SD カード内に展開。
extract…
copy wpa_supplicant.conf
copy /system/lib/BCM4329B1.hcd
copy bcm4329 files…
copy /system/lib/hw/wlan/usibcm4329-RC218-nvram.txt
debian rootfs ready.
adb# ./setup_recovery.sh … リカバリ領域のバックアップと改造データでの上書き。
Backup recovery…
New recovery ready.
cp recovery_org.img /data/local/tmp …. オリジナルのリカバリ領域を移しておく。
cd /
umount /sdcard
exit
[/bash]
LTNで起動中の Android を普通に終了します。電源ボタンから「電源を切る」でOKです。
完全に電源が切れたことを確認し、HOMEボタンを押しながら電源を投入します。これにより、リカバリモードで起動します。NECのロゴが消えるまで、HOMEボタンを押しておけば確実です。
[bash]
Login: root
Password: (root)
passwd
ifup eth0
ping www.yahoo.co.jp .. 外とつながってるか調べる。
apt-get update …….. うちでは失敗したので、リポジトリを修正する。
vi /etc/apt/source.list
– deb http://ftp.ja.debian.org/debian lenny main non-free contrib
+ deb http://ftp2.ja.debian.org/debian lenny main non-free contrib
apt-get update …….. 今度はうまくいった。
apt-get install aptitude
aptitude install bluez-utils ntp ssh vim
aptitude install x-window-system ttf-mona ttf-kochi-gothic ttf-kochi-mincho
aptitude install xserver-xorg-input-evtouch rxvt-unicode ratpoison gdm
cp /opt/ltna/xorg.conf /etc/X11/
echo ‘inet:x:3003:user’ >> /etc/group
[/bash]
ここまで来て、startxとしたいところを我慢して、念の為再起動すると、Android が立ち上がりました。しまった!と思って、ホストマシンと繋ぎ直し、setup_recovery.sh を実行しなおしました。電源を一度切り、HOMEボタンを押しながら電源投入すると、Linux の起動メッセージが流れた後、嬉しい事に GDM がお出迎えしてくれました。
その後、
[bash]aptitude install locales && dpkg-reconfigure locales[/bash]
で日本語化を行いました。
2.1. SD カードの入れ替え
2.2. バッテリー残量を得るスクリプト
モバイル WiFi + Debian on LTN 環境で、バッテリー残量が取れないと不便だった。インストールしてみた acpi では上手く取れなかったので、簡単なスクリプトを書いてみました。もっと上手い方法があるかもしれませんが、これで十分かな。
[bash]
!/bin/sh
dev="/sys/devices/nvec/nvec_battery/power_supply/battery"
[ ! -e $device ] && exit 1
stat=$(cat $dev/status)
emp=$(cat $dev/charge_empty)
ful=$(cat $dev/charge_full)
now=$(cat $dev/charge_now)
par=$(expr $now * 100 / $(expr $ful – $emp))
[ $par -gt 100 ] && par=100
echo $par% $stat
[/bash]
実行すると、残量のパーセンテージと電源の状態(充電中か、など)が表示されます。