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:标识作为内核模块编译
空格:表示该功能不编译到内核中,即新的内核将不支持该功能。