Come installo un modulo kernel in una macchina guest LXC?


13

Sto tentando di installare OpenStack DevStack su una macchina guest LXC. Uno dei pacchetti di DevStack richiede un nuovo modulo del kernel, ma quando provo ad eseguire modprobe sul guest LXC ricevo un errore:

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

Come posso installare questo modulo per la mia macchina ospite LXC?

Risposte:


13

La risposta breve è che non puoi. I container LXC condividono il loro kernel con l'host e per impostazione predefinita non sono autorizzati a caricare i moduli (poiché sarebbe piuttosto pericoloso).

La raccomandazione standard è di caricare qualsiasi modulo sull'host prima di avviare il contenitore. Puoi farlo con un buon vecchio script init o usando un hook lxc (vedi il mio post recente qui per i dettagli: https://www.stgraber.org/2013/12/23/lxc-1-0-some- più-avanzato-contenitore-utilizzo / )


1

Ai fini di questa risposta, supponiamo che il tuo contenitore sia chiamato "pippo".

PARTE A

  1. Dall'host, salva una copia di /var/lib/lxc/foo/config, nel caso in cui le mie istruzioni rompano qualcosa.

  2. Sarà necessario configurare il contenitore per mantenere la SYS_MODULE funzionalità.

    Tenere presente che una tale configurazione offre a quel contenitore la possibilità di assumere il controllo del kernel e quindi dell'host .

    Per fare questo, si vuole cambiare la "lxc.cap.drop"o "lxc.cap.keep"riga di configurazione.

    Se stai eseguendo un guest Ubuntu 19.04 che è stato creato con "lxc-create --name foo --template download -- ..."allora:

    • /var/lib/lxc/foo/config conterrà una linea

      lxc.include = /usr/share/lxc/ubuntu.common.conf
      
    • /usr/share/lxc/ubuntu.common.conf conterrà una linea

      lxc.include = /usr/share/lxc/config/common.conf
      
    • /usr/share/lxc/config/common.conf conterrà una linea come questa

      lxc.cap.drop = mac_admin mac_override sys_time sys_module sys_rawio
      

Dovresti copiare l'ultima riga alla fine di /var/lib/lxc/foo/config(o qualsiasi altro posto dopo il "include /usr/share/lxc/ubuntu.common.conf") e quindi eliminare "sys_module"da quell'elenco.

Parte B.

È necessaria una copia dei moduli del kernel nel contenitore.

Se il tuo host esegue un kernel Ubuntu, potresti essere in grado di fare qualcosa di simile "sudo apt install kernel-image-$(uname -r)"dal guest.

Altrimenti dall'host, potrebbe essere necessario fare qualcosa del genere (supponendo che il tuo contenitore sia chiamato "pippo"):

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

Dopodiché, spegni l'ospite foo se è in esecuzione, quindi riavvialo con qualcosa di simile "lxc-start --name foo".

Il contenitore LXC dovrebbe ora essere in grado di caricare e scaricare i moduli del kernel.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.