Coexisting VirtualBox and VMWare Fusion on macOS
Both VirtualBox and VMWare Fusion are neat virtualization tools. I use Fusion for most day to day work - it’s served me well for a long time and I have a significant stash of useful machines in it. But sometimes I also need to use VirtualBox, typically for working with Vagrant. The problem is that the two of them don’t get along very well…
When you install VirtualBox and then try to start a VM in Fusion you’ll see something like this:
Googling this will lead you to the answer that VirtualBox and Fusion are incompatible and that you need to uninstall VirtualBox. I didn’t find a better solution documented, so here it is in blog post form now instead.
The incompatibility is between the kernel extensions used by each. I think Fusion is the more well behaved in this respect - it loads and unloads its kernel extensions as it starts and stops. This means that when it’s not running, VirtualBox can run. But VirtualBox doesn’t do this. It loads kernel extensions at installation time (and presumably on boot thereafter). You can see these in kextstat
:
jb@unu:~ $ kextstat | grep virtualbox 226 3 0xffffff7f83d52000 0x61000 0x61000 org.virtualbox.kext.VBoxDrv (5.1.22) 93316754-E074-3CE2-9464-DDA4356FF02E <7 5 4 3 1> 228 0 0xffffff7f83bd8000 0x8000 0x8000 org.virtualbox.kext.VBoxUSB (5.1.22) D956DCFA-4E4F-320A-BEBC-E4823501B1FF <227 226 41 7 5 4 3 1> 230 0 0xffffff7f83c22000 0x6000 0x6000 org.virtualbox.kext.VBoxNetAdp (5.1.22) 4A6C39E1-5D90-3E34-9673-57B0DD779CD7 <226 5 4 1> 231 0 0xffffff7f83c28000 0x5000 0x5000 org.virtualbox.kext.VBoxNetFlt (5.1.22) 446923A0-E855-3E75-9173-66FA4CE2474A <226 7 5 4 3 1>
We can work around this with a couple of scripts so that we can at least switch between the two manually. To be able to run Fusion we need to unload the VirtualBox kexts:
#!/bin/sh for id in VBoxNetAdp VBoxNetFlt VBoxUSB VBoxDrv; do kextunload -b "org.virtualbox.kext.$id" done
Save that as ~/bin/unload-vbox
or something and run it as sudo unload-vbox
. When we’re not running Fusion we can load the VirtualBox kexts and VirtualBox will work fine:
#!/bin/sh for id in VBoxDrv VBoxUSB VBoxNetFlt VBoxNetAdp; do kextload -r "/Library/Application Support/VirtualBox" \ "/Library/Application Support/VirtualBox/$id.kext" done
In the end, some sort of coexistence is achieved. :)