关键词:ubuntu, virtualbox

ubuntu 安装 VirtualBox

NOTICE: 安装前先看一下这个文档: https://www.virtualbox.org/ticket/19644?cversion=0&cnum_hist=8 我就是进了这个坑,被坑了一天刚出来

我安装时遇到的坑

为了防止大家继续踩坑,我先把我安装时困扰我好久的坑说明一下。

我直接使用 apt 安装了 virtualbox 之后,当我要点击打开时,死活不出对应的界面,我就用命令行 virtualbox 直接启动,发现报错了,错误是我没有安装 virtualbox-dkms, 于是我用 apt 安装了 virtualbox-dkms, 然后重启 /sbin/vboxconfig 时还是报错,我查询了不少的资料,大部分集中在这个问题上

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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.

于是我按照这个步骤进行操作,发现依然无法正常打开 virtualbox, 然后我就执行了如下操作(这个操作基于这个文档), (在执行这个操作前,我还发现了一篇文档,具体找不到了,这篇文章里嫌处理麻烦,直接在 BIOS 里将 EFI 的 Secure boot 关闭了,我也跟着关闭了,我的电脑主板是华硕的,因此,参考了这里, 因为华硕主板有一些是加锁的,设置了安全启动的原因, 所以我刚开始看到的也是无法直接修改,但是后来根据这个文章处理好了, 但是此时 virtualbox 还是不行, 我就执行了下一步)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
fupeng@fupeng:~$ sudo dpkg-reconfigure virtualbox-dkms 

------------------------------
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.

