让Ubuntu和Android同时运行(Ubuntu on Android)


Ubuntu目前有个项目叫Ubuntu for Android(http://www.ubuntu.com/devices/android),看起来非常cool:


它的原理在http://www.ubuntu.com/devices/android并无介绍。但是我们猜测可以用chroot配合实现一个最简单的Ubuntu for Android。

我们为Andriod编写一个脚本Ubuntu.sh,在该脚本中启动Ubuntu的文件系统,透过chroot进行:

  1. #!/system/bin/sh  
  2.   
  3. if [ `id -u` != "0" ]  
  4. then  
  5. echo -e "\033[33m Becoming root \033[0m"  
  6. su -c bu  
  7. exit 1  
  8. fi  
  9.   
  10. echo -e "\033[33m Setting some stuff up..\033[0m "  
  11.   
  12. export bin=/system/bin  
  13. export mnt=/data/local/ubuntu  
  14. export PATH=$bin:/usr/bin:/usr/sbin:/bin:$PATH  
  15. export TERM=linux  
  16. export HOME=/root  
  17.   
  18. if [ ! -d $mnt ]  
  19. then  
  20. mkdir $mnt  
  21. fi  
  22.   
  23. echo -e "\033[33m Mounting the Linux Image \033[0m"  
  24.   
  25. #replace /dev/block/mmcblk1p2 by the partition Ubuntu image is replaced  
  26. #it might be a loop image  
  27. busybox mount -t ext4 -o noatime,nodiratime /dev/block/mmcblk1p2 $mnt  
  28. busybox mount -t devpts devpts $mnt/dev/pts  
  29. busybox mount -t proc proc $mnt/proc  
  30. busybox mount -t sysfs sysfs $mnt/sys  
  31.   
  32. echo -e "\033[33m Setting Up Networking\033[0m"  
  33.   
  34. sysctl -w net.ipv4.ip_forward=1  
  35. echo "nameserver 8.8.8.8" >> $mnt/etc/resolv.conf  
  36. echo "nameserver 8.8.4.4" >> $mnt/etc/resolv.conf  
  37. echo "127.0.0.1 localhost" > $mnt/etc/hosts  
  38.   
  39. echo -e "\033[33m Mounting sdcard in /mnt/sdcard\033[0m"  
  40. if [ ! -d $mnt/mnt/sdcard ]  
  41. then  
  42. mkdir $mnt/mnt/sdcard  
  43. fi  
  44.   
  45. busybox mount --bind /mnt/sdcard/ $mnt/mnt/sdcard  
  46.   
  47. echo -e "\033[33m Entering CHROOT \033[0m"  
  48. echo " "  
  49.   
  50. chroot $mnt /bin/bash  
  51.   
  52. echo " "  
  53. echo -e "\033[33m Shutting down CHROOT\033[0m"  
  54. echo -e "\033[33m umount $mnt/mnt/sdcard\033[0m"  
  55. busybox umount $mnt/mnt/sdcard  
  56. sysctl -w net.ipv4.ip_forward=0  
  57. echo -e "\033[33m umount $mnt/dev/pts\033[0m"  
  58. busybox umount $mnt/dev/pts  
  59. echo -e "\033[33m umount $mnt/proc\033[0m"  
  60. busybox umount $mnt/proc  
  61. echo -e "\033[33m umount $mnt/sys\033[0m"  
  62. busybox umount $mnt/sys  
  63.   
  64. echo -e "\033[33m umount $mnt\033[0m"  
  65. busybox fuser -k $mnt  
  66. busybox umount $mnt  
其中的一行:
  1. busybox mount -t ext4 -o noatime,nodiratime /dev/block/mmcblk1p2 $mnt  
是为了mount Ubuntu的rootfs,我们的实验中Ubuntu的rootfs存放在/dev/block/mmcblk1p2。该文件系统通过rootstack得到:

sudo rootstock -f ubuntu -l <yourname> -p <yourpassword> -i 1G --seed linux-image-omap,build-essential,tightvncserver, lxde

将得到的tgz包解压到我们sd卡的分区2。

运行Ubuntu.sh,进入到了Ubuntu的根文件系统,并执行了bash,之后我们开一个vncserver:

  1. export USER=root  
  2. vncserver -geometry 800x480  

在Android端,通过VNCClient软件连接到127.0.0.1:5901即可。

相关内容