我有一个gentoo安装,我之前make mrproper
在里面发布过/usr/src/linux
。
我想安装 VirtualBox 模块,因此我将/boot/System.map
和复制/boot/config
到/usr/src/linux
(配置已复制到 /usr/src/linux/.config)。
然后我跑了:
emerge -1 =app-emulation/virtualbox-modules-4.3.32
其发出以下警告:
make[3]: Entering directory '/usr/src/linux-3.18.25-gentoo-r1'
test -e include/generated/autoconf.h -a -e include/config/auto.conf || ( \
echo >&2; \
echo >&2 " ERROR: Kernel configuration is invalid."; \
echo >&2 " include/generated/autoconf.h or include/config/auto.conf are missing.";\
echo >&2 " Run 'make oldconfig && make prepare' on kernel src to fix it."; \
echo >&2 ; \
/bin/false)
mkdir -p /var/tmp/portage/app-emulation/virtualbox-modules-4.3.32/work/vboxpci/.tmp_versions ; rm -f /var/tmp/portage/app-emulation/virtualbox-modules-4.3.32/work/vboxpci/.tmp_versions/*
WARNING: Symbol version dump ./Module.symvers
is missing; modules will have no dependencies and modversions.
emerge 没有失败,但是当它完成时,我无法加载模块:
# modprobe -v vboxdrv
insmod /lib/modules/3.18.25-gentoo-r1-09-07-2015/misc/vboxdrv.ko
modprobe: ERROR: could not insert 'vboxdrv': Exec format error
谁能给我建议如何解决这个问题?
答案1
您很可能在内核中启用了模块签名选项。 VirtualBox 模块不会自动签名,每次构建新内核时,我都会重建模块并对其进行签名。
如果是这种情况 - 在终端中输入以下内容(如果您在 proc 中嵌入了内核配置):
zcat /proc/config.gz | grep CONFIG_MODULE_SIG
如果您没有嵌入内核配置,请找到您的内核配置 - 它可能位于/usr/src/linux/.config
或/etc/kernels/kernel-config-<the-corresponding-kernel-version>
例如,您应该看到以下或类似的输出 (YMMV):
CONFIG_MODULE_SIG=y
CONFIG_MODULE_SIG_FORCE=y
CONFIG_MODULE_SIG_ALL=y
# 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
CONFIG_MODULE_SIG_SHA512=y
CONFIG_MODULE_SIG_HASH="sha512"
CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
根据选择的哈希函数,您应该使用相同的哈希函数来对模块进行签名。有一个名为 的实用程序sign-file
。
在早期版本中,它sign-file
位于/usr/src/linux/
,至于4.5
内核,它现在位于/usr/src/linux/scripts/
(同样是 YMMV)。
启用签名模块并实际启动带有签名模块的系统should
通常意味着您已经拥有生成的密钥和 x509 文件(您可以自己生成签名密钥)。
执行以下命令:
/usr/src/linux/scripts/sign-file sha512 /usr/src/linux/certs/signing_key.pem /usr/src/linux/certs/signing_key.x509 /lib/modules/<your-kernel-version>/misc/vboxdrv.ko
应该有效地签署你的模块并且应该准备好modprobe
。
找到 x509 文件和您的签名密钥,并替换上面命令中的路径。
- 仅供参考,有 4 个 virtualbox 模块需要签名 -
vboxdrv
、vboxnetflt
和。vboxnetadp
vboxpci