我正在使用Ubuntu 14.04 LTS
和内核版本3.13.11.4
。
我正在尝试加载已修补的KVM模块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模块相同的源启动的内核。一切都编译没有警告。任何帮助表示赞赏!
答案 0 :(得分:10)
您的系统供应商似乎已在您的内核上启用kernel module signature verification,这意味着它不会加载供应商尚未签署的任何模块。换句话说,您的修补模块没有签名(正确),内核将拒绝加载它。
这应该是为了防止恶意软件和rootkit加载恶意内核模块。
我建议您与供应商联系。您的平台上可能有一个选项可以禁用签名检查。否则,您的供应商可能会为您签署该模块。您甚至可能拥有签名验证算法的密钥和详细信息,并且可以自己签名。
在不知道您正在运行什么平台的情况下,很难提供更具体的建议。
答案 1 :(得分:10)
转到内核源目录并执行(例如):
./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"
答案 2 :(得分:9)
通常,如果要构建自定义内核并使用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