对 virtualbox-dkms 进行重新 dpkg-reconfigure, 然后就发现了这个错误, 这个错误让我查看 /var/crash/virtualbox-dkms.0.crash 这个日至文件,于是我就打开了他

  1 ProblemType: Package
  2 DKMSBuildLog:
  3  DKMS make.log for virtualbox-6.1.10 for kernel 5.8.0-34-generic (x86_64)
  4  2020年 12月 19日 星期六 23:47:31 CST
  5  make: 进入目录“/usr/src/linux-headers-5.8.0-34-generic”
  6    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/linux/SUPDrv-linux.o
  7    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/SUPDrv.o
  8    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/SUPDrvGip.o
  9    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/SUPDrvSem.o
 10    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/SUPDrvTracer.o
 11    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/SUPLibAll.o
 12    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/alloc-r0drv.o
 13    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/initterm-r0drv.o
 14    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/memobj-r0drv.o
 15    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/mpnotification-r0drv.o
 16    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/powernotification-r0drv.o
 17    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/assert-r0drv-linux.o
 18    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/alloc-r0drv-linux.o
 19    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/initterm-r0drv-linux.o
 20    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/memobj-r0drv-linux.o
 21    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/memuserkernel-r0drv-linux.o
 22    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/mp-r0drv-linux.o
 23    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/mpnotification-r0drv-linux.o
 24    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/process-r0drv-linux.o
 25    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/rtStrFormatKernelAddress-r0drv-linux.o
 26    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/semevent-r0drv-linux.o
 27    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/semeventmulti-r0drv-linux.o
 28  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/alloc-r0drv-linux.c: In function ‘rtR0MemAllocExecVm    Area’:
 29  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/alloc-r0drv-linux.c:171:15: error: implicit declarat    ion of function ‘__get_vm_area’; did you mean ‘get_vm_area’? [-Werror=implicit-function-declaration]
 30    171 |     pVmArea = __get_vm_area(cbAlloc, VM_ALLOC, MODULES_VADDR, MODULES_END);
 31        |               ^~~~~~~~~~~~~
 32        |               get_vm_area
 33  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/alloc-r0drv-linux.c:171:13: warning: assignment to ‘    struct vm_struct *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
 34    171 |     pVmArea = __get_vm_area(cbAlloc, VM_ALLOC, MODULES_VADDR, MODULES_END);
 35        |             ^
 36  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/alloc-r0drv-linux.c:204:14: error: implicit declarat    ion of function ‘map_vm_area’; did you mean ‘get_vm_area’? [-Werror=implicit-function-declaration]
 37    204 |         if (!map_vm_area(pVmArea, PAGE_KERNEL_EXEC,
 38        |              ^~~~~~~~~~~
 39        |              get_vm_area
 40  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/memobj-r0drv-linux.c: In function ‘rtR0MemObjNativeF    ree’:

......

 98    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/semmutex-r0drv-linux.o
 99    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/spinlock-r0drv-linux.o
100    CC [M]  /var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/thread-r0drv-linux.o
101  make[2]: *** [scripts/Makefile.build:290:/var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/memobj-r0d    rv-linux.o] 错误 1
102  make[2]: *** 正在等待未完成的任务....
103  make[2]: *** [scripts/Makefile.build:290:/var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/linux/SUPDrv-linux.o]     错误 1
104  cc1: some warnings being treated as errors
105  make[2]: *** [scripts/Makefile.build:290:/var/lib/dkms/virtualbox/6.1.10/build/vboxdrv/r0drv/linux/alloc-r0dr    v-linux.o] 错误 1
106  make[1]: *** [scripts/Makefile.build:519:/var/lib/dkms/virtualbox/6.1.10/build/vboxdrv] 错误 2
107  make: *** [Makefile:1780:/var/lib/dkms/virtualbox/6.1.10/build] 错误 2
108  make: 离开目录“/usr/src/linux-headers-5.8.0-34-generic”
109 DKMSKernelVersion: 5.8.0-34-generic
110 Date: Sat Dec 19 23:47:34 2020
111 DuplicateSignature: dkms:virtualbox-dkms:6.1.10-dfsg-1~ubuntu1.20.04.1:/var/lib/dkms/virtualbox/6.1.10/build/vb    oxdrv/r0drv/linux/alloc-r0drv-linux.c:171:15: error: implicit declaration of function ‘__get_vm_area’; did you     mean ‘get_vm_area’? [-Werror=implicit-function-declaration]
112 Package: virtualbox-dkms 6.1.10-dfsg-1~ubuntu1.20.04.1
113 PackageVersion: 6.1.10-dfsg-1~ubuntu1.20.04.1
114 SourcePackage: virtualbox
115 Title: virtualbox-dkms 6.1.10-dfsg-1~ubuntu1.20.04.1: virtualbox kernel module failed to build

看到这个日志文件,我大概知道具体原因了,就是 get_vm_area 这个函数出问题了,到这里猜测应该是内核兼容性的问题了,于是我就 google 了一个这个 virtualbox get_vm_area 就出现了这篇 issue 文章, 这篇文章里详细的解释了具体原因,就是内核 5.8 不能编译 virtualbox-6.1.14 前的版本了。所以我从这里面找到了解决的办法:

然后找到了 virtualbox 官网的地址给出的 testbuild 方式

然后我就直接下载了 Linux 64-bit 6.1.x revision 141968 版本,然后下载好 chmod 后, 直接执行,然后就安装好了,此时,启动,已经可以启动起来了。

正式开始的文章

Oracle 公司的自由开源产品 VirtualBox 是一款出色的虚拟化工具,专门用于桌面操作系统。与另一款虚拟化工具 Linux 上的 VMWare Workstation 相比起来,我更喜欢它。 你可以使用 VirtualBox 等虚拟化软件在虚拟机中安装和使用其他操作系统。

例如,你可以在 Windows 上的 VirtualBox 中安装 Linux。同样地,你也可以用 VirtualBox 在 Linux 中安装 Windows。

你也可以用 VirtualBox 在你当前的 Linux 系统中安装别的 Linux 发行版。事实上,这就是我用它的原因。如果我听说了一个不错的 Linux 发行版,我会在虚拟机上测试它,而不是安装在真实的系统上。当你想要在安装之前尝试一下别的发行版时,用虚拟机会很方便。

在本新手教程中,我将向你展示在 Ubuntu 和其他基于 Debian 的 Linux 发行版上安装 VirtualBox 的各种方法。 在 Ubuntu 和基于 Debian 的 Linux 发行版上安装 VirtualBox

这里提出的安装方法也适用于其他基于 Debian 和 Ubuntu 的 Linux 发行版,如 Linux Mint、elementar OS 等。

从 Ubuntu 仓库安装 VirtualBox

优点:安装简便

缺点:较旧版本

在 Ubuntu 上下载 VirtualBox 最简单的方法可能是从软件中心查找并下载。

VirtualBox 在 Ubuntu 软件中心提供

你也可以使用这条命令从命令行安装:

sudo apt install virtualbox

然而,如果在安装前检查软件包版本,你会看到 Ubuntu 仓库提供的 VirtualBox 版本已经很老了。

举个例子,在写下本教程时 VirtualBox 的最新版本是 6.0,但是在软件中心提供的是 5.2。这意味着你无法获得最新版 VirtualBox 中引入的新功能。

使用 Oracle 网站上的 Deb 文件安装 VirtualBox

优点:安装简便,最新版本

缺点:不能更新

如果你想要在 Ubuntu 上使用 VirtualBox 的最新版本,最简单的方法就是使用 Deb 文件。

Oracle 为 VirtiualBox 版本提供了开箱即用的二进制文件。如果查看其下载页面,你将看到为 Ubuntu 和其他发行版下载 deb 安装程序的选项。

VirtualBox Linux Download

你只需要下载 deb 文件并双击它即可安装。就是这么简单。

下载 virtualbox for Ubuntu

然而,这种方法的问题在于你不能自动更新到最新的 VirtualBox 版本。唯一的办法是移除现有版本,下载最新版本并再次安装。不太方便,是吧?

用 Oracle 的仓库安装 VirtualBox

优点:自动更新

缺点:安装略微复杂

现在介绍的是命令行安装方法,它看起来可能比较复杂,但与前两种方法相比,它更具有优势。你将获得 VirtualBox 的最新版本,并且未来它还将自动更新到更新的版本。我想那就是你想要的。

要通过命令行安装 VirtualBox,请在你的仓库列表中添加 Oracle VirtualBox 的仓库。添加 GPG 密钥以便你的系统信任此仓库。现在,当你安装 VirtualBox 时,它会从 Oracle 仓库而不是 Ubuntu 仓库安装。如果发布了新版本,本地 VirtualBox 将跟随一起更新。让我们看看怎么做到这一点:

首先,添加仓库的密钥。你可以通过这一条命令下载和添加密钥:

wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -

Mint 用户请注意:
下一步只适用于 Ubuntu。如果你使用的是 Linux Mint 或其他基于 Ubuntu 的发行版,请将命令行中的 $(lsb_release -cs) 替换成你当前版本所基于的 Ubuntu 版本。例如,Linux Mint 19 系列用户应该使用 bionic,Mint 18 系列用户应该使用 xenial,像这样:
sudo add-apt-repository “deb [arch=amd64] <http://download.virtualbox.org/virtualbox/debian> **bionic** contrib“`

现在用以下命令来将 Oracle VirtualBox 仓库添加到仓库列表中:

sudo add-apt-repository “deb [arch=amd64] http://download.virtualbox.org/virtualbox/debian $(lsb_release -cs) contrib”

如果你有读过我的文章检查 Ubuntu 版本,你大概知道 lsb_release -cs 将打印你的 Ubuntu 系统的代号。

注:如果你看到 “add-apt-repository command not found” 错误,你需要下载 software-properties-common 包。

现在你已经添加了正确的仓库,请通过此仓库刷新可用包列表并安装 VirtualBox:

sudo apt update && sudo apt install virtualbox-6.0

提示:一个好方法是输入 sudo apt install virtualbox- 并点击 tab 键以查看可用于安装的各种 VirtualBox 版本,然后通过补全命令来选择其中一个版本。

如何从 Ubuntu 中删除 VirtualBox

现在你已经学会了如何安装 VirtualBox,我还想和你提一下删除它的步骤。

如果你是从软件中心安装的,那么删除它最简单的方法是从软件中心下手。你只需要在已安装的应用程序列表中找到它,然后单击“删除”按钮。

另一种方式是使用命令行:

sudo apt remove virtualbox virtualbox-*

请注意,这不会删除你用 VirtualBox 安装的操作系统关联的虚拟机和文件。这并不是一件坏事,因为你可能希望以后或在其他系统中使用它们是安全的。

解决安装完后的其他问题


参考: