为特定Ubuntu版本构建内核模块遇加载错误及源码匹配问题
构建OpenvSwitch内核模块加载失败:Invalid module format错误
问题详情
- 加载模块时出错:
$ sudo insmod net/openvswitch/openvswitch.ko insmod: ERROR: could not insert module net/openvswitch/openvswitch.ko: Invalid module format
- 模块modinfo信息:
name: openvswitch vermagic: 6.5.13-g1daceaa37695 SMP preempt mod_unload
- 系统运行内核版本:
$ uname -a Linux virtual-machine 6.5.0-25-generic #25~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Feb 20 16:09:15 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
- 当前Git仓库信息:
$ git remote -v origin https://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/jammy (fetch) origin https://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/jammy (push)
- 当前分支/标签状态:
$ git branch * (HEAD detached at Ubuntu-hwe-6.5-6.5.0-25.25_22.04.1) master
核心问题:找不到与当前运行内核匹配的源码来构建模块。
解决步骤
1. 根源分析
模块的vermagic字段(6.5.13-g1daceaa37695)与系统运行内核版本(6.5.0-25-generic)不匹配,说明构建模块时使用的内核源码版本和当前运行的内核不一致,导致模块格式不兼容。
2. 获取匹配的内核源码
- 直接通过apt安装对应内核的源码包:
sudo apt update && sudo apt install linux-source-6.5.0
源码会解压到/usr/src/linux-source-6.5.0目录下。
- 或者从当前Git仓库确认源码匹配性:
当前已处于Ubuntu-hwe-6.5-6.5.0-25.25_22.04.1标签,先核对内核版本:
cd /path/to/your/linux/source make kernelversion
如果输出与6.5.0-25-generic不符,拉取仓库更新并重新切换标签:
git fetch origin git checkout Ubuntu-hwe-6.5-6.5.0-25.25_22.04.1
3. 配置内核编译环境
- 拷贝当前运行内核的配置文件到源码目录:
cp /boot/config-6.5.0-25-generic /path/to/your/linux/source/.config
- 生成匹配的编译配置:
cd /path/to/your/linux/source make olddefconfig make prepare make modules_prepare
4. 重新构建并加载OpenvSwitch模块
- 进入OpenvSwitch源码目录,指定匹配的内核源码路径重新构建:
cd /path/to/openvswitch/source make clean make KERNELDIR=/path/to/your/matching/linux/source
- 构建完成后重新加载模块:
sudo insmod net/openvswitch/openvswitch.ko
内容的提问来源于stack exchange,提问作者Cpp Code
相关产品推荐
相关产品推荐

