为Android系统编译tun.ko模块

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安装BusyBoxAndroid 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 InstallerOpenVPN Settings。把openvpn安装到/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/openvpn。

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下载

2 thoughts on “为Android系统编译tun.ko模块

  1. lusurf

    你好。
    我的手机是sk17i(Xperia Mini Pro),Android版本是2.3.4,内核版本是2.6.32.9-perf。我按你说的方法操作,加载x8kconfig模块的时候报错:
    insmod: init_module ‘x8kconfig.ko’ failed (Exec format error),
    请问该如何解决?谢谢。

    Reply

Leave a Reply

Your e-mail address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.