记一次失败的安装tun设备过程

由于bochs, qemu想要配置网络,比较好的选择是采用tun设备,所以在网上找了一些教程。

先下载Linux的源码(apt-get install -y linux-source),由于我的内核版本是 4.15.0-70-generic, 只能下载4.15.0版本的源码。

然后按照教程把tun模块编译出来,得到tun.ko, 但是把它放到/lib/modules...相应目录下,执行depmod, modprobe都没有反应。

于是使用insmod加载,但是又提示 ‘Require key’ 具体提示忘了,这是因为Linux为了安全,一般不允许加载外部模块,需要设置一下secureboot, 重启。

这时重新insmod, 提示变成了'Invalid format', 使用dmesg命令查看问题,提示'...4.15.0 should be 4.15.70-generic', 也就是版本不匹配,但是又找不到相应版本的源码,于是只能修改下载的这份源码的版本号(modinfo tun.ko可以查看生成的这个模块的版本号信息),但是又要去哪里修改呢?

看到源码中包含了 include/generated/utsrelease.h这个头文件,而其中的内容恰好就是 #define UTS_RELEASE "4.15.0" 也就是版本号信息,这就简单了,直接改为#define UTS_RELEASE " 4.15.0-70-generic" 不就行了吗,改完之后,重新编译模块,(两个小时),拿着它去insmod,dmesg中还是'...4.15.0 should be 4.15.70-generic,也就是版本号还是4.15.0, 明明已经改了,为什么还是原来的版本号呢? 其实从目录include/generated/utsrelease.h, 这个名字可以看出来,generated这个目录是被生成的,刚开始并不存在,那它应该是根据某个配置来生成的utsrelease.h这个文件,于是最终在源码根目录的Makefile中找到了相应的配置(就在前几行),

把这几项修改成上图那样,就可以生成4.15.70-generic的版本号(拼接起来),(好像不太规范,但是结果是对的就好了)

再重新编译(两个小时),可以看到include/generated/utsrelease.h已经拼接出正确的版本号了

查看生成的模块版本号:

已经修改了。

这是再次insmod, 但是又出问题了。dmesg提示“tun: exports duplicate symbol tun_get_socket (owned by kernel)”

符号重复了,于是把tun.c中的tun_get_socket注释掉(还有相应的EXPORT那句)。这次编译会很快。

但是insmod又出问题,dmesg中:“tun: Can't register link_ops”, 终端下提示“已经存在”。

???

明明没有,怎么可能存在呢?

那就先rmmod移除,再insmod, 但是在rmmod时,又提示,tun是内置模块,无法移除。

至此,彻底放弃。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章