2014-07-26 74 views
19

我使用的是Ubuntu 14.04 LTS和內核版本3.13.11.4
我試圖加載補丁的KVM模塊kvmkvm-intel,我收到以下錯誤
kvm:模塊驗證失敗:簽名和/或所需密鑰丟失 - 內核內核

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模塊相同的源引導內核。
編譯時沒有警告。任何幫助表示讚賞!

回答

9

看起來你的系統供應商已經在你的內核上啓用了kernel module signature verification這意味着它不會加載供應商沒有簽名的任何模塊。換句話說,你的補丁模塊沒有被正確地簽名,內核將拒絕加載它。

這樣做的目的是防止惡意軟件和rootkit加載惡意內核模塊。

我建議你聯繫你的供應商。在您的平臺上某處可能會有一個選項禁用簽名檢查。否則,您的供應商可能會爲您簽署該模塊。您甚至可能擁有簽名驗證算法的密鑰和詳細信息,並且可以自己簽名。

不知道你在哪個平臺上運行,很難給出更具體的建議。

+0

使用此頁簽署我的模塊http://wiki.gentoo.org/wiki/Signed_kernel_module_support – user2743

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 
+0

所以內核需要在這裏重新編譯?也許對不起跛腳的問題,但我在Linux的初學者和重新編譯內核爲我變成了紅燈。只是試圖讓以太網連接工作。看起來我需要額外的包,我不必這樣做(我不會有wifi,因爲無法工作) – rank1

9

轉到內核源代碼目錄(對於如)做:

./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" 
+0

這應該是答案,它簽署了自定義構建模塊。 – TerrenceSun

16

而不是重新配置內核,這個錯誤(module verification failed)可能只需添加一行CONFIG_MODULE_SIG=nMakefile爲模塊本身上得到解決:

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 
+1

你試過了嗎?我發現添加「CONFIG_MODULE_SIG = n」仍然打印「'模塊驗證失敗:簽名和/或所需的密鑰丟失 - 內核損壞」消息。 –

+1

是的,我試過了。你在使用什麼內核? – artm

+0

我同時使用Suse(3.12)和RHEL 7(3.10.0),結果相同。我也在[kernelnewbies.org](http://lists.kernelnewbies.org/pipermail/kernelnewbies/2015-November/015330.html)上討論這個問題,但現在似乎沒有滿意的答案。你能幫忙檢查這個郵件線程嗎?非常感謝! –