首页 > 解决方案 > 未加载 vboxdrv 内核模块(Unknown rela relocation - debian buster)

问题描述

将 Debian 从 Stretch 更新到 Buster 后,Virtualbox 无法加载内核模块。我有 Virtualbox 6.1 和下一个内核版本:

~$ uname -a Linux debian 4.9.0-4-amd64 #1 SMP Debian 4.9.65-3+deb9u1 (2017-12-23) x86_64 GNU/Linux

此外,我的 Bios 和 Secureboot 已禁用旧版支持。Debian 也被配置为从 Legacy 启动

我见过很多类似的案例,但是所有建议的解决方法都对我不起作用。

我尝试了下一个解决方案:

~$ sudo /sbin/vboxconfig  vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Starting VirtualBox services. vboxdrv.sh: Building
VirtualBox kernel modules. vboxdrv.sh: failed: modprobe vboxdrv
failed. Please use 'dmesg' to find out why.
 
There were problems setting up VirtualBox.  To re-start the set-up
process, run   /sbin/vboxconfig as root.  If your system is using EFI
Secure Boot you may need to sign the kernel modules (vboxdrv,
vboxnetflt, vboxnetadp, vboxpci) before you can load  them. Please see
your Linux system's documentation for more information.

~$ sudo modprobe vboxdrv  modprobe: ERROR: could not insert 'vboxdrv': Exec format error

~$ sudo dpkg-reconfigure virtualbox-6.1 dkms addgroup: The group
`vboxusers' already exists as a system group. Exiting. vboxdrv.sh:
failed: modprobe vboxdrv failed. Please use 'dmesg' to find out why.

There were problems setting up VirtualBox.  To re-start the set-up
process, run   /sbin/vboxconfig as root.  If your system is using EFI
Secure Boot you may need to sign the kernel modules (vboxdrv,
vboxnetflt, vboxnetadp, vboxpci) before you can load  them. Please see
your Linux system's documentation for more information.

~$ sudo apt-get install linux-headers-$(uname -r|sed 's,[^-]*-[^-]*-,,')
virtualbox-6.1 --reinstall ... Unpacking linux-headers-amd64
(4.19+105+deb10u7) over (4.19+105+deb10u7) ... Setting up
linux-headers-amd64 (4.19+105+deb10u7) ... Setting up virtualbox-6.1
(6.1.16-140961~Debian~buster) ... addgroup: The group `vboxusers'
already exists as a system group. Exiting. vboxdrv.sh: failed:
modprobe vboxdrv failed. Please use 'dmesg' to find out why.

There were problems setting up VirtualBox.  To re-start the set-up
process, run   /sbin/vboxconfig as root.  If your system is using EFI
Secure Boot you may need to sign the kernel modules (vboxdrv,
vboxnetflt, vboxnetadp, vboxpci) before you can load them. Please see
your Linux system's documentation for more information. Processing
triggers for mime-support (3.62) ... Processing triggers for
hicolor-icon-theme (0.17-2) ... Processing triggers for systemd
(241-7~deb10u4) ... Processing triggers for shared-mime-info (1.10-1)
... Processing triggers for desktop-file-utils (0.23-4) ...

:~$ sudo /sbin/rcvboxdrv 
setup vboxdrv.sh: Stopping VirtualBox services. 
vboxdrv.sh: Starting VirtualBox services. 
vboxdrv.sh:
Building VirtualBox kernel modules. vboxdrv.sh: failed: modprobe vboxdrv failed. 
Please use 'dmesg' to find out why.

我也尝试了另一种可能的解决方法:

所有与 vboxdrv 内核模块相关的失败操作都在stdoutdmesg中返回此消息:

module: vboxdrv: Unknown rela relocation: 4

标签: linuxlinux-kerneldebianvirtualbox

解决方案


重定位错误看起来像是正在运行的内核和构建模块时使用的 binutils 版本之间的兼容性问题。请参阅这些讨论:

执行格式错误和未知的 rela 重定位:

这个内核提交看起来很相关——0x02 和 0x04 分别是 R_X86_64_PC32 和 R_X86_64_PLT32——但你的内核中没有它。看起来您已经升级到 binutils >= 2.31,所以您的链接器现在决定使用 R_X86_64_PLT32 重定位。

确认,将 binutils 降级到 2.30 可以解决问题

在 Stack Overflow 上,请参阅 binutils 版本


推荐阅读