在一个redhat7.2 4.4.185版本内核系统下,编译nvme.ko内核模块,拷贝到另一个redhat7.2 4.4.185版本内核系统下,执行insmod后,报 insmod:error inserting 'nvme.ko' :-1 Invalid module format,dmesg中报nvme:desagrees about version of symbol module_layout。
使用modinfo查看原先的 4.4.185版本内核系统下的nvme模块信息如下:
filename: /usr/src/linux-4.4.185/drivers/nvme/host/nvme.ko
version: 1.0
license: GPL
author: Matthew Wilcox <willy@linux.intel.com>
srcversion: 15D5D7EF8792702A797155A
alias: pci:v0000106Bd00002001sv*sd*bc*sc*i*
alias: pci:v*d*sv*sd*bc01sc08i02*
depends:
intree: Y
vermagic: 4.4.185 SMP mod_unload modversions
parm: admin_timeout:timeout in seconds for admin commands (byte)
parm: io_timeout:timeout in seconds for I/O (byte)
parm: shutdown_timeout:timeout in seconds for controller shutdown (byte)
parm: nvme_major:int
parm: nvme_char_major:int
parm: use_threaded_interrupts:int
parm: use_cmb_sqes:use controller's memory buffer for I/O SQes (bool)
我编译的nvme.ko信息如下:
filename: nvme.ko
version: 1.0
license: GPL
author: Matthew Wilcox <willy@linux.intel.com>
srcversion: 15D5D7EF8792702A797155A
alias: pci:v0000106Bd00002001sv*sd*bc*sc*i*
alias: pci:v*d*sv*sd*bc01sc08i02*
depends:
retpoline: Y
vermagic: 4.4.185 SMP mod_unload modversions
parm: admin_timeout:timeout in seconds for admin commands (byte)
parm: io_timeout:timeout in seconds for I/O (byte)
parm: shutdown_timeout:timeout in seconds for controller shutdown (byte)
parm: nvme_major:int
parm: nvme_char_major:int
parm: use_threaded_interrupts:int
parm: use_cmb_sqes:use controller's memory buffer for I/O SQes (bool)
比对的只有intree和retpoline的区别,其他信息都是一样的,不知道这里应该怎么修改,是不是这里的问题?
以下回答部分参考GPT,请确认是否可以解决你的问题:
根据提供的信息,看起来问题出在intree
和retpoline
参数上。在两个版本的内核系统中,这两个参数的值不一致导致了模块加载失败。
intree
参数表示该模块是否在内核源代码树中,原先的模块是intree: Y
,而你编译的模块没有该参数,这可能导致加载失败。你可以尝试在编译时指定该参数为Y
,以确保模块与内核匹配。
retpoline
参数是用于提高系统安全性的一种技术,用于缓解 Spectre 漏洞。原先的模块没有该参数,而你编译的模块有该参数,这可能导致加载失败。你可以尝试在编译时去除该参数,或者确认目标系统的内核是否已启用了 retpoline 技术。
建议的解决方法是重新编译内核模块时,确保提供完整的参数,并且与目标系统的内核版本一致。你可以在编译命令中添加intree=Y
参数,并尝试去除retpoline
参数。另外,还需确认编译环境的配置是否正确,包括编译工具链和相关的依赖库。
如果问题仍然存在,可以尝试使用原先系统中的内核源代码重新编译模块,以确保匹配的一致性。