Comment installer un module de noyau dans une machine invitée LXC?

13

J'essaie d'installer OpenStack DevStack sur une machine invitée LXC. L'un des packages de DevStack nécessite un nouveau module de noyau, mais lorsque j'essaie d'exécuter modprobe sur l'invité LXC, j'obtiens une erreur:

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

Comment puis-je installer ce module pour ma machine invitée LXC?

Mars
la source

Réponses:

13

En bref, vous ne pouvez pas. Les conteneurs LXC partagent leur noyau avec l'hôte et par défaut ne sont pas autorisés à charger les modules (car cela serait assez dangereux).

La recommandation standard est de charger n'importe quel module sur l'hôte avant de démarrer le conteneur. Vous pouvez le faire avec un bon vieux script init ou en utilisant un hook lxc (voir mon récent post ici pour plus de détails: https://www.stgraber.org/2013/12/23/lxc-1-0-some- utilisation du conteneur plus avancée / )

stgraber
la source
1

Aux fins de cette réponse, supposons que votre conteneur soit nommé "foo".

PARTIE A

  1. De l'hôte, enregistrez une copie de /var/lib/lxc/foo/config, au cas où mes instructions casseraient quelque chose.

  2. Vous devrez configurer votre conteneur pour conserver la SYS_MODULE capacité.

    N'oubliez pas qu'une telle configuration donne à ce conteneur la possibilité de prendre en charge le noyau et donc l'hôte .

    Pour ce faire, vous souhaiterez modifier la ligne de configuration "lxc.cap.drop"ou "lxc.cap.keep".

    Si vous exécutez un invité Ubuntu 19.04 créé avec "lxc-create --name foo --template download -- ...":

    • /var/lib/lxc/foo/config contiendra une ligne

      lxc.include = /usr/share/lxc/ubuntu.common.conf
      
    • /usr/share/lxc/ubuntu.common.conf contiendra une ligne

      lxc.include = /usr/share/lxc/config/common.conf
      
    • /usr/share/lxc/config/common.conf contiendra une ligne comme celle-ci

      lxc.cap.drop = mac_admin mac_override sys_time sys_module sys_rawio
      

Vous devez copier cette dernière ligne à la fin de /var/lib/lxc/foo/config(ou n'importe quel endroit après le "include /usr/share/lxc/ubuntu.common.conf"), puis supprimer "sys_module"de cette liste.

Partie B

Vous avez besoin d'une copie de vos modules du noyau dans le conteneur.

Si votre hôte exécute un noyau Ubuntu, vous pourrez peut-être faire quelque chose comme à "sudo apt install kernel-image-$(uname -r)"partir de l'invité.

Sinon depuis l'hôte, vous devrez peut-être faire quelque chose comme ceci (en supposant que votre conteneur est nommé "foo"):

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

Après cela, arrêtez le foo invité s'il est en cours d'exécution, puis redémarrez-le avec quelque chose comme "lxc-start --name foo".

Le conteneur LXC devrait maintenant pouvoir charger et décharger les modules du noyau.

Adam Richter
la source