我正在使用
Ubuntu 14.04 LTS
和内核版本 3.13.11.4
。 kvm
和 kvm-intel
,但出现以下错误 kvm: module verification failed: signature and/or required key missing - tainting kernel
和。kvm: module has bad taint, not creating trace events
使用的源与创建我当前运行的图像的源相同。
我已经检查了符号,并确保错误不是由于在导出函数的修补文件中不包含
EXPORT_SYMBOL_GPL()
引起的。 我还看到了一些关于不同内核版本导致此错误的内容,但我构建了使用与创建修补的 kvm 模块相同的源启动的内核。
一切都在没有警告的情况下进行编译。如有任何帮助,我们将不胜感激!
无需重新配置内核,只需在模块本身的
module verification failed
顶部添加一行 CONFIG_MODULE_SIG=n
即可解决此错误 (Makefile
):
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
转到内核源代码目录并执行(例如):
./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"
注意:如果您使用的是不是您构建的现有内核,请通过查看相应的配置文件(主要在
或/proc/*
中)来检查内核正在使用的摘要算法。对于Ubuntu的情况,在/boot/*
。/boot/config-$(uname -r)
您的系统供应商似乎已在您的内核上启用了内核模块签名验证,这意味着它不会加载供应商尚未签名的任何模块。换句话说,您的修补模块没有(正确)签名,内核将拒绝加载它。
这样做的目的是为了防止恶意软件和 rootkit 加载恶意内核模块。
我建议您联系您的供应商。您的平台上可能有一个选项可以禁用签名检查。否则,您的供应商也许能够为您签署该模块。您甚至可能拥有密钥和签名验证算法的详细信息,并且可以自己对其进行签名。
在不知道你运行在什么平台上的情况下,很难给出更具体的建议。
一般来说,如果您正在构建自定义内核并使用
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