Android+ポケモンキーボードでモバイルLinux環境を作る
Android+ポケモンキーボードでモバイルLinux環境を構築する話です。当然root化とbusyboxのインストールが必要です。
今回はGalaxy Nexusにインストールした。他のAndroid端末でも同じようにインストールできると思うけど、手順どうりにやってもうまく動かないことがあるのでその時はググるなりしてください。
chroot環境の構築
まずArch Linux ARMのフォーラムを参考にchroot環境を構築します。
Arch Linux ARM • View topic - Installation in an Android Chroot
私はArchLinux派なので、ArchLinuxをインストールしていますがDebianなど他のディストリビューションがいい。もうすでにインストールしてるよって人は、他のディストリのインストール方法をググるなり読み飛ばすなりしてください。
まずAndroid上で以下のコマンドを実行してArchLinuxをインストールします。
途中ddコマンドで750MBのイメージファイルを作成していますが、容量は各自で適当に決めてください。私はいろんなパッケージをインストールするつもりなので2GBの容量で作成しました。
su cd /sdcard mkdir arch dd if=/dev/zero of=alarm.img seek=749999999 bs=1 count=1 mke2fs -F alarm.img mknod /dev/loop1 b 7 0 losetup /dev/loop1 alarm.img mount -t ext2 /dev/loop1 arch/ cd arch wget http://archlinuxarm.org/os/ArchLinuxARM-armv5te-latest.tar.gz tar xzf ArchLinuxARM-armv5te-*.tar.gz rm ArchLinuxARM-armv5te-*.tar.gz cd .. umount /sdcard/arch losetup -d /dev/loop1
これでArchLinuxARMのインストールは完了。
次に起動スクリプトを/sdcard/startarch.shとして配置します。
この起動スクリプトはarchlinuxarmのフォーラムの書き込みを参考に作成しました。
startarch.sh
perm=$(id|cut -b 5) if [ "$perm" != "0" ]; then echo "This script requires root! Type: su"; exit; fi echo "Starting up ArchLinux" if [ ! -b /dev/loop1 ]; then mknod /dev/loop1 b 7 0 fi losetup /dev/loop1 alarm.img mount -t ext2 /dev/loop1 arch/ cd arch mount -o bind /dev/ /sdcard/arch/dev mount -t devpts devpts /sdcard/arch/dev/pts mount -t proc proc /sdcard/arch/proc mount -t sysfs sysfs /sdcard/arch/sys mount -o bind /mnt/sdcard /sdcard/arch/media/sdcard busybox sysctl -w net.ipv4.ip_forward=1 echo "nameserver 8.8.8.8" > /sdcard/arch/etc/resolv.conf echo "nameserver 8.8.4.4" >> /sdcard/arch/etc/resolv.conf echo "127.0.0.1 localhost" > /sdcard/arch/etc/hosts echo "Arch is configured that can be accessed from the IP:" ifconfig wlan0 echo " " PATH_=$PATH export PATH=$bin:/sbin:/usr/bin:/usr/local/bin:/usr/sbin:/bin:/usr/local/sbin export TERM=xterm export USER=root export HOME=/root export SHELL=/bin/bash /system/xbin/busybox chroot . /bin/bash export PATH=$PATH_ cd .. umount /sdcard/arch/media/sdcard umount /sdcard/arch/dev/pts umount /sdcard/arch/dev umount /sdcard/arch/proc umount /sdcard/arch/sys umount /sdcard/arch losetup -d /dev/loop1 echo "Shutting down ArchLinux"
準備が終わったのでいよいよArchLinuxを起動してみます
ArchLinuxを起動するには
su
cd /sdcard
sh startarch.sh
で起動できます。
あとは普通のArchLinuxとして操作できます。pacman -S vim などで好きなパッケージを入れてください。ArchLinuxのパッケージマネージャはpacmanです、pacmanの詳細はArchLinuxのwikiを読んでください。
何度も言いますが、端末によってはうまく動かないので、そのときは各自で起動スクリプトを書き換えるなどしてください。
ポケモンキーボードと接続
さて、これでLinuxのインストールはできたので。スクリーンキーボードでコマンドを打って操作することはできるようにはなった。ただ使いづらくて仕方ないのでキーボードを接続します。
今回はDSのゲーム、ポケモンタイピングに付属するキーボードを使った。このキーボードはBluetooth接続でiPhone, PCなどにも普通に接続でき、スタンドまで付属していてamazonで2000円程度。他のbluetoothキーボードと比べても安い方だ。接続方法はFnキーを押したまま電源スイッチをオンにして、AndroidやiPhone, PCからBluetooth機器を検索すればNintendo Wireless Keyboardとして認識されるのでそのまま接続。次に画面に出る数字をキーボードに入力してEnterを押せば接続が完了する。
Androidにポケモンキーボードを接続すると。USキーボードとして認識されるのでJISキーボードとして認識してもらうためにキーアサインを変更しないといけない。
Androidのキーアサインについては以下のサイトを参照してください。
.klと.kcmファイルを用意すれば未知のキーボードにも対応できそうだ。
ポケモンキーボードでの注意点はESCキーだ。ESCキーは全角/半角キーと一緒になっていてESCを入力するときはFn+全角/半角を押さないといけない。これはvimを使用するときには不便なので、全角/半角キーの機能を殺して全角/半角キー = ESCキーとして動作するようにキーアサインを変更した。
というわけでキーアサインを変更する以下の2つのファイルを@hiromo6さんの作成されたファイルをベースに作成しました。
それぞれのファイルを
- /system/usr/keylayout/Nintendo_Wireless_Keyboard.kl
- /system/usr/kaychars/Nintendo_Wireless_Keyboard.kcm
となるようにコピーする。このとき/systemはデフォルトでは書き込みできないので。/systemを書き込み許可にして再マウントしなきゃいけない。Galaxy Nexusの場合は以下のコマンドで/systemを再マウントできる。
mount -o remount,rw /dev/block/platform/omap/omap_hsmmc.0/by-name/system /system
他のandroid端末の場合は別のコマンドになるので各自調べて下さい。
ターミナルエミュレータ
ターミナルエミュレータにはConnectBotの強化版であるVX ConnectBotを使った。が、ctrlキーの挙動が変(ConnectBotの仕様?)なのでソースコードを一部書き換えた。もちろんソースコードを変更するのでandroidの開発環境が必要です。
まずvx / connectbotからソースコードを落としてきてsrc/sk/vx/connectbot/service/TerminalKeyListener.javaの133行目付近のhardKeyboardHiddenをtrueに変更する。
diff --git a/src/sk/vx/connectbot/service/TerminalKeyListener.java b/src/sk/vx/connectbot/service/TerminalKeyListener.java index a5a7af9..555d42c 100644 --- a/src/sk/vx/connectbot/service/TerminalKeyListener.java +++ b/src/sk/vx/connectbot/service/TerminalKeyListener.java @@ -130,7 +130,7 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha */ public boolean onKey(View v, int keyCode, KeyEvent event) { try { - final boolean hardKeyboardHidden = manager.hardKeyboardHidden; + final boolean hardKeyboardHidden = true; // Ignore all key-up events except for the special keys if (event.getAction() == KeyEvent.ACTION_UP) {
正直に言うとなぜtrueにするとうまく動くのかわかってないです。詳しく書くと、hardKeyboardHiddenがctrlキーの挙動に関わっているようで、これがtrueだとctrlキーは正しく動く。Android起動直後にVX ConnectBotを起動した時はtrueなのですが、一旦HOMEに戻ってもう一度VX ConnectBotを起動するとfalseになっているという謎挙動をするので、強制trueにしています。これで今のところ大きな問題は出てないので大丈夫だと思います。
これで持ち運びできるLinux環境の完成です。Galaxy NexusはUSBホストも持っているのでUSB変換コネクタを接続すれば、Androidに対応していないUSB機器でもArchLinux側が対応していればArchLinux側から操作できます。たとえばAndroid上で動作しているArchLinuxからUSBメモリにアクセスするには
mount /dev/block/sda /mnt
でUSBメモリの中のファイルにアクセスできます。
ポケモンキーボードを使うことでほぼPCと同等のLinux環境をAndroidで実現することができました。これならRaspberry piにも負けない小型PCとして使えるのではないでしょうか。