kvm:模块validation失败:签名和/或所需密钥丢失 – 内核损坏

我使用Ubuntu 14.04 LTS和内核版本3.13.11.4
我试图加载补丁KVM模块kvmkvm-intel ,我得到以下错误

kvm: module verification failed: signature and/or required key missing - tainting kernel
kvm: module has bad taint, not creating trace events

使用的源是创build我正在运行的图像相同的源。
我检查了符号,并确保错误不是由于在我导出函数的修补文件中不包括EXPORT_SYMBOL_GPL()

我也看到了一些关于不同的内核版本导致这个错误的东西,但我build立了内核,我用我用来创build补丁kvm模块相同的源引导。
一切都没有警告编译。 任何帮助表示赞赏!

看起来你的系统的供应商已经在内核上启用了内核模块签名验证 ,这意味着它不会加载任何供应商没有签名的模块。 换句话说,你的补丁模块没有被正确地签名,内核将拒绝加载它。

这点应该是防止恶意软件和rootkit加载恶意内核模块。

我建议你联系你的供应商。 您的平台上可能有某个选项禁用签名检查。 否则,您的供应商可能会为您签字。 你甚至可以拥有签名验证算法的关键和细节,并且可以自己签名。

不知道你在运行什么平台,很难给出更具体的建议。

而不是重新配置内核,这个错误( module verification failed )可以通过在模块本身的Makefile的顶部添加一行CONFIG_MODULE_SIG=n来解决:

 CONFIG_MODULE_SIG=n # If KERNELRELEASE is defined, we've been invoked from the # kernel build system and can use its language. ifneq ($(KERNELRELEASE),) obj-m := hello.o # Otherwise we were called directly from the command # line; invoke the kernel build system. else KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules endif 

一般来说,如果您正在构建自定义内核并使用make oldconfig 。 这将从/ boot复制退出的config- *文件。 现在大部分内核模块都需要由linux厂商签名。 所以在编译内核之前编辑.config并禁用CONFIG_MODULE_SIG_ALL和CONFIG_MODULE_SIG。

 CONFIG_MODULE_SIG=n CONFIG_MODULE_SIG_ALL=n # CONFIG_MODULE_SIG_FORCE is not set # CONFIG_MODULE_SIG_SHA1 is not set # CONFIG_MODULE_SIG_SHA224 is not set # CONFIG_MODULE_SIG_SHA256 is not set # CONFIG_MODULE_SIG_SHA384 is not set 

转到内核源代码目录并执行(例如):

 ./scripts/sign-file sha512 ./signing_key.priv ./signing_key.x509 /lib/modules/3.10.1/kernel/drivers/char/my_module.ko 

对于内核4.4。*,键的位置应该如下:

 ./scripts/sign-file sha512 ./certs/signing_key.pem ./certs/signing_key.x509 path/to/your/kernel/module.ko 

通过打开.config并在CONFIG_MODULE_SIG配置值中读取它,检查内核正在使用的摘要算法是什么。

 CONFIG_MODULE_SIG=y CONFIG_MODULE_SIG_ALL=y CONFIG_MODULE_SIG_SHA512=y CONFIG_MODULE_SIG_HASH="sha512"