web-dev-qa-db-fra.com

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

J'essaie d'installer OpenStack DevStack sur un ordinateur invité 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, une erreur se produit:

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 mon ordinateur invité LXC?

12
mars

La réponse courte est, vous ne pouvez pas. Les conteneurs LXC partagent leur noyau avec celui de l'hôte et ne sont pas autorisés par défaut à charger des modules (ce qui serait très dangereux).

La recommandation standard consiste à charger tout module sur l'hôte avant de démarrer le conteneur. Vous pouvez le faire avec un bon vieux script d'init ou en utilisant un hook lxc (voir mon post récent ici pour plus de détails: https://www.stgraber.org/2013/12/23/lxc-1- 0-some-more-advanced-container-use / )

13
stgraber

Pour les besoins de cette réponse, supposons que votre conteneur s'appelle "foo".

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

  2. Vous devrez configurer votre conteneur pour conserver la capacité SYS_MODULE. Sachez qu'une telle configuration donne à ce conteneur la possibilité de prendre en charge le noyau et donc l'hôte. Pour ce faire, vous souhaitez 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 - ...", alors ...

Le fichier/var/lib/lxc/foo/config contiendra la ligne "lxc.include = /usr/share/lxc/ubuntu.common.conf", le fichier /usr/share/lxc/ubuntu.common.conf sera contient une ligne "lxc.include = /usr/share/lxc/config/common.conf", et le fichier /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 "include /usr/share/lxc/ubuntu.common.conf"), puis supprimer le "sys_module". liste.

  1. Vous avez besoin d'une copie de vos modules de noyau dans le conteneur. Si votre hôte exécute un noyau Ubuntu, vous pourrez peut-être faire quelque chose du style "Sudo apt install kernel-image - $ (uname -r)" à partir de l'invité. Sinon de l'hôte, vous devrez peut-être faire quelque chose comme ceci (en supposant que votre conteneur s'appelle "foo"):

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

  1. Après cela, fermez l'invité foo 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.

1
Adam Richter