Chroot方式在android(linux)中运行linux

- - posted in android, chroot, debian, linux, ubuntu

这是什么

有时候,需要在一个linux里运行另外一个linux。
- 比如可以在android里运行linux,以此运行linux的原生程序,以及爽快的用apt-get安装程序 - 比如vps商只支持debian5,而军哥的lnmp需要debian6 - 比如openwrt路由里想挂载一个debian来做一些正常linux做的事 OK,以上都可以满足,而且我都干过。方法都类似。
整个过程可以在linux下,或者用android手机搞定。

准备文件系统

准备镜像文件

镜像文件也就是xxx.img。话说,openvz的vps,以及部分android手机是没有loop的,也就是不能挂载img文件,那么我只能说,呵呵。把东西放到img里当然可以使文件变得整齐点,也更灵活,当然这也并不是必须做的。如果不想做img,那也可以直接在linux分区里运行,但肯定不能是fat32什么的……

创建镜像 dd if=/dev/zero of=floppy.img bs=1024 count=2048100 这里我建了一个大概2G的文件,不要在意细节~想更多自己弄。
格式化ext2 mkfs.ext2 floppy.img 想要别的格式自己弄。

由于android手机新建镜像困难,这里给出建好的img,自行解压

挂载镜像 mkdir debian mount -o loop floppy.img debian/ 卸载镜像 umount debian

android手机可以把img放卡里,但是挂载的目标文件夹最好是放在data下,如 cd /data mkdir debian mount -o loop /sdcard/floppy.img /data/debian/ 并且,android手机可能需要安装busybox,并以busybox mount等形式执行

系统文件,方法一 debian

假设你手上有一台ubuntu//debian,那么可以用这个方式自己准备基础文件 mkdir debian 当然,如果上面挂载了镜像,就cd到镜像挂载的上一级目录,因为待会儿会把文件释放到当前目录的debian目录下。 sudo -s apt-get install debootstrap

下载基础文件 debootstrap –verbose –arch=armel –foreign squeeze debian http://ftp.us.debian.org/debian 这里我以arm架构为例。可自行更改,如i386,mips。 如此,基础文件已经准备就绪。

这里我提供很早以前准备的几个架构的基础文件,可以直接下下来解压到linux分区中。
i386 mips arm

然后需要将文件转移到目标文件系统中,如转移到android下并挂载,或转移到android的data目录下,或转移到openwrt的u盘中并且挂载。

进行第二阶段展开 chroot debian /bin/bash /debootstrap/debootstrap –second-stage 添加源 echo ‘deb http://ftp.us.debian.org/debian squeeze main contrib non-free’ > /etc/apt/sources.list 更新源 export HOME=/root export LC_ALL=C apt-get update;apt-get upgrade 至此,文件系统搞定。

系统文件,方法二 ubuntu

ubuntu可以直接下到基础文件,并且解压到镜像或者目录中 如arm架构的地址。好简短的样子-。-

系统文件,方法三 Backtrack

Backtrack从5开始就有arm架构的版本,当然x86架构肯定有的。下载下来就可以用,是个img文件。第6代名字更新为kali-linux

安装一些必要的东西

bt系统里东西够多了,alip版ubuntu里也不少,nano的和方法一里debian的就需要自己安装一些。

进入系统的脚本

如果中间没断开的话,那么现在是chroot到新linux里在运行。exit可以回到本机的shell。
那么如何从本机的shell里进去呢?参考脚本如下
挂载部分 startbt.sh: export kit=/sdcard/ export mnt=/data/debian export PATH=$bin:/usr/bin:/usr/sbin:/bin:$PATH export TERM=linux export HOME=/root # Mounting Image to the farthest loop point # FIXME : check if mount sucessfull otherwise abort whole process. mknod /dev/block/loop254 b 7 254 losetup /dev/block/loop254 $kit/floopy.img mount -t ext2 /dev/block/loop254 $mnt

mount -t devpts devpts $mnt/dev/pts
mount -t proc proc $mnt/proc
mount -t sysfs sysfs $mnt/sys
#seting environment
sysctl -w net.ipv4.ip_forward=1
echo "Setting /etc/resolv.conf to Google Open DNS 8.8.8.8 and 8.8.4.4"
echo "nameserver 8.8.8.8" > $mnt/etc/resolv.conf
echo "nameserver 8.8.4.4" >> $mnt/etc/resolv.conf
echo "127.0.0.1 localhost" > $mnt/etc/hosts

同样,android上最好是mount等命令前加busybox。
进入shell bt.sh: export kit=/sdcard/ export mnt=/data/debian export PATH=$bin:/usr/bin:/usr/sbin:/usr/local/bin/:/usr/local/sbin/:/bin:$PATH export TERM=linux export HOME=/root export SHELL=/bin/bash chroot $mnt /bin/bash export LANG=“C.UTF-8” export LC_ALL=“C.UTF-8”

那么开机以后,先要执行startbt.sh以挂载文件。一次即可。之后想要进入新linux的shell,只需在本机shell执行bt.sh。
如果不使用镜像,可酌情删去部分挂载镜像的语句。当然,也得修改镜像位置神马的。。

安装一些可能有用的东西

先来安装一堆节操 apt-get install vim busybox wget screen apt-get install gcc g++ make apt-get install git

桌面和vncserver apt-get install tightvncserver lxde xterm vi /root/.vnc/xstartup vncserver 默认端口5901

opera cat >>/etc/apt/sources.list<<END deb http://deb.opera.com/opera/ stable non-free #Opera Browser (final releases) END wget -O - http://deb.opera.com/archive.key | apt-key add - apt-get update apt-get -y –force-yes install opera