Wie installiere ich ein Kernelmodul auf einem LXC-Gastcomputer?

13

Ich versuche, OpenStack DevStack auf einem LXC-Gastcomputer zu installieren. Eines der DevStack-Pakete erfordert ein neues Kernel-Modul, aber wenn ich versuche, modprobe auf dem LXC-Gast auszuführen, erhalte ich eine Fehlermeldung:

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

Wie kann ich dieses Modul für meinen LXC-Gastcomputer installieren?

Mars
quelle

Antworten:

13

Die kurze Antwort lautet: Sie können nicht. LXC-Container teilen ihren Kernel mit dem des Hosts und dürfen standardmäßig keine Module laden (da dies ziemlich gefährlich wäre).

Die Standardempfehlung besteht darin, ein beliebiges Modul auf dem Host zu laden, bevor der Container gestartet wird. Sie können dies entweder mit einem guten alten Init-Skript oder mit einem LXC-Hook tun (Details finden Sie in meinem letzten Beitrag hier: https://www.stgraber.org/2013/12/23/lxc-1-0-some- fortgeschrittenere Containernutzung / )

stgraber
quelle
1

Nehmen wir für die Beantwortung dieser Frage an, Ihr Container heißt "foo".

TEIL A

  1. Speichern Sie vom Host eine Kopie von /var/lib/lxc/foo/config, falls meine Anweisungen etwas beschädigen.

  2. Sie müssen Ihren Container konfigurieren, um die SYS_MODULE Funktionalität beizubehalten.

    Beachten Sie, dass eine solche Konfiguration diesem Container die Möglichkeit gibt, den Kernel und damit den Host zu übernehmen .

    Dazu müssen Sie die Konfigurationszeile "lxc.cap.drop"oder ändern "lxc.cap.keep".

    Wenn Sie einen Ubuntu 19.04-Gast ausführen, der mit erstellt wurde "lxc-create --name foo --template download -- ...":

    • /var/lib/lxc/foo/config wird eine Zeile enthalten

      lxc.include = /usr/share/lxc/ubuntu.common.conf
      
    • /usr/share/lxc/ubuntu.common.conf wird eine Zeile enthalten

      lxc.include = /usr/share/lxc/config/common.conf
      
    • /usr/share/lxc/config/common.conf wird eine Zeile wie diese enthalten

      lxc.cap.drop = mac_admin mac_override sys_time sys_module sys_rawio
      

Sie sollten diese letzte Zeile an das Ende von /var/lib/lxc/foo/config(oder an eine beliebige Stelle nach "include /usr/share/lxc/ubuntu.common.conf") kopieren und dann "sys_module"aus dieser Liste löschen .

Teil B

Sie benötigen eine Kopie Ihrer Kernelmodule im Container.

Wenn Ihr Host einen Ubuntu-Kernel ausführt, können Sie möglicherweise so etwas wie "sudo apt install kernel-image-$(uname -r)"vom Gast ausführen.

Andernfalls muss der Host möglicherweise Folgendes ausführen (vorausgesetzt, Ihr Container heißt "foo"):

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

Fahren Sie danach das Guest Foo herunter, wenn es ausgeführt wird, und starten Sie es dann mit so etwas wie neu "lxc-start --name foo".

Der LXC-Container sollte nun in der Lage sein, Kernelmodule zu laden und zu entladen.

Adam Richter
quelle