Android の chroot を使って Debian を動かす (1)
Google Play にある「Complete Linux Installer」を使ってみたが、 どうもうまくいかないので 自分で chroot の debian を作って Android タブレットで動かすことにした。 amd64 の Ubuntu 14.04 で debootstrap を使って arm の Android で動く Debian の chroot 環境を作成した。
Android タブレットは ICONIA TAB A700 なのだが root アカウントが使用でき、 CyanogenMod 11 がインストールされている (ICONIA TAB A700 に CyanogenMod 11 をインストール)。
Ubuntu で chroot 環境を作成する
MicroSD カードのフォーマット
MicroSD に chroot のディレクトリを作る。 MicroSD カードは ext4 でフォーマットする。 以下、MicroSD カードは Ubuntu では /media/PATH/MicroSD にマウントされているとする。
chroot 環境の作成
Ubuntu の root で行う。 MicroSD カードがマウントされたディレクトリを /media/PATH/MicroSD とすると
mount -o remount,exec,dev /media/PATH/MicroSD
debootstrap --arch=armhf --variant=buildd --foreign testing /media/PATH/MicroSD/debian http://ftp.jp.debian.org/debian/
で debian のディレクトリを作る。
amd64 の Ubuntu 上で作業していて今回使う Android タブレットの CPU である arm と異なっているので、 debootstrap のすべての作業を完了させることはできない。 Android タブレットの chroot 上で残りを実行しなければならない。
Android で chroot 環境の設定をする
chroot を試す
とりあえず CM11 の Android で実際に chroot で作成した環境を使ってみる。 MicroSD カードは /storage/sdcard1 や /mnt/fuse/sdcard1 からアクセスできるとする。
適当なターミナルエミュレータのアプリをインストールしておく。 端末を起動して root になる。 root で bash を使うので、私の環境では
su - -s /system/xbin/bash
としている。
chroot /storage/sdcard1/debian /bin/bash -l
とすると
chroot: can't execute '/bin/bash': Function not implemented
となってうまく動かない。
mount
として MicroSD カードがどこにマウントされているかを調べると
/mnt/fuse/sdcard1/debian
にもマウントされていた。今度は
chroot /mnt/fuse/sdcard1/debian /bin/bash -l
とすると
chroot: can't execute '/bin/bash': Permission denied
と出て、うまくいかない。これはマウントし直せば良さそうなので
mount -o remount,exec /mnt/fuse/sdcard1
としてから
chroot /mnt/fuse/sdcard1/debian /bin/bash -l
を実行するとうまく chroot が実行できた。
debootstrap の second stage
chroot 環境を作成した CPU と Android の CPU が違うので debootstrap の second stage を Android の方で行う必要がある。 chroot 環境で
debootstrap/debootstrap --second-stage
を行う。環境変数などを設定しないといけないので 次に示すスクリプトを使ってから、上のコマンドを実行する。 これはしばらく時間がかかった。
script
毎回、mount や環境変数の設定をするのは面倒なので chroot を実行するスクリプトを作る。 たとえば /path/to/run_chroot.sh というファイルに
export SDCARD=/mnt/fuse/sdcard1
export ROOT=$SDCARD/debian
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH
export HOME=/root
mount -o remount,exec,dev,suid $SDCARD
for f in dev dev/pts proc sys ; do mount -o bind /$f $ROOT/$f ; done
chroot $ROOT /bin/bash -l
と書き
bash /path/to/run_chroot.sh
で実行する。