Blog Of Leung

personal blog & work notes

View project onGitHub
 

在android上跑gentoo linux

一个有趣的项目,叫linuxonandroid,得益于他们的工作,我们可以在android设备上比较随意地运行几种不同的linux发行版,目前包括ubuntu,debian,archlinux,kali linux,fedora,openSUSE这几种。

大体的方法是通过chroot,切换到新系统的根下,使用一套与原系统隔离的目录结构,这样就可以在不影响android自身的前提下,使用linux系统。

对于linuxonandroid目前支持的发行版,可以直接在其官网下载页面linuxonandroid.org/downloads上下载它们的一个名为"Complete Linux Installer.apk",以及打包好的发行版镜像。apk直接安装到有root权限的android设备上,发行版镜像包拷贝到设备的sdcard中,然后点击apk进行操作即可。

如果希望在android设备上玩gentoo,目前linuxonandroid是还没有支持的。但是借助于linuxonandroid的工作,以及他们的启动脚本,我们可以自己参考着做一个类似的chroot脚本,做一些挂载和写环境变量等工作,这样也可以切换到gentoo linux系统中。只不过没有gui,只能在电脑上通过usb连接到android设备,再进行命令行操作了。But anyway,毫无疑问我们是可以切到gentoo linux的。

操作过程

有几点要求:

* android设备必须有root权限
* 你的pc工作于linux环境下,可以进行稳定的adb连接
* android设备中需要有busybox工具

busybox工具可以从这里下载

首先用dd工具生成一个镜像文件,这里block大小为1MB,生成大小为3GB的镜像

dd if=/dev/zero of=gentoo.img bs=1M count=0 seek=3027

然后格式化文件系统

mkfs.ext2 -F gentoo.img

之前有出现inodes用完的情况,所以这里可以手动设置inodes的数量,设大一点

mkfs.ext2 -N 957526 -F gentoo.img

接着下载gentoo的stage包以及最新的protage tree,放在gentoo.img文件的同级目录 http://distfiles.gentoo.org/releases/arm/autobuilds/current-stage3-armv7a/ http://distfiles.gentoo.org/snapshots/portage-latest.tar.bz2

下载完毕之后,首先生成一个临时目录,用于把之前生成的镜像挂载上去,并开始往其中添加gentoo的包,以下操作直接用root用户操作比较直接

su
mkdir tmp
mount -o loop gentoo.img tmp/
cd tmp
tar xvf ../stage3-armv7a-*.tar.bz2
cd usr
tar xvf ../../portage-latest.tar.bz2
cd ..
mkdir tmp/dev/pts
mkdir tmp/sdcard

我在操作过程中发现,gentoo官网上有些日期的stage3包,使用tar解压的时候总会出错,后来换了个没那么新的包才解压成功,具体原因未明。

假如上述都正常执行,那么可以把tmp目录卸载,然后把gentoo.img文件拷贝到android设备的sdcard中。例如我是用adb操作的

umount tmp/
adb shell mkdir /mnt/sdcard/gentoo
adb push gentoo.img /mnt/sdcard/gentoo/

然后制作一个脚本实施chroot到gentoo,命名为boot.sh

####Location of you busybox
export bbox=/data/local/busybox
####Edit image location as needed
export imgfile=/sdcard/gentoo/gentoo.img
export mnt=/data/local/mnt

mkdir -p $mnt

$bbox mknod /dev/block/loop255 b 7 255
$bbox losetup /dev/block/loop255 $imgfile
$bbox mount -t ext2 /dev/block/loop255 $mnt

$bbox mount -t devpts devpts $mnt/dev/pts
$bbox mount -t proc proc $mnt/proc
$bbox mount -t sysfs sysfs $mnt/sys
$bbox mount -o bind /sdcard $mnt/sdcard

$bbox sysctl -w net.ipv4.ip_forward=1

##########################################
#Sets up network forwarding              #
##########################################
busybox sysctl -w net.ipv4.ip_forward=1
echo "nameserver 8.8.8.8" > $mnt/etc/resolv.conf
echo "nameserver 8.8.4.4" >> $mnt/etc/resolv.conf
echo "nameserver 233.5.5.5" >> $mnt/etc/resolv.conf
echo "127.0.0.1 localhost" > $mnt/etc/hosts
echo " "

#set environment
$bbox chroot $mnt /usr/bin/env -i HOME=/root USER=root PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin TERM=linux /bin/bash -l

$bbox umount $mnt/sdcard
$bbox umount $mnt/dev/pts
$bbox umount $mnt/proc
$bbox umount $mnt/sys
$bbox umount $mnt
$bbox losetup -d /dev/block/loop255 &> /dev/null

完成之后就可以把busybox跟脚本boot.sh拷贝到android设备上去,同样通过adb操作即可

adb remount 
adb push boot.sh /data/local/
adb push busybox /data/local/busybox
adb shell 
cd /data/local
chmod 777 busybox
chmod 777 boot.sh
./boot.sh

到这一步,就大功告成了,已经成功chroot到gentoo系统中了,已经可以做基本的操作了。

不过这确实是有点简陋呢,只有命令行,这只是个基本系统,很多工具都还没安装,使用gentoo系统很多时候是需要进行编译的,而android设备的性能毕竟有限,个人觉得也就适合折腾一下了。

以上内容整理自linuxonandroid和Hammad Mazhar的相关博客和主页,感谢他们的付出

http://hamelot.co.uk/android/run-gentoo-on-android-via-chroot/ http://linuxonandroid.org

Author:leung

08 Jul 2014

← Home

comments powered by Disqus