Ubuntu编译内核 https://www.jianshu.com/p/660e69326e65 在 linux 2.4 及之后的内核版本中,tun/tap 驱动是默认编译进内核中的。 (tun编译到内核中, tap作为内核模块编译) linux 查看内核编译进的驱动(不是模块)

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

然后重复上述步骤

**************************************************************************************

如果上面都不能解决,需要安装新内核和模块

进入编译目录,依次执行如下命令

  1. sudo make -j 8
  2. sudo make modules_install
  3. 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

重点:

在 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