Ubuntu 16.04虚拟网络设备tun安装

Ubuntu 16.04虚拟网络设备tun安装

最近编写网络程序,需要用到tun模块,但是官方给的发行版中压根就没有这个模块.

不信的话,你可以测试一下:

root@ubuntu:~# modinfo tun
modinfo: ERROR: Module tun not found.

当然,如果你测试的结果是这样的:

root@ubuntu:~# modinfo tun
filename:       /lib/modules/4.8.17/kernel/drivers/net/tun.ko
alias:          devname:net/tun
alias:          char-major-10-200
license:        GPL
author:         (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
description:    Universal TUN/TAP device driver
srcversion:     7CDF0549396A7B788E3753B
depends:
intree:         Y
vermagic:       4.8.17 SMP mod_unload modversions

只能说明你可能已经安装了,但是还要进一步测试,运行下面两条命令,如果得到类似下面的结果,那么这篇文章后面的东西你就不用看了,如果没有任何输出,那么你估计要重新安装一下tun模块了.

root@ubuntu:~# modprobe tun
root@ubuntu:~# lsmod | grep tun      # 列出所有的模块,在其中寻找tun
tun                    28672  0

接下来我会详细记录一下我解决这个东西时遇到的一些问题,也是为了方便以后的查看吧.

1. 下载源码

lishuhuakai@ubuntu:~$ sudo apt-get install linux-source
linux-source         linux-source-4.10.0  linux-source-4.4.0   linux-source-4.8.0

使用apt-get命令安装linux源代码,一般你按tab键的时候,会有很多的选择,比如说上面,我就有4.4.0, 4.8.0, 4.10.0这几个版本可供选择,到底选择哪一个呢?这个看你个人的爱好了,但是有一点需要注意,尽量不要选择比自己内核版本低,或者比当前内核版本高太多的版本,高太多的话,linux内核高版本对低版本并没有保持非常好的兼容性,所以你要是一下子版本跨越太大,可能内核升级之后,系统都跑不起来.

因为我们并不需要升级内核,所以应该选择一份和自己内核版本号相近的源码.

可以用uname -a来查看当前内核版本号:

lishuhuakai@ubuntu:~$ uname -a
Linux ubuntu 4.8.17 #1 SMP Thu Apr 20 04:16:43 PDT 2017 x86_64 x86_64 x86_64 GNU/Linux

可以看到,我当前的内核版本是4.8.17,所以我选择一个4.8.0的版本即可.源码一般会被安装到/usr/src/linux-source-x.x.x/目录下,x.x.x是版本号,拿我的机子做个示例:

lishuhuakai@ubuntu:~$ cd /usr/src/linux-source-4.8.0/
lishuhuakai@ubuntu:/usr/src/linux-source-4.8.0$ ls
debian  debian.hwe  linux-source-4.8.0.tar.bz2

可以看得到,在这个目录下有一个压缩文件linux-source-4.8.0.tar.bz2,这就是源码的压缩文件,当然,对应到你的机器上,版本号可能会有所不同.

2. 解压缩文件

如果你使用虚拟机的话,请保证空间一定要足够大,因为后面的压缩以及编译都需要不少的空间.

lishuhuakai@ubuntu:~$ tar xvjf linux-source-4.8.0.tar.bz2

进入解压好的目录,为了方便操作,接下来的操作都切换到root账户下,所以我们干脆就不显示root了:

cd linux-source-4.8.0/

3.配置选项

为了后面编译不出错,我们先安装libncurses5-dev,执行命令:

apt-get install libncurses5-dev

即可.

然后配置需要编译的模块:

make menuconfig

然后你大概就能够看到这样一副图像,找到Device Drivers -->,回车选择:

选择1

继续找到Network Device Support -->,回车选择:

选择2

找到Universal TUN/TAP device driver support,看到前面是<*>,键盘输入M,变成<M>,退出并保存,回到终端:

选择3

注:[*],<*>表示编译进内核,<M>表示编译成模块,如果不知道某选项为何时,且有模块可选时,那么就可以直接选择为模块,如果有疑惑,可以去翻鸟哥的linux私房菜基础篇这本书.

4. 编译模块

开始执行命令:

make modules

事实上,上面的编译速度太慢,如果你要加快编译速度的话,可以使用-jn选项,n是一个数字,表示用n个线程并行编译.比如说我这台电脑的话,就是这么干的:

make -j4 modules

使用4个线程,因为我的电脑是双核四线程的cpu,编译的时候cpu使用率可以达到100%,当然,我可以设置-j8或者更高,但是没有意义,当然,如果你的电脑是8线程,那么推荐用-j8,16线程推荐用-j16,能快一点最好不过了.

5. 复制加载模块

编译完成后,可以想内核中加载模块了:

cp /usr/src/linux-source-4.8.0/linux-source-4.8.0/drivers/net/tun.ko  /lib/modules/4.8.0-36-generic/kernel/net/tun.ko

上面的命令是在我的机器上的做法,你的机器可能由于版本号的不同会有所差异.总之要干的事情就是将编译过后的tun.ko复制到/lib/modules/xxx/kernel/net/目录下去,xxx是一个和你当前内核版本号相关的目录,一般而言,这个目录下也就xxx这么一个目录.

接下来是分析可载入模块的相互依赖性:

depmod

6. 验证和加载

和文章最开始的套路是一样的,如果得到类似下面的输出,基本上你的安装就成功了.

root@ubuntu:~# modinfo tun
filename:       /lib/modules/4.8.17/kernel/drivers/net/tun.ko
alias:          devname:net/tun
alias:          char-major-10-200
license:        GPL
author:         (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
description:    Universal TUN/TAP device driver
srcversion:     7CDF0549396A7B788E3753B
depends:
intree:         Y
vermagic:       4.8.17 SMP mod_unload modversions
root@ubuntu:~# modprobe tun
root@ubuntu:~# lsmod | grep tun
tun                    28672  0

当然,也有可能会失败,事实上,我编译了几次都失败了,每次验证的时候,执行到modprobe tun的时候,都会输出类似与下面的错误信息:

modprobe: ERROR: could not insert 'tun': Exec format error

事实上你可以用dmesg查看错误的原因,下面是用该命令输出的最后一行:

[   51.803686] tun: no symbol version for module_layout

网上查看了一下别人的资料,我觉得可能的一个原因是内核的版本不匹配,因为我之前使用的内核版本和我编译的内核版本版本存在差异,网上有解决方案,但是不适合我,如果你想节约时间的话,可以查看这里:http://www.snooda.com/read/329

既然上面的步骤都不行,我只剩下一个办法了,那就是重新编译内核.

7. 最后的选择,重新编译内核

事先说明一句,我的操作都在虚拟机上完成,如果你在真机上测试的话,可能不太妥当,所以如果你使用真机,强烈建议你别人的博文中看一下别人是如何编译内核的.

回到之前源文件解压的目录,首先要配置config文件, 可以直接复制旧版本的:

cp /boot/config-3.19.0-81-generic ./.config 

接下来执行:

make oldconfig

注:复制的是当前版本的config,所以执行这条命令会让你选择新版本多出来的选项,按回车键用默认的新设置.

也可以直接用以下命令进入图形化的设置界面,也就是我们前面所使用的命令:

make menuconfig

这里需要按照前面的步骤,选择Universal TUN/TAP device driver support,设置好后保存退出即可.

接下来就可以编译了:

make -j4  # 开启4个线程并行编译

事先说明一句,编译需要占用大量的空间,我给虚拟机分配了20GB的空间,但是依旧被填满了,所以,如果你也使用虚拟机的话,我个人建议你分配30GB或者更大的空间来编译内核.至于如何给虚拟机添加空间,就不是这篇文章的事情了.不过这里可以友情提醒一下,不要用扩容的方式给虚拟机添加磁盘,因为一旦扩了容,你就没办法缩小容量了,我推荐的是,你另外分配一块磁盘给虚拟机,那么升级完内核之后,你可以将这块分配的磁盘移除,这样的话,会好很多.

编译的过程中可能会出现两个错误,第一个错误是fatal error: openssl/opensslv.h: No such file or directory,

这是因为没有安装openssl的,需要先安装openssl

apt-get install libssl-dev

第二个错误是bc: not found,需要安装bc:

apt-get install bc

编译可能会花费1~2个小时.完成之后,先安装modules:

make modules_install

接下来安装内核:

make install

一切完成之后,重新启动电脑,一切就都完成了.接下来你就可以用上面的办法来检测了.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容

  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,161评论 2 33
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,260评论 9 467
  • 我们说的Linux其实指的就是 内核(kernel)而已。这个内核控制你主机的所有硬件并提供系统所有的功能,所以它...
    Zhang21阅读 7,416评论 0 18
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,654评论 18 139
  • 菜:反差、美人、未亡人、人妻、叔(最好可以受)、健氣、攻擊性 雷:傲嬌←生理上的厭惡,光看到就會想吐的那種,所以可...
    燁烆es阅读 341评论 0 0