記一次失敗的安裝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是內置模塊,無法移除。

至此,徹底放棄。

 

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