Ubuntu 18.04.4
1、查看內核版本
uname -a
2、下載內核源碼
可以輸入”sudo apt-get install linux-source“后按Tab鍵看能安裝哪些內核,這里下載上一步查看到內核版本。
sudo apt-get install linux-source-5.3.0
3、解壓內核源碼
一般下載的內核源碼在/usr/src/linux-source-5.3.0/文件夾下。解壓位置可以自行指定,解壓和編譯需要足夠的空間。
sudo tar xvjf /usr/src/linux-source-5.3.0/linux-source-5.3.0.tar.bz
也可以去 https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ 下載對應的源碼
4、編譯配置
進入解壓文件,在配置之前執行安裝操作,如果仍然有錯,安裝 錯誤提示的包 即可。
sudo apt-get install -y libncurses5-dev flex bison libssl-dev
sudo make menuconfig
5、編譯配置
將當前內核配置文件cp到內核源碼目錄下:
sudo cp /boot/config-5.3.0-28-generic /usr/src/linux-source-5.3.0/linux-source-5.3.0/.config
←和→選擇“Load”, 選擇剛剛復制的.config文件
↑和↓選擇”Device Drivers" ,然后按Enter。
↑和↓選擇”Network device support" ,然后按Enter。
↑和↓選擇”Universal TUN/TAP driver support" ,然后按M鍵,使得選項前變成<M>。然后按←或→選擇save, 保存為.config 最后Exit。
6、編譯模塊
sudo make -j 8 modules
7、復制tun模塊
sudo cp ./drivers/net/tun.ko /lib/modules/5.3.0-28-generic/kernel/drivers/net/
8、使能tun模塊
sudo depmod -a
sudo modprobe tun
如果順利執行“modinfo tun”命令將看到tun模塊的信息,
如果仍然沒有tun模塊信息,采取手動安裝tun.ko
sudo insmod drivers/net/tun.ko
你可能看到 could not insert module tun.ko: Invalid module format 信息,這是因為當前的內核和tun模塊的編譯的內核不同導致
使用dmesg | tail 查詢日志
version magic '5.0.0 SMP mod_unload ' should be '5.0.0-32-generic SMP mod_unload '
修改源代碼根目錄下的Makefile文件
VERSION = 5
PATCHLEVEL = 0
SUBLEVEL = 0
EXTRAVERSION = -32-generic
原理請搜索 內核可裝載模塊的版本檢查機制
然后重新編譯
make distclean
然后重復上述步驟
**************************************************************************************
如果上面都不能解決,需要安裝新內核和模塊
進入編譯目錄,依次執行如下命令
-
sudo make -j 8
-
sudo make modules_install
-
sudo make install
執行完成后 查看啟動配置文件,會看到有新內核的標識
cat /boot/grub/grub.cfg
最后“reboot”命令重啟系統就可以看到tun模塊的信息
如果重啟后 出現以下錯誤 或者 不能啟動系統
[end Kernel panic - not syncing: System is deadlocked on memory]
將虛擬機的內存 增大 (2048 M → 4096M)
參考:
https://www.jianshu.com/p/b1d315ea002e
https://blog.csdn.net/qq_34160841/article/details/104901266
重點:
https://www.jianshu.com/p/660e69326e65
在 linux 2.4 及之后的內核版本中,tun/tap 驅動是默認編譯進內核中的。 (tun編譯到內核中, tap作為內核模塊編譯)
查看TUN是否安裝
是否有/dev/net/tun文件
file tun
tun: character special (10/200) #10和200分別是主設備號和次設備號
linux 查看內核編譯進的驅動(不是模塊)
cat /lib/modules/$(uname -r)/modules.builtin
上述中insmod出現 Invalid module format 問題,可以使用下面命令,查看錯誤日志
dmesg | tail
可以找到以下日志
exports duplicate symbol tun_is_xdp_frame (owned by kernel)
表示 tun已經編譯進內核,所以無需將tun編譯成.ko模塊進行安裝
命令查詢
cat /lib/modules/$(uname -r)/modules.builtin
cat /lib/modules/$(uname -r)/modules.builtin | more
grep "=y" /boot/config-$(uname -r) | more
/boot/config-5.3.0-28-generic 此文件中可以查看 /boot/config-$(uname -r)
在menuconfig中選擇m和 *的區別:
*: 模塊驅動編譯到內核中,啟動時自動加載
M:標識作為內核模塊編譯
空格:表示該功能不編譯到內核中,即新的內核將不支持該功能。
https://www.jb51.net/LINUXjishu/406899.html