Jak zainstalować moduł jądra na maszynie gościa LXC?

13

Próbuję zainstalować OpenStack DevStack na maszynie gościa LXC. Jeden z pakietów DevStack wymaga nowego modułu jądra, ale kiedy próbuję uruchomić modprobe na gościu LXC, pojawia się błąd:

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

Jak mogę zainstalować ten moduł na moim komputerze-gościu LXC?

Mars
źródło

Odpowiedzi:

13

Krótka odpowiedź brzmi: nie możesz. Kontenery LXC współużytkują jądro z hostem i domyślnie nie wolno ładować modułów (ponieważ byłoby to dość niebezpieczne).

Standardowym zaleceniem jest ładowanie dowolnego modułu na hoście przed uruchomieniem kontenera. Możesz to zrobić za pomocą starego dobrego skryptu init lub za pomocą haka lxc (szczegółowe informacje można znaleźć w moim ostatnim poście tutaj: https://www.stgraber.org/2013/12/23/lxc-1-0-some- bardziej zaawansowane wykorzystanie kontenera / )

stgraber
źródło
1

Na potrzeby tej odpowiedzi załóżmy, że Twój kontener ma nazwę „foo”.

CZĘŚĆ A

  1. Od hosta zapisz kopię /var/lib/lxc/foo/config, na wypadek, gdyby moje instrukcje coś popsuły.

  2. Musisz skonfigurować swój kontener, aby zachować jego SYS_MODULE możliwości.

    Należy pamiętać, że taka konfiguracja umożliwia temu kontenerowi przejęcie jądra, a tym samym hosta .

    Aby to zrobić, będziesz chciał zmienić linię "lxc.cap.drop"lub "lxc.cap.keep".

    Jeśli korzystasz z gościa Ubuntu 19.04, który został utworzony z "lxc-create --name foo --template download -- ...":

    • /var/lib/lxc/foo/config będzie zawierać linię

      lxc.include = /usr/share/lxc/ubuntu.common.conf
      
    • /usr/share/lxc/ubuntu.common.conf będzie zawierać linię

      lxc.include = /usr/share/lxc/config/common.conf
      
    • /usr/share/lxc/config/common.conf będzie zawierać taką linię

      lxc.cap.drop = mac_admin mac_override sys_time sys_module sys_rawio
      

Powinieneś skopiować ten ostatni wiersz na koniec /var/lib/lxc/foo/config(lub dowolne miejsce po "include /usr/share/lxc/ubuntu.common.conf"), a następnie usunąć "sys_module"z tej listy.

Część B

Potrzebujesz kopii swoich modułów jądra w kontenerze.

Jeśli na twoim hoście działa jądro Ubuntu, możesz być w stanie zrobić coś takiego jak "sudo apt install kernel-image-$(uname -r)"gość.

W przeciwnym razie od hosta może być konieczne wykonanie czegoś takiego (zakładając, że kontener ma nazwę „foo”):

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

Następnie zamknij gościa foo, jeśli jest uruchomiony, a następnie uruchom go ponownie za pomocą czegoś podobnego "lxc-start --name foo".

Kontener LXC powinien teraz móc ładować i zwalniać moduły jądra.

Adam Richter
źródło