在 Gentoo 中构建 VirtualBox 模块

在 Gentoo 中构建 VirtualBox 模块

我有一个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 模块需要签名 - vboxdrvvboxnetflt和。vboxnetadpvboxpci

Gentoo 模块官方签名文章的链接

相关内容