Kvm: проверка модуля не выполнена: подпись и/или требуемый ключ отсутствует - повреждение ядра
Я использую 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.
Все компилируется без предупреждение. Любая помощь приветствуется!
Ответы
Ответ 1
Кажется, что поставщик вашей системы включил проверку подлинности модуля ядра на своем ядре, что означает, что он не будет загружать какой-либо модуль, который поставщик не подписал, Другими словами, ваш исправленный модуль не подписан (правильно), и ядро откажется его загрузить.
Предполагается, что это мешает вредоносным программам и руткитам загружать вредоносные модули ядра.
Я предлагаю вам обратиться к вашему поставщику. На вашей платформе может быть опция, позволяющая отключить проверку подписи. В противном случае ваш поставщик может подписать модуль для вас. У вас может быть даже ключ и детали алгоритма проверки подписи и вы можете сами его подписать.
Не зная, на какой платформе вы работаете, трудно дать более конкретные предложения.
Ответ 2
Вместо повторной настройки ядра эту ошибку (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
Ответ 3
В общем случае, если вы создаете собственное ядро и используете make oldconfig
. Это копирует удаляемый конфигурационный файл из /boot. В настоящее время большинство модулей ядра должны быть подписаны поставщиком 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
Ответ 4
Перейдите в исходный каталог ядра и выполните (например,):
./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"