Como instalo um módulo do kernel em uma máquina convidada LXC?

13

Estou tentando instalar o OpenStack DevStack em uma máquina convidada LXC. Um dos pacotes do DevStack requer um novo módulo do kernel, mas quando tento executar o modprobe no convidado LXC, recebo um erro:

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

Como posso instalar este módulo na minha máquina convidada LXC?

Marte
fonte

Respostas:

13

Resposta curta é, você não pode. Os contêineres LXC compartilham seu kernel com o host e, por padrão, não têm permissão para carregar módulos (pois isso seria bastante perigoso).

A recomendação padrão é ter qualquer módulo carregado no host antes de iniciar o contêiner. Você pode fazer isso com um bom script init antigo ou usando um gancho lxc (veja meu post recente aqui para obter detalhes: https://www.stgraber.org/2013/12/12/23/lxc-1-0-some- more-advanced-container-use / )

stgraber
fonte
1

Para os fins desta resposta, vamos supor que seu contêiner seja chamado "" foo ".

PARTE A

  1. No host, salve uma cópia /var/lib/lxc/foo/config, caso minhas instruções quebrem alguma coisa.

  2. Você precisará configurar seu contêiner para manter a SYS_MODULE capacidade.

    Esteja ciente de que essa configuração oferece a esse contêiner a capacidade de assumir o kernel e, portanto, o host .

    Para fazer isso, você desejará alterar a linha de configuração "lxc.cap.drop"ou "lxc.cap.keep".

    Se você estiver executando um convidado do Ubuntu 19.04 que foi criado com "lxc-create --name foo --template download -- ...":

    • /var/lib/lxc/foo/config conterá uma linha

      lxc.include = /usr/share/lxc/ubuntu.common.conf
      
    • /usr/share/lxc/ubuntu.common.conf conterá uma linha

      lxc.include = /usr/share/lxc/config/common.conf
      
    • /usr/share/lxc/config/common.conf irá conter uma linha como esta

      lxc.cap.drop = mac_admin mac_override sys_time sys_module sys_rawio
      

Você deve copiar a última linha para o final de /var/lib/lxc/foo/config(ou qualquer outro local após a "include /usr/share/lxc/ubuntu.common.conf") e excluir "sys_module"da lista.

Parte B

Você precisa de uma cópia dos seus módulos do kernel no contêiner.

Se o seu host estiver executando um kernel do Ubuntu, você poderá fazer algo parecido "sudo apt install kernel-image-$(uname -r)"com o convidado.

Caso contrário, no host, talvez seja necessário fazer algo assim (assumindo que o contêiner seja chamado "foo"):

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

Depois disso, desligue o convidado foo se estiver em execução e, em seguida, reinicie-o com algo parecido "lxc-start --name foo".

O contêiner LXC agora deve ser capaz de carregar e descarregar módulos do kernel.

Adam Richter
fonte