KVM y VirtualBox en la misma Máquina

Advertencia
Este artículo se actualizó por última vez el 2020-10-06, el contenido puede estar desactualizado.

Antes de comenzar, quería contarles que hay una promoción en DigitalOcean donde te dan un crédito de USD 100.00 durante 60 días para que puedas probar los servicios que este Proveedor Cloud ofrece. Lo único que tienes que hacer es suscribirte a DigitalOcean con el siguiente enlace: https://bit.ly/digitalocean-itsm


KVM y VirtualBox supuestamente no deberían convivir, o mejor explicado, VirtualBox no se podría ejecutar mientras los módulos de KVM estan cargados en memoria. KVM puede funcionar sin ningun problema aún teniendo VirtualBox instalado en la misma máquina.

Con este panorama, te voy a explicar como usar KVM y VirtualBox en la misma máquina sin desinstalar ninguno de los dos, en vivo, sin reinicios.

Al ejecutar VirtualBox, podrás ver el siguiente mensaje:

/images/kvm-virtualbox/virtualbox-error.png
VirtualBox no puede iniciar una máquina Virtual

Dice: “VirtualBox no pudo habilitar la extension AMD-V. Por favor deshabilite la extensión kernel de KVM, recompile su kernel y reinicie” Vamos a calmarnos. Este mensaje es bastante confuso, no necesitas recompilar nada. Nos tomará un par de minutos y será no destructivo para nada.

VirtualBox y KVM no pueden convivir juntos. Es como una pareja que viven en la misma casa pero no se pueden ni ver. Esto quiere decir que habría que deshabilitar KVM para que VirtualBox pudiera funcionar. La cuestión es: ¿Cómo hacemos esto? La respuesta es bien sencilla: insertando y eliminando los módulos del kernel de KVM.

Linux soporta insertar y eliminar módulos del kernel de la memoria al vuelo, sin necesidad reiniciar el sistema. Para lograr nuestro objetivo, vamos a utilizar los comandos insmod y rmmod

Primero, vamos a ver el kernel. Ejecutamos el comando lsmod en búsqueda de cuales módulos están cargados en memoria y vamos a filtrar por vbox y kvm:

1
2
3
sudo lsmod | grep vbox
vboxnetflt             28672  0
vboxdrv               512000  2 vboxnetadp,vboxnetflt
1
2
3
sudo lsmod | grep kvm
kvm_amd               114688  0
kvm                   823296  1 kvm_amd

Como se puede ver, VirtualBox usa los drivers vboxdrv y vboxnetflt, mientras que KVM usa los drivers kvm y kvm_amd (tengo una máquina con procesador AMD, si tuvieras un procesador Intel te aparecería el driver kvm_intel) Lo siguiente que vamos a hacer es deshabilitar el módulo del kernel de KVM:

1
2
sudo rmmod kvm
sudo rmmod kvm_amd

Iniciamos cualquier máquina virtual y comprobamos que podemos ejecutarla.

/images/kvm-virtualbox/virtualbox-funcionando.png
VirtualBox ya funcionando

Así como deshabilitamos los módulos, podemos volver a habilitarlos. Necesitamos para ello ubicar los módulos en el disco y cargarlos. Se puede usar el comando modprobe, el cual puede ser muy útil si el módulo a cargar tuviera dependencias.

Vamos a buscar el módulo con find, restringiendo la búsqueda a que solo encuentre los archivos kvm.ko y kvm-amd.ko de nuestro actual kernel [$(uname -r)] y lo ordenamos con sort:

1
2
3
4
5
6
find /lib/modules/$(uname -r) -iname '*kvm*.ko*' | sort
/lib/modules/5.8.13-300.fc33.x86_64/kernel/arch/x86/kvm/kvm-amd.ko.xz
/lib/modules/5.8.13-300.fc33.x86_64/kernel/arch/x86/kvm/kvm-intel.ko.xz
/lib/modules/5.8.13-300.fc33.x86_64/kernel/arch/x86/kvm/kvm.ko.xz
/lib/modules/5.8.13-300.fc33.x86_64/kernel/drivers/gpu/drm/i915/gvt/kvmgt.ko.xz
/lib/modules/5.8.13-300.fc33.x86_64/kernel/drivers/ptp/ptp_kvm.ko.xz

Si observamos los tres primeros resultados, vemos el modulo kvm-amd, kvm-intel y kvm, vamos a cargar kvm y escogeremos dependiendo de nuestro procesador:

1
sudo insmod /lib/modules/$(uname -r)/kernel/arch/x86/kvm/kvm.ko.xz

Para AMD:

1
sudo insmod /lib/modules/$(uname -r)/kernel/arch/x86/kvm/kvm-amd.ko.xz

Para Intel:

1
sudo insmod /lib/modules/$(uname -r)/kernel/arch/x86/kvm/kvm-intel.ko.xz

Automaticemos esto de una vez. Vamos a necesitar dos scripts: Uno que deshabilite los módulos de KVM y otro que los habilite. Si quieremos ser bien estrictos, detendremos el servicio de VirtualBox cuando usemos KVM (yo en realidad no lo veo necesario) e iniciarlo después de terminar alguna máquina virtual de KVM. Comprobamos el estatus del servicio:

1
sudo systemctl status vboxdrv
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
● vboxdrv.service - VirtualBox Linux kernel module
     Loaded: loaded (/usr/lib/virtualbox/vboxdrv.sh; enabled; vendor preset: disabled)
     Active: active (exited) since Tue 2020-10-06 11:09:00 -03; 6h ago
      Tasks: 0 (limit: 17813)
     Memory: 0B
     CGroup: /system.slice/vboxdrv.service
oct 06 11:08:59 localhost.localdomain systemd[1]: Starting VirtualBox Linux kernel module...
oct 06 11:08:59 localhost.localdomain vboxdrv.sh[1073]: vboxdrv.sh: Starting VirtualBox services.
oct 06 11:09:00 localhost.localdomain vboxdrv.sh[1207]: VirtualBox services started.
oct 06 11:09:00 localhost.localdomain systemd[1]: Started VirtualBox Linux kernel module.

Detenemos entonces el servicio:

1
sudo systemctl stop vboxdrv
Consejo

Si no sabemos muy bien donde se encuentra los programas rmmod e insmod, con which lo podemos ver:

1
2
which rmmod
/usr/sbin/rmmod
1
2
which insmod
/usr/sbin/insmod

Creamos un script para habilitar VirtualBox y deshabilitar KVM:

1
vi deshabilitar_kvm.sh

Pega el siguiente contenido (cambia por kvm_intel en caso que tengas un procesador Intel), guardamos y salimos del editor:

1
2
3
4
#!/bin/bash
/usr/sbin/rmmod kvm_amd
/usr/sbin/rmmod kvm
systemctl start vboxdrv

Haremos un script para habilitar KVM y deshabilitar VirtualBox:

1
vi habilitar.sh

Pegamos el siguente contenido, guardamos y salimos del editor:

1
2
3
4
#!/bin/bash
systemctl stop vboxdrv
/usr/sbin/insmod /lib/modules/$(uname -r)/kernel/arch/x86/kvm/kvm.ko.xz
/usr/sbin/insmod /lib/modules/$(uname -r)/kernel/arch/x86/kvm/kvm-amd.ko.xz

Les damos permisos de ejecución:

1
chmod +x deshablitar_kvm.sh habilitar_kvm.sh

Y cuando lo ejecutamos, tiene que ser con permisos sudo:

1
sudo ./deshabilitar_kvm.sh
1
sudo ./habilitar_kvm.sh

Bueno esto es todo por hoy, espero les haya gustado. ¡Hasta la próxima!

Si te pareció útil este artículo y el proyecto en general, considera brindarme un café :)

Buy me a coffeeBuy me a coffee