大家好,欢迎来到IT知识分享网。
由于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是内置模块,无法移除。
至此,彻底放弃。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/25877.html