Esta pagina se ve mejor con JavaScript habilitado

VirtualBox FreeBSD

 ·  🎃 kr0m

VirtualBox es un conocido sistema de virtualización dentro del mundo Linux, en este artículo aprenderemos como instalarlo y configurarlo bajo FreeBSD. Cabe destacar que solo recomiendo su instalación en sistemas de escritorio ya que en servidores tenemos soluciones mucho mas idóneas como IOCage o vm-bhyve y si lo sé VirtualBox también puede instalarse sin soporte gráfico y gestionarse desde la CLI pero la experiencia resulta muy deficiente y dependiendo del hardware utilizado puede dar problemas de estabilidad.

Este artículo está basado en la guía del handbook de FreeBSD con algunas anotaciones adicionales.

Primero nos aseguramos de que nuestro micropocesador disponga de los registros Intel-VT/AMD-v, en mi caso se trata de un Intel Core i7-6700K.

grep VT-x /var/run/dmesg.boot

  VT-x: PAT,HLT,MTF,PAUSE,EPT,UG,VPID
  VT-x: PAT,HLT,MTF,PAUSE,EPT,UG,VPID

Se ha dado el caso en el que la CPU contaba con dichos registros, la opción estaba habilitada en la BIOS pero le presentaba de forma incorrecta dicha información al sistema operativo:

grep VT-x /var/run/dmesg.boot

  VT-x: (disabled in BIOS) HLT,PAUSE
  VT-x: (disabled in BIOS) HLT,PAUSE

En tal caso se solventó actualizando la BIOS a la última versión.

Ahora que estamos seguros de que nuestra CPU es compatible procedemos con la instalación de VirtualBox:

pkg install virtualbox-ose

Cargamos el módulo del kernel:

kldload vboxdrv

Nos aseguramos de que en el próximo arranque sea cargado de nuevo:

vi /boot/loader.conf

vboxdrv_load="YES"

Habilitamos el servicio y lo arrancamos:

sysrc vboxnet_enable="YES"
service vboxnet start

Añadimos el usuario con el que administraremos las máquinas virtuales, al grupo vboxusers:

pw groupmod vboxusers -m kr0m

Si vamos a utilizar bridges en la red de VirtualBox debemos darle permisos al grupo vboxusers:

chown root:vboxusers /dev/vboxnetctl
chmod 0660 /dev/vboxnetctl

Para que los permisos sean perpetuos debemos configurar devfs del siguiente modo:

vi /etc/devfs.conf

own     vboxnetctl root:vboxusers
perm    vboxnetctl 0660

Si además queremos que las máquinas virtuales tengan acceso a los puertos USB del equipo padre debemos añadir el usuario al grupo operator:

pw groupmod operator -m kr0m

Y definir las siguientes reglas devfs:

vi /etc/devfs.rules

[system=10]
add path 'usb/*' mode 0660 group operator

NOTA: Destacar que los permisos de devfs se han configurado en el fichero devfs.conf mientras que las reglas en devfs.rules.

Le indicamos al sistema operativo que cargue nuestras reglas devfs:

sysrc devfs_system_ruleset="system"
service devfs restart

Puede que algunas máquinas virtuales tengan problema adquiriendo ip por DHCP, para que esto funcione debemos habilitar la opción:

Settings -> Network -> Adapter1 -> Promiscous mode: Allow all

Troubleshooting:

Otro sistema de virtualización activo:
Si tenemos otros sistemas de virtualización como CBSD o similar, debemos tener en cuenta que si se carga el módulo vmm las máquinas virtuales de VirtualBox inician pero se quedan en una ventana en negro, no llega a aparecer ni la BIOS ni el boot del sistema.

Los últimos Windows no son capaces de instalar la última versión(6.1.32) de las “Guest Additional Tools”, por ejemplo Win8 y XP no lo permiten, en tal caso debemos bajarnos una versión anterior:
https://download.virtualbox.org/virtualbox/6.1.26/VBoxGuestAdditions_6.1.26.iso

Tema QT problemático:
En algunas ocasiones el tema QT configurado en el sistema puede dar problemas con VirtualBox, este error es muy dificil de debugear ya que VirtualBox simplemente crashea:

Segmentation fault (core dumped)

Y en los logs no aparece ninguna información útil al respecto:

Feb 17 21:41:55 Garrus kernel: pid 69543 (VirtualBox), jid 0, uid 1001: exited on signal 10 (core dumped)

Instalamos el configurador y configuramos un tema mas o menos estandar:

pkg install qt5ct

Módulo desactualizado respecto al sistema:
FreeBSD siempre evita romper la compatibilidad con versiones anteriores, pero esto implica que haya paquetes(normalmente módulos del kernel) que no funcionen en la última versión del sistema operativo teniendo que compilarlos desde los ports, VirtualBox es uno de ellos. Podemos leer la discusión entera en este hilo del foro .

Packages are build for 13.0, kernel modules for 13.1 need to be build from ports.
That will be three months from now, then 13.0-RELEASE will be officially End-of-Life and packages will be built for 13.1-RELEASE.
I think the version mismatch issue will go away when 13.0 reaches EOL (3 months from the release of 13.1) and 13.1 becomes the lowest version. Till then, the solution may be to use the port instead of the binary package. I do not think the port could be broken as a binary package exists, but I am no expert in ports.

Como vemos hasta que la versión 13.0 no llegue a su EOL a finales de Agosto, no se compilará el módulo para 13.1, por esta razón recomiendo actualizar a la siguiente versión de FreeBSD solo cuando la anterior haya llegado a su EOL a no ser que necesitemos con urgencia alguna funcionalidad de la nueva versión.

Si intentamos cargar el módulo instalado desde paquetes binarios:

kldload vboxdrv

Veremos el siguiente error en dmesg:

KLD vboxdrv.ko: depends on kernel - not available or version mismatch
linker_load_file: /boot/modules/vboxdrv.ko - unsupported file type

Eliminamos todos los paquetes relacionados con VirtualBox:

pkg delete virtualbox-ose virtualbox-ose-kmod

Compilamos e instalamos los módulos de VirtualBox:

git clone https://git.FreeBSD.org/ports.git /usr/ports
cd /usr/ports
make fetchindex
git -C /usr/ports branch –list -r
git -C /usr/ports rev-parse –abbrev-ref HEAD
cd /usr/ports/emulators/virtualbox-ose-kmod
make clean
make
make reinstall

Reinstalamos VirtualBox desde binarios:

pkg install virtualbox-ose

Ahora ya podemos cargar el módulo sin problema:

kldload vboxdrv

TRUSS:
Como último recurso siempre podemos utilizar TRUSS para intentar deducir la causa del problema:

sysctl security.bsd.unprivileged_proc_debug=1

security.bsd.unprivileged_proc_debug: 0 -> 1

Un usuario regular ya podrá ejecutar TRUSS:

truss VirtualBox

Si te ha gustado el artículo puedes invitarme a un RedBull aquí