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

で実行する。

参考

Tags of current page

, , ,