升级后Virtualbox出现故障--无法安装virtuabox-dkms,也无法运行modprobe vboxdrv。

我正在使用Ubuntu 20.04,并最近进行了一次dist-upgrade。
uname -r: 5.8.0-34-generic

我通过以下方式清除了Virtualbox及其相关文件:
sudo apt-get purge "^virtualbox-.*"

尝试重新安装任何软件后,现在出现以下情况:
>>$ sudo apt install --reinstall linux-headers-$(uname -r)
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 0 not upgraded.
3 not fully installed or removed.
Need to get 0 B/1,236 kB of archives.
After this operation, 0 B of additional disk space will be used.
(Reading database ... 328260 files and directories currently installed.)
Preparing to unpack .../linux-headers-5.8.0-34-generic_5.8.0-34.37~20.04.2_amd64.deb ...
Unpacking linux-headers-5.8.0-34-generic (5.8.0-34.37~20.04.2) over (5.8.0-34.37~20.04.2) ...
Setting up linux-headers-5.8.0-34-generic (5.8.0-34.37~20.04.2) ...
/etc/kernel/header_postinst.d/dkms:
 * dkms: running auto installation service for kernel 5.8.0-34-generic

Kernel preparation unnecessary for this kernel.  Skipping...

Building module:
cleaning build area...
make -j8 KERNELRELEASE=5.8.0-34-generic -C /lib/modules/5.8.0-34-generic/build M=/var/lib/dkms/virtualbox/6.1.10/build...(bad exit status: 2)
ERROR: Cannot create report: [Errno 17] File exists: '/var/crash/virtualbox-dkms.0.crash'
Error! Bad return status for module build on kernel: 5.8.0-34-generic (x86_64)
Consult /var/lib/dkms/virtualbox/6.1.10/build/make.log for more information.
   ...done.
Setting up virtualbox-dkms (6.1.10-dfsg-1~ubuntu1.20.04.1) ...
Removing old virtualbox-6.1.10 DKMS files...

------------------------------
Deleting module version: 6.1.10
completely from the DKMS tree.
------------------------------
Done.
Loading new virtualbox-6.1.10 DKMS files...
Building for 5.8.0-34-generic
Building initial module for 5.8.0-34-generic
ERROR: Cannot create report: [Errno 17] File exists: '/var/crash/virtualbox-dkms.0.crash'
Error! Bad return status for module build on kernel: 5.8.0-34-generic (x86_64)
Consult /var/lib/dkms/virtualbox/6.1.10/build/make.log for more information.
dpkg: error processing package virtualbox-dkms (--configure):
 installed virtualbox-dkms package post-installation script subprocess returned error exit status 10
dpkg: dependency problems prevent configuration of virtualbox:
 virtualbox depends on virtualbox-dkms (>= 6.1.10-dfsg-1~ubuntu1.20.04.1) | virtualbox-source (>= 6.1.10-dfsg-1~ubuntu1.20.04.1) | virtualbox-modules; however:
  Package virtualbox-dkms is not configured yet.
  Package virtualbox-source is not installed.
  Package virtualbox-modules is not installed.
  Package virtualbox-dkms which provides virtualbox-modules is not configured yet.

dpkg: error processing package virtualbox (--configure):
 dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of virtualbox-qt:
 virtualbox-qt depends on virtualbox (= 6.1.10-dfsg-1~ubuntu1.20.04.1); however:
  Package virtualbox is not configured yet.

dpkg: error processing package virtualbox-qt (--configure):
 dependency problems - leaving unconfigured
No apport report written because the error message indicates its a followup error from a previous failure.
                                                                                                          No apport report written because the error message indicates its a followup err
or from a previous failure.
                           Errors were encountered while processing:
 virtualbox-dkms
 virtualbox
 virtualbox-qt
E: Sub-process /usr/bin/dpkg returned an error code (1)

跑步
sudo apt-get install -f

没有解决依赖问题。我仍然得到相同的输出结果。
>>$ sudo apt-get install -f
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
3 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Setting up virtualbox-dkms (6.1.10-dfsg-1~ubuntu1.20.04.1) ...
Removing old virtualbox-6.1.10 DKMS files...

------------------------------
Deleting module version: 6.1.10
completely from the DKMS tree.
------------------------------
Done.
Loading new virtualbox-6.1.10 DKMS files...
Building for 5.8.0-34-generic
Building initial module for 5.8.0-34-generic
ERROR: Cannot create report: [Errno 17] File exists: '/var/crash/virtualbox-dkms.0.crash'
Error! Bad return status for module build on kernel: 5.8.0-34-generic (x86_64)
Consult /var/lib/dkms/virtualbox/6.1.10/build/make.log for more information.
dpkg: error processing package virtualbox-dkms (--configure):
 installed virtualbox-dkms package post-installation script subprocess returned error exit status 10
dpkg: dependency problems prevent configuration of virtualbox:
 virtualbox depends on virtualbox-dkms (>= 6.1.10-dfsg-1~ubuntu1.20.04.1) | virtualbox-source (>= 6.1.10-dfsg-1~ubuntu1.20.04.1) | virtualbox-modules; however:
  Package virtualbox-dkms is not configured yet.
  Package virtualbox-source is not installed.
  Package virtualbox-modules is not installed.
  Package virtualbox-dkms which provides virtualbox-modules is not configured yet.

dpkg: error processing package virtualbox (--configure):
 dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of virtualbox-qt:
 virtualbox-qt depends on virtualbox (= 6.1.10-dfsg-1~ubuntu1.20.04.1); however:
  Package virtualbox is not configured yet.

dpkg: error processing package virtualbox-qt (--configure):
 dependency problems - leaving unconfigured
No apport report written because the error message indicates its a followup error from a previous failure.
                                                                                                          No apport report written because the error message indicates its a followup error from a previous failure.
                           Errors were encountered while processing:
 virtualbox-dkms
 virtualbox
 virtualbox-qt
E: Sub-process /usr/bin/dpkg returned an error code (1)


重新配置如下,将产生相同的消息:
sudo dpkg --configure -a

位于 /var/crash/virtualbox-dkms.0.crash 的崩溃报告显示以下内容:
ProblemType: Package
DKMSBuildLog:
 DKMS make.log for virtualbox-6.1.10 for kernel 5.8.0-34-generic (x86_64)
 Thursday, January 07, 2021 AM09:37:43 HKT
 make: Entering directory '/usr/src/linux-headers-5.8.0-34-generic'
   CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/linux/SUPDrv-linux.o
   CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/SUPDrv.o
   CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/SUPDrvGip.o
   CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/SUPDrvSem.o
   CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/SUPDrvTracer.o
   CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/SUPLibAll.o
   CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/alloc-r0drv.o
   CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/initterm-r0drv.o
   CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/memobj-r0drv.o
   CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/mpnotification-r0drv.o
   CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/powernotification-r0drv.o
   CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/assert-r0drv-linux.o
 In file included from ./include/asm-generic/percpu.h:7,
                  from ./arch/x86/include/asm/percpu.h:556,
                  from ./arch/x86/include/asm/preempt.h:6,
                  from ./include/linux/preempt.h:78,
                  from ./include/linux/spinlock.h:51,
                  from /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/linux/../SUPDrvInternal.h:79,
                  from /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/linux/SUPDrv-linux.c:32:
 /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/linux/SUPDrv-linux.c: In function ‘supdrvOSChangeCR4’:
 /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/linux/SUPDrv-linux.c:760:38: error: ‘cpu_tlbstate’ undeclared (first use in this function); did you mean ‘cpuhp_state’?
   760 |     RTCCUINTREG uOld = this_cpu_read(cpu_tlbstate.cr4);
       |                                      ^~~~~~~~~~~~
 ./include/linux/percpu-defs.h:318:9: note: in definition of macro ‘__pcpu_size_call_return’
   318 |  typeof(variable) pscr_ret__;     \
       |         ^~~~~~~~
 /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/linux/SUPDrv-linux.c:760:24: note: in expansion of macro ‘this_cpu_read’
   760 |     RTCCUINTREG uOld = this_cpu_read(cpu_tlbstate.cr4);
       |                        ^~~~~~~~~~~~~
 /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/linux/SUPDrv-linux.c:760:38: note: each undeclared identifier is reported only once for each function it appears in
   760 |     RTCCUINTREG uOld = this_cpu_read(cpu_tlbstate.cr4);
       |                                      ^~~~~~~~~~~~
 ./include/linux/percpu-defs.h:318:9: note: in definition of macro ‘__pcpu_size_call_return’
   318 |  typeof(variable) pscr_ret__;     \
       |         ^~~~~~~~
 /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/linux/SUPDrv-linux.c:760:24: note: in expansion of macro ‘this_cpu_read’
   760 |     RTCCUINTREG uOld = this_cpu_read(cpu_tlbstate.cr4);
       |                        ^~~~~~~~~~~~~
 make[2]: *** [scripts/Makefile.build:288: /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/linux/SUPDrv-linux.o] Error 1
 make[2]: *** Waiting for unfinished jobs....
 make[1]: *** [scripts/Makefile.build:519: /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv] Error 2
 make: *** [Makefile:1780: /var/lib/dkms/virtualbox/6.1.10/build] Error 2
 make: Leaving directory '/usr/src/linux-headers-5.8.0-34-generic'
DKMSKernelVersion: 5.8.0-34-generic
Date: Thu Jan  7 09:37:46 2021
DuplicateSignature: dkms:virtualbox-dkms:6.1.10-dfsg-1~ubuntu1.20.04.1:/var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/linux/SUPDrv-linux.c:760:38: error: ‘cpu_tlbstate’ undeclared (first use in this function); did you mean ‘cpuhp_state’?
Package: virtualbox-dkms 6.1.10-dfsg-1~ubuntu1.20.04.1
PackageVersion: 6.1.10-dfsg-1~ubuntu1.20.04.1
SourcePackage: virtualbox
Title: virtualbox-dkms 6.1.10-dfsg-1~ubuntu1.20.04.1: virtualbox kernel module failed to build

任何帮助都将不胜感激。


在接受了@Terrace和其他人的建议后,我尝试了从源代码安装。但是在安装virtualbox-dkms时仍然遇到了错误。之后,我直接卸载了virtual-dkms。
sudo apt-get remove virtualbox-dkms

然后重新尝试安装。
sudo dpkg -i virtualbox-6.1_6.1.16-140961~Ubuntu~eoan_amd64.deb
```

Wich succeeded. Thank you!

如果你正在使用Ubuntu 20.04 LTS,为什么要使用5.8内核呢?因为Ubuntu 20.04.1仍然使用5.4内核。你是在运行Ubuntu还是Pop OS? - guiverc
1Ubuntu...我收到了一个更新通知,然后执行了apt-get upgrade...结果显示一些linux-generic-hwe-20.04的软件包被暂停升级。我之前遇到过无法识别HDMI连接的问题,希望通过升级能解决...所以我就继续执行了dist-upgrade...我并没有详细了解哪个版本是最新或者适合我的,所以就直接进行了升级。 - jRo
我的Virtualbox仍然在5.8.0-34-generic内核下正常工作,但我是通过Virtualbox官方提供的.deb文件进行安装的:https://www.virtualbox.org/wiki/Linux_Downloads,版本号为6.1.16。这让我想知道,是否需要更新存储库中的6.1.10版本以适应新的内核更新。 - Terrance
你是否已经安装了VirtualBox的源文件?在发布的输出中,它抱怨缺少virtualbox-source - da_kingpin
1我同意:我在Ubuntu 20.04升级了内核到5.8版本...我现在正在努力使它重新运行起来... - Lucas Aimaretto
在Ubuntu 20.04 LTS上,我还通过apt upgrade命令安装了linux-image-5.8.0-36-generic。在开始源代码下载之前,我更愿意降级内核并查看是否有效。 - sastorsl
注意!删除5.8.0内核并恢复到旧版本内核。目前似乎无法升级到5.8.0内核。我已经成功使VirtualBox再次正常工作,接下来我会在一篇文章中详细介绍。 - sastorsl
7个回答

更新

注意:
- 当proposed迁移到release时,本指南将在不久的将来变得无关紧要。

  • 6.1.16-dfsg-6~ubuntu1.20.04.1现已在Store 'ubuntu-focal-updates-multiverse'中,并且5.8内核有几个更新,当前版本为5.8.0-40-generic
    如果保持定期更新,应该不会有问题。

建议选择1和4以便将来自动更新VirtualBox。 选项2、3a和3b的手动安装不包括VirtualBox的自动未来更新。
错误

在Ubuntu 20.04上安装VirtualBox 6.1.16

选项1(简单)

预发布更新(focal-proposed)
    • 打开 软件和更新
    • 开发者选项
    • 选择 ✅ 预发布更新(focal-proposed)
    • 选择 关闭
    • 在弹出窗口中,选择 重新加载,以更新可用软件的信息
    • 打开 软件更新器
    • 取消选择除了 VirtualBox 之外的所有/任何其他更新(其中包括其子类别中的多个软件包)
    • 选择 立即安装

上一篇文章

错误 virtualbox-dkms 6.1.10-dfsg-1~ubuntu1.20.04.1 在内核5.8下无法构建
我按照@Terrance的建议,从源代码安装了6.1.16版本。
我的之前的虚拟机都能正常工作。

编辑:根据@BeastOfCaerbannog的请求/建议。


在Ubuntu 20.04上安装VirtualBox 6.1.16

选项2(简单)

*如果未安装GDebi > 前往软件商店并安装
*如果出现错误:与已安装的软件包'virtualbox-qt'冲突 > 前往软件商店并移除Virtualbox 6.1.10


选项3a(简单)

  • 前往下载适用于Linux主机的VirtualBox
  • VirtualBox 6.1.16 for Linux
    点击Ubuntu 19.10 / 20.04
  • 将文件保存在Downloads文件夹中
  • 前往Downloads文件夹
  • 右键点击已下载的软件包,选择“使用软件安装”(或双击打开,或选择后按下回车键)
  • 进行安装

选项3b(高级)

  • 在终端中执行以下操作
cd Downloads 

sudo apt install ./virtualbox-6.1_6.1.16-140961~Ubuntu~eoan_amd64.deb

或者

sudo apt install ./v*  

选项4(高级)

通过使用Virtualbox仓库安装Virtualbox

 
感谢@Terrance


1嗨,欢迎来到Ask Ubuntu!你能详细说明一下你是如何从源代码安装6.1.16的吗?这样会使你的回答更加有用! - BeastOfCaerbannog
1昨天我写了一个答案,介绍如何使用Virtualbox仓库安装Virtualbox:https://askubuntu.com/a/1305883/231142。如果你想在你的答案中使用它,请随意。=) - Terrance
谢谢,这个方法有效!然而,用于Ubuntu 20.04的直接下载链接却得到了一个过时的版本。我之前在apt中安装了6.1.26版本,而该链接提供给我的是6.1.16版本。通过您提供的下载页面并选择Ubuntu 20.04的链接,我得到了6.1.32版本。 - null

选择最新的可用的5.4内核。
我使用的是20.04版本,这个方法对我有效:
sudo grub-reboot "1>4"
sudo reboot
或者在启动时手动选择5.4内核。
我猜这个问题很快就会在Ubuntu的5.8内核中修复。

Virtualbox可以直接从Ubuntu软件源安装,所以不需要费心去下载Virtualbox、dkms等。这些都由Ubuntu软件包负责处理,包括在启用了安全引导(Secure Boot)并正确安装了MOK密钥的情况下的dkms相关内容!
只需使用命令sudo apt install virtualbox即可安装。
在Ubuntu 20.04上,通常会有内核版本5.4,并且Virtualbox的版本为6.1.10。
而在Ubuntu 20.10上,内核版本为5.8,Virtualbox版本为6.1.14。两者在我的机器上都运行良好。
试一试吧!;-)
希望对你有所帮助。

问题
5.8.0内核似乎存在错误,并且不再是升级的一部分。如果安装了该内核并出现故障,必须将其删除。
1. 启动旧版本内核 2. 删除5.8.0内核 3. 修复NVIDIA驱动程序问题(我的问题,可能因人而异)
启动旧版本内核
我更喜欢在启动时选择内核。有不同的方法可以实现这一点,但我选择将引导菜单从“隐藏”更改为“菜单”,并增加超时时间。
$ sudo vi /etc/default/grub
...
$ grep GRUB_TIMEOUT /etc/default/grub
#GRUB_TIMEOUT_STYLE=hidden
#GRUB_TIMEOUT=0
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=10

记得更新grub
sudo update-grub

重新启动并选择较旧的内核
现在在启动时会出现一个菜单,选择"高级...",然后选择一个较旧的内核(在我的情况下是5.4.0-60-generic)。
启动后,我必须再次更新grub以保持菜单设置。
sudo update-grub

删除“新”/失败的内核

列出已安装的内核版本。APT警告说它不是“脚本友好”的,也就是说输出结果可能会有所不同,因此请谨慎使用脚本。

# 
sudo apt list --installed 2>/dev/null | grep -o -E "^linux[^/]+5.8.0-[^/]+"

删除linux-headers
# First remove linux-headers so that modprobe won't fail on virtualbox
# I had to remove these versions, your list might differ.
sudo apt remove linux-headers-5.8.0-34-generic
sudo apt remove linux-headers-5.8.0-36-generic

然后删除剩余的内核包。
# NB! Handle with care.
# Do this ONLY if you are comfortable, or prepare a list and run one by one.
sudo apt remove $(sudo apt list --installed 2>/dev/null | grep -o -E "^linux[^/]+5.8.0-[^/]+")

重启电脑,然后开始修复Nvidia驱动程序(如果适用于您)。
修复Nvidia驱动程序
在还原内核后,我的屏幕设置无法正常工作 - 外部显示器无法加载。因此,我删除了Nvidia软件包,重新启动计算机,然后再次安装它们。
sudo apt remove $(sudo apt list --installed 2>/dev/null | grep -o -E "^nvidia[^/]")
# Remove packages now no longer needed
sudo apt-get autoremove

重新启动 - 我这样做是为了确保系统完全干净。你可能可以跳过这一步。
再次安装Nvidia驱动程序。
sudo apt install nvidia-driver-460

重启后,我的外接显示器恢复正常。

确保软件包解决

sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get autoremove

启动Virtualbox和Virtualbox客户机。

我的VirtualBox客户机现在已经启动。 在这个过程中,我没有碰过VirtualBox,只是内核(和图形驱动程序)。

恢复Grub更改

如果您宁愿跳过等待菜单或者您的计算机处于其他人可以物理访问的办公空间中,现在是恢复Grub更改的时候了。


我通过以下指示成功解决了这个问题。
第一步是删除当前安装的所有VirtualBox。
sudo apt-get remove virtualbox
sudo apt-get remove virtualbox-dkms # i have to remove manually

页面下载新版本

关闭所有正在运行的VirtualBox实例

通过运行以下命令进行安装:

sudo dpkg -i virtualbox-6.1_6.1.16-140961~Ubuntu~eoan_amd64.deb

当我尝试使用apt安装时,出现了错误。

我个人在5.8.0版本中根本无法运行它,所以我决定降级,通常只需按照@sastorsi的回答选择一个旧内核来启动GRUB即可,但是我为了修复这个问题而变得疯狂,最终没有任何旧内核可用。 如果你也没有可用的内核,可以使用以下命令安装最新的5.4.0版本:
sudo apt install linux-image-5.4.0-60-generic linux-headers-5.4.0-60 linux-headers-5.4.0-60-generic

如果你在使用HDMI、WIFI等方面遇到问题,你需要安装内核模块(我实际上最终重新安装了Ubuntu,因为我不知道这一点)。
sudo apt install linux-modules-5.4.0-60-generic linux-modules-extra-5.4.0-60-generic

然后删除有问题的内核:
sudo apt remove linux-image-5.8.0-36-generic && sudo apt autoremove

如果它不能自动启动到所需的内核,你可以在启动时从GRUB选择它,或者你可以使用这个链接answer让GRUB选择一个特定的版本。 基本上,你只需要将"Advanced options for Ubuntu>Ubuntu, with Linux 5.4.0-60-generic"添加到GRUB_DEFAULT行中,它应该看起来像这样:GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.4.0-60-generic" 最后,你应该能够像往常一样安装Virtualbox。
sudo apt install virtualbox virtualbox-dkms

在接受了@Terrace和其他人的建议后,我尝试了从源代码安装。但是在安装virtualbox-dkms时仍然遇到了错误。之后,我直接卸载了virtual-dkms。
sudo apt-get remove virtualbox-dkms

然后重新尝试安装:
sudo dpkg -i virtualbox-6.1_6.1.16-140961~Ubuntu~eoan_amd64.deb

成功了。谢谢!