¿Cómo instalo un módulo de kernel en una máquina invitada LXC?

13

Estoy intentando instalar OpenStack DevStack en una máquina invitada LXC. Uno de los paquetes de DevStack requiere un nuevo módulo de kernel, pero cuando intento ejecutar modprobe en el invitado LXC aparece un error:

ubuntu@lxc$ sudo modprobe scsi_transport_iscsi
FATAL: Could not load /lib/modules/3.2.0-48-generic/modules.dep: No such file or directory

¿Cómo puedo instalar este módulo para mi máquina invitada LXC?

Marte
fuente

Respuestas:

13

La respuesta corta es, no puedes. Los contenedores LXC comparten su núcleo con el host y, por defecto, no pueden cargar módulos (ya que esto sería bastante peligroso).

La recomendación estándar es tener cualquier módulo cargado en el host antes de iniciar el contenedor. Puede hacerlo con un buen script de inicio antiguo o utilizando un gancho lxc (consulte mi publicación reciente aquí para obtener más detalles: https://www.stgraber.org/2013/12/23/lxc-1-0-some- uso de contenedor más avanzado / )

Stgraber
fuente
1

A los fines de esta respuesta, supongamos que su contenedor se llama "foo".

PARTE A

  1. Desde el host, guarde una copia de /var/lib/lxc/foo/config, en caso de que mis instrucciones rompan algo.

  2. Deberá configurar su contenedor para mantener la SYS_MODULE capacidad.

    Tenga en cuenta que dicha configuración le da a ese contenedor la capacidad de hacerse cargo del núcleo y, por lo tanto, del host .

    Para ello, tendrá que cambiar el "lxc.cap.drop"o "lxc.cap.keep"línea de configuración.

    Si está ejecutando un invitado Ubuntu 19.04 que fue creado con "lxc-create --name foo --template download -- ...":

    • /var/lib/lxc/foo/config contendrá una línea

      lxc.include = /usr/share/lxc/ubuntu.common.conf
      
    • /usr/share/lxc/ubuntu.common.conf contendrá una línea

      lxc.include = /usr/share/lxc/config/common.conf
      
    • /usr/share/lxc/config/common.conf contendrá una línea como esta

      lxc.cap.drop = mac_admin mac_override sys_time sys_module sys_rawio
      

Debe copiar esa última línea al final de /var/lib/lxc/foo/config(o cualquier lugar después de "include /usr/share/lxc/ubuntu.common.conf") y luego eliminarla "sys_module"de esa lista.

Parte B

Necesita una copia de los módulos de su núcleo en el contenedor.

Si su host está ejecutando un kernel de Ubuntu, entonces puede hacer algo como "sudo apt install kernel-image-$(uname -r)"desde el invitado.

De lo contrario, desde el host, es posible que deba hacer algo como esto (suponiendo que su contenedor se llame "foo"):

mkdir -p /var/lib/lxc/foo/rootfs/lib/modules
cp -apr /lib/modules/$(uname -r) /var/lib/lxc/foo/rootfs/lib/modules/

Después de eso, apague el foo invitado si se está ejecutando, y luego reinícielo con algo como "lxc-start --name foo".

El contenedor LXC ahora debería poder cargar y descargar módulos del núcleo.

Adam Richter
fuente