ubuntu 12.04增加tun

来源:互联网 发布:vc网络验证系列开发 编辑:程序博客网 时间:2024/04/28 05:46
因为要在qemu中使用网络,经过搜索发现,可能有两种方式,user模式和tun模式,据说tun模式比较好用,所以我要给ubuntu增加tun。

本文参考这篇文章
http://hi.baidu.com/lvgb/blog/item/a5e41adf0f2c1a14622798f5.html

===
ldm@ldm-TOP2:/usr/src$ uname -a
Linux ldm-TOP2 2.6.38-10-generic-pae #46-Ubuntu SMP Tue Jun 28 16:54:49 UTC 2011 i686 i686 i386 GNU/Linux
ldm@ldm-TOP2:/usr/src$
===
sudo cp /boot/config-2.6.38-10-generic-pae /usr/src/linux-headers-2.6.38-10-generic-pae/
sudo cp /boot/config-2.6.38-10-generic-pae /usr/src/linux-headers-2.6.38-10/
cd /usr/src/linux-headers-2.6.38-10-generic-pae/
sudo make menuconfig
这时会报错,Install ncurses (ncurses-devel) and try again.
sudo apt-get install libncurses*

sudo make menuconfig
首先内核中支持tap/tuns设备:
Device Drivers   --->  
    Networking support   --->
       [M] Universal TUN/TAP device driver support

ldm@ldm-TOP2:/usr/src/linux-headers-2.6.38-10-generic-pae$ sudo make modules
make modules 时会报告没有规则可以创建“kernel/bounds.s”需要的目标“kernel/bounds.c”。 停止。
sudo apt-get install linux-source-2.6.38
sudo tar xvf linux-source-2.6.38.tar.bz2
sudo make menuconfig
sudo make modules
要编很长时间1.5-2 小时
最后出现错误。
ld: cannot find /ubuntu/omnibook/sections.lds: No such file or directory
可以参考
https://bugs.launchpad.net/ubuntu/ source/linux/ bug/505420
https://launchpadlibrarian.net/37672643/patch
修改一下PWD,再重新编译模块
然后就编译成功
sudo cp drivers/net/tun.ko /lib/modules/`uname -r`/kernel/drivers/net
sudo depmod
sudo modprobe tun
报错
FATAL: Error inserting tun (/lib/modules/2.6.38-10-generic-pae/kernel/drivers/net/tun.ko): Invalid module format
用dmsg,可以看到tun: no symbol version for module_layout
这应该是当前编译的版本(2.6.38)和内核版本(uname -r ==2.6.38-10-generic-pae)不一致。
解决办法参考
http://blank-dic.blog.163.com/blog/static/310186222011221112425351/

用类似于make -C /lib/modules/`uname -r`/build M=`pwd` modules的命令编了无数次也没搞定这个tun.ko,只好换个kernel了。
在apt-get install linux-source获得的源代码基础上,参考这篇文档。
https://help.ubuntu.com/community/Kernel/Compile
使用的命令大约为
sudo su -
cp -vi /boot/config-`uname -r` .config
make oldconfig
make menuconfig
(图形界面里似乎应该先把老的.config load进来,这步忘了做,不知到make oldconfig是否有同样的效果
选择上tun的模块)
make-kpkg --initrd --append-to-version=-some-string-here kernel-image kernel-headers
echo vesafb | sudo tee -a /etc/initramfs-tools/modules
echo fbcon | sudo tee -a /etc/initramfs-tools/modules
cd ..
dpkg -i linux-image-2.6.38.7-some-string-here_2.6.38.7-some-string-here-10.00.Custom_i386.deb
dpkg -i linux-headers-2.6.38.7-some-string-here_2.6.38.7-some-string-here-10.00.Custom_i386.deb
这时我也要重启计算机了,上帝保佑我吧!

重启后,我的内核已经变成了
ldm@ldm-TOP2:~$ uname -r
2.6.38.7-some-string-here
安装tun.ko也很顺利
===
ldm@ldm-TOP2:/lib/modules/2.6.38.7-some-string-here/kernel/drivers/net$ lsmod | grep tun
ldm@ldm-TOP2:/lib/modules/2.6.38.7-some-string-here/kernel/drivers/net$ sudo modprobe tun
[sudo] password for ldm:
ldm@ldm-TOP2:/lib/modules/2.6.38.7-some-string-here/kernel/drivers/net$ lsmod | grep tun
tun                    21677  0
ldm@ldm-TOP2:/lib/modules/2.6.38.7-some-string-here/kernel/drivers/net$
===
0 0