1 引言
在Android设备上使用OpenVPN一般要求系统包含tun.ko模块,但很多原厂系统并没有这一模块,这就要求我们另外编译tun.ko供OpenVPN调用。本实验成功编译了一个X8 (E15i)可用的tun.ko并上传到了Google Code (tun-ko-for-android)。
2 方法
2.1 设备和材料
已经root的Sony Ericsson E15i手机一部,原厂系统版本为Build 2.1.1.A.0.6,我们需要从这部手机里读取编译配置文件,编译的tun.ko也是给它使用的。带有基本开发环境的openSUSE 11.4 i586 (with KDE 4.6.0)系统电脑一台(本实验用装在VirtualBox 4.1.0 OSE里的虚拟机代替),用来搭建交叉编译环境。从Sony Ericsson Developer World 获取Android系统源代码,与Build 2.1.1.A.0.6对应的源代码是x10_x10mini_X10minipro_x8_eclair_2.1.A.0.435.tar.gz,下载后放入电脑的/home/miffyliye/e15i/目录(miffyliye是我的用户ID,下同)。Android NDK交叉编译工具链android-ndk-r5c-linux-x86.tar.bz2,下载后放入电脑的/home/miffyliye/ e15i/目录。x8kconfig.ko模块,下载后放入手机的存储卡内/sdcard/目录,稍后安装完毕就可以从E15i里读出配置文件。
2.2 步骤
2.2.1 读取配置文件
手机通过Android Market安装BusyBox和Android Terminal Emulator。
把BusyBox工具安装到/xbin/目录。
打开手机内的Android Terminal Emulator执行以下命令su
mount -o remount,rw /system /system
cp /sdcard/x8kconfig.ko /system/lib/modules/x8kconfig.ko
insmod /system/lib/modules/x8kconfig.ko
cp /proc/config.gz /sdcard/config.gz
rm /system/lib/modules/x8kconfig.ko
将存储卡内/sdcard/config.gz转移到电脑/home/miffyliye/e15i/目录。
2.2.2 编译内核模块
打开电脑内的Konsole执行以下命令cd /home/miffyliye/e15i/
gunzip x10_x10mini_X10minipro_x8_eclair_2.1.A.0.435.tar.gz
tar -xvf x10_x10mini_X10minipro_x8_eclair_2.1.A.0.435.tar
bzip2 -d android-ndk-r5c-linux-x86.tar.bz2
tar -xvf android-ndk-r5c-linux-x86.tar
gunzip config.gz
cd kernel/
mv ../config ./.config
编辑/home/miffyliye/e15i/kernel/.config,找到# CONFIG_TUN is not set
改为CONFIG_TUN =m
然后保存。
重新打开Konsole执行下列命令cd /home/miffyliye/e15i/kernel/
export ARCH=arm
export CROSS_COMPILE=arm-eabi-
export PATH=$PATH:/home/miffyliye/Documents/e15i/android-ndk-r5c/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin/
make modules
cp drivers/net/tun.ko ../
不到一分钟就编译好了。
然后将/home/miffyliye/e15i/tun.ko转移到手机存储卡/sdcard/tun.ko。
重新打开手机内的Android Terminal Emulator执行以下命令su
cp /sdcard/tun.ko /system/lib/modules/tun.ko
chmod 644 /system/lib/modules/tun.ko
chgrp root /system/lib/modules/tun.ko
chown root /system/lib/modules/tun.ko
mkdir /xbin/bb/
ln -s /xbin/busybox /xbin/bb/ifconfig
ln -s /xbin/busubox /xbin/bb/route
mount -t yaffs2 -o remount,ro /dev/block/mtdblock0 /system
2.2.3 配置OpenVPN
安装OpenVPN Installer和OpenVPN Settings。把open安装到/xbin/,ifconfig和route 使用/xbin/bb里的版本。
在OpenVPN Settings的Advanced里,勾选Load tun kernel module,Load module using insmod,Path to tun module: /system/lib/modules/tun.ko。
把OpenVPN配置文件移入/sdcard/open。
3 实验结果
启动OpenVPN,连接成功后Reset DNS。然后上Twitter,成功发了一推。
安装Network Info II后查看连接OpenVPN前后的外部IP,发现IP 发生改变。
4 问题讨论
测试结果显示编译出的tun.ko是稳定且有效的。
4.1 Fix DNS
有几次启动OpenVPN后,没有执行Fix DNS,出现了可以连接远端服务器却无法访问互联网的情况,执行Fix DNS后即可正常访问互联网。
4.2 编译环境要求
在Android的官方指南里,要求虚拟机具备8G的RAM/swap和12G的空闲硬盘空间,但如果仅仅是为了编译几个内核模块的话,这些都是不必要的。我用的openSUSE分配了2G RAM和2G swap,编译过程用的硬盘空间不超过1G。此外Python、JDK、Git等工具也并没有用到。
5 参考资料
Compiling X10 kernel sources
X8Kconfig – Extract kernel config from running kernel
6 附录
tun-ko-for-android Project
tun.ko下载
3 THOUGHTS ON “为ANDROID系统编译TUN.KO模块”