AndroidでDebian Lennyを使う。

※2010-12-26:bootdebianスクリプトに誤りがあったので修正しました。

Linuxには chroot というコマンドでルートディレクトリを変更することによりカーネル,ネットワーク,プロセス群などを共有しつつシステムを分離させる仕組みがあります。これを利用してAndroid上から、ABIが同じ(EABI)なARM用のDebian Lennyを動かそうという試みです。
今回は参考サイト*1に習いSDカード上に用意したDebianのイメージファイルをループバッマウントしてchrootしてますが、Androidファイルシステムに直接Debian用のディレクトリを掘っても同様に実行可能だと思います。

また今回は触れませんがAndroidVNCクライアントをXサーバにして接続することにより、Debianデスクトップ環境も使用可能な様です。これは別の機会に試してみたいと思います。

◆実行環境について

イメージファイルを作成するPCはUbunttu10.10を使いましたがDebian系であれば他のLinuxでも同じ手順でイケると思います。
Androidは(私の場合)当然IS01を使用します。rootedでsystemは書き換え可能、/sqlite_journals/binにsuコマンドを入れた状態にしてあります。IS01のroot化については他サイトを参考にしてください。簡単に出来るツールなども出来ているので利用してみるのも良いでしょう。くれぐれも文鎮化には注意してください。

Debianイメージファイルの準備

まずはPC上で適当な大きさでファイルを作成し、ループバックマウントした領域にdebootstrapでDebianをインストールします。
実行コマンド例は以下の通りです。800Mbyteのイメージを作成します。


sudo apt-get install debootstrap
dd if=/dev/zero of=debian.img seek=838860800 bs=1 count=1
mke2fs -F debian.img
mkdir debian
sudo mount -o loop debian.img debian/
sudo debootstrap --verbose --arch armel --foreign lenny debian http://ftp.jp.debian.org/debian
sudo umount debian/
rm -r debian/

Debian bootスクリプト作成

以下の内容で bootdebian というファイルを作成します。


if [[ $EUID -ne 0 ]]
then
echo "Becoming ROOT!"
/sqlite_journals/bin/su -c /sqlite_journals/bin/bootdebian
exit 1
fi

echo "Mounting system as R/W"
busybox mount -o remount,rw -t yaffs2 /dev/block/mtdblock5 /system

echo "Setting some stuff up.."
export bin=/system/bin
export img=/sdcard/debian.img
export mnt=/data/local/debain
export PATH=$bin:/usr/bin:/usr/sbin:/bin:$PATH
export TERM=linux
export HOME=/root
if [ ! -d $mnt ]
then
mkdir $mnt
fi

echo "Mounting the Linux Image"
busybox mknod /dev/block/loop5 b 7 0 #may already exist
busybox losetup /dev/block/loop5 $img
busybox mount -t ext2 -o noatime,nodiratime /dev/block/loop5 $mnt
busybox mount -t devpts devpts $mnt/dev/pts
busybox mount -t proc proc $mnt/proc
busybox mount -t sysfs sysfs $mnt/sys

echo "Setting Up Networking"
busybox sysctl -w net.ipv4.ip_forward=1
busybox echo "nameserver 8.8.8.8" > $mnt/etc/resolv.conf
busybox echo "nameserver 8.8.4.4" >> $mnt/etc/resolv.conf
busybox echo "127.0.0.1 localhost" > $mnt/etc/hosts

echo "Mounting sdcard and emmc in /mnt"
#if [ ! -d $mnt/mnt/emmc ]
#then
#busybox mkdir $mnt/mnt/emmc
#fi
#busybox mount --bind /mnt/emmc/ $mnt/mnt/emmc
if [ ! -d $mnt/mnt/sdcard ]
then
busybox mkdir $mnt/mnt/sdcard
fi
busybox mount --bind /sdcard/ $mnt/mnt/sdcard

echo "Entering CHROOT "
echo " "
/data/busybox/chroot $mnt /bin/bash

echo " "
echo "Shutting down CHROOT"
#busybox umount $mnt/mnt/emmc
busybox umount $mnt/mnt/sdcard
busybox sysctl -w net.ipv4.ip_forward=0
busybox umount $mnt/dev/pts
busybox umount $mnt/proc
busybox umount $mnt/sys
busybox umount $mnt
busybox losetup -d /dev/block/loop5
busybox mount -o remount,ro -t yaffs2 /dev/block/mtdblock5 /system

前項で作成したdebian.imgとbootdebianスクリプトをSDカードにコピーします。

Android端末上でスクリプト実行


/sqlite_journals/bin/su
cat /sdcard/bootdebian > /sqlite_journals/bin/bootdebian
chmod 777 /sqlite_journals/bin/bootdebian
/sqlite_journals/bin/bootdebian
chrootに成功するとここでプロンプトが変化します。続けてchroot先でbootstarpを実行してDebianのインストールを継続します。完了まで10分ほどかかると思います。

/debootstrap/debootstrap --second-stage
echo 'deb http://ftp.jp.debian.org/debian lenny main' >/etc/apt/sources.list
apt-get autoclean
apt-get update
exit
これで基本システムのインストールは完了です。
Debianから抜けて再起動する場合は再度bootdebianを実行します。
後はaptで好みのパッケージを入れてFull Linuxを楽しんでください!