lxc: ejecutar virtualbox dentro de un contenedor

9

Instalé virtualbox dentro de un contenedor lxc. Sin embargo, cuando intento iniciar una VM, recibo el mensaje:

controlador de kernel no accesible (rc = 1909) ... problema de permiso con / dev / vboxdrv.

Obviamente, esto parece un problema de seguridad predecible.

¿Alguien sabe cómo puedo otorgar permiso al contenedor para acceder a este controlador de dispositivo: '/ dev / vboxdrv'?

Cualquier ayuda o punteros muy apreciados.

usuario108168
fuente

Respuestas:

9

En su host LXC (supongo que Ubuntu aquí):

  1. Instalar los virtualbox-dkms, linux-headers-generic, build-essentialpaquetes y comprobar el núcleo módulos se cargan:

    myhost$ sudo /etc/init.d/virtualbox status
    VirtualBox kernel modules are loaded.
    
  2. Obtenga los números de dispositivo de VirtualBox (10, 55/56/57 en mi caso):

    myhost$ ls -la /dev | grep vbox
    crw-------  1 root root     10,  57 Feb 25 08:22 vboxdrv
    crw-------  1 root root     10,  56 Feb 25 08:22 vboxdrvu
    crw-------  1 root root     10,  55 Feb 25 08:22 vboxnetctl
    
  3. Tome los números de nodo y agréguelos a su configuración de invitado LXC ( /var/lib/lxc/myguest/config):

    ## VirtualBox
    lxc.cgroup.devices.allow = c 10:57 rwm
    lxc.cgroup.devices.allow = c 10:56 rwm
    lxc.cgroup.devices.allow = c 10:55 rwm
    
  4. Reinicie su invitado LXC, instale el virtualboxpaquete y cree los nodos del dispositivo:

    myguest$ sudo mknod -m 600 /dev/vboxdrv c 10 57
    myguest$ sudo mknod -m 600 /dev/vboxdrvu c 10 56
    myguest$ sudo mknod -m 600 /dev/vboxnetctl c 10 55
    
  5. Verifique que VirtualBox en el invitado pueda ver los módulos del kernel:

    myguest$ sudo /etc/init.d/virtualbox status
    VirtualBox kernel modules are loaded.
    
rcoup
fuente
Esta debería ser la respuesta correcta. Los pasos más importantes que carecen de todas las otras respuestas son los pasos 3 y 4.
Léo Lam
1

El controlador del kernel de VirtualBox Linux (vboxdrv) no está cargado o hay un problema de permiso con / dev / vboxdrv. Vuelva a configurar el módulo del núcleo ejecutando

 '/etc/init.d/vboxdrv setup'

como raíz Los usuarios de Ubuntu o Fedora deben instalar el paquete DKMS al principio. Este paquete realiza un seguimiento de los cambios del kernel de Linux y vuelve a compilar el módulo del kernel vboxdrv si es necesario.

Abhishek Anand Amralkar
fuente
Esto es solo una cita del mensaje de error. El controlador se carga pero el contenedor no tiene permiso para acceder a él. Según la respuesta de error. Mi pregunta fue: ¿cómo se concede permiso a los procesos dentro de un contenedor para acceder a los dispositivos del núcleo? ¿Cómo resuelvo el problema de los permisos?
user108168
0

/dev/vboxdrvDebe haber sido propiedad del grupo "vboxuser" y el usuario que inicia el contenedor en ese grupo. Agregue el usuario al grupo y luego asegúrese de que haya permisos de grupo (es decir chmod 660 /dev/vboxdrv).

Nathan C
fuente
Hola Nathan C. Gracias por tu respuesta. ¿Dónde estoy haciendo esto? en el entorno host o el contenedor?
user108168
El host que asume que los controladores del kernel están instalados allí (lo que deberían, ya que LXC depende del kernel del host).
Hola Nathan C Gracias por la aclaración. El dispositivo / dev / vboxdrv es propiedad de root y estoy iniciando el contenedor como root. Estaba ejecutando virtualbox como otro usuario dentro del contenedor, pero intenté ejecutarlo como root. También modifiqué el dispositivo para configurar el grupo en vboxusers y los permisos en 660. Todavía recibo el error. Todo funciona bien en el host para usuarios root y no root. ¿No tengo que poner una configuración en el archivo de configuración lxc para otorgar permisos al contenedor? Eso es lo que asumí, pero no sé cuáles son. Gracias por tu ayuda.
user108168
-1

No debería ser necesario instalar virtualbox en su máquina host, siempre que su contenedor compile el módulo del kernel, simplemente puede cargarlo durante una secuencia de comandos previa al inicio en el contenedor LXC. Para mayor seguridad, puede copiar los módulos del núcleo VBox a su host antes de cargar.

usuario190601
fuente