Как установить модуль ядра на гостевой компьютер LXC?

13

Я пытаюсь установить OpenStack DevStack на гостевой компьютер LXC. Один из пакетов DevStack требует нового модуля ядра, но когда я пытаюсь запустить modprobe на гостевой системе LXC, я получаю сообщение об ошибке:

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

Как я могу установить этот модуль для моей гостевой машины LXC?

Марс
источник

Ответы:

13

Короткий ответ: ты не можешь. Контейнеры LXC делят свое ядро ​​с хостом и по умолчанию не могут загружать модули (так как это было бы довольно опасно).

Стандартная рекомендация - загружать любой модуль на хост до запуска контейнера. Вы можете сделать это с помощью старого доброго сценария инициализации или с помощью хука lxc (подробности см. В моем недавнем посте здесь: https://www.stgraber.org/2013/12/23/lxc-1-0-some- более продвинутый-контейнер-использование / )

stgraber
источник
1

Для целей этого ответа предположим, что ваш контейнер называется `" foo ".

ЧАСТЬ А

  1. С хоста сохраните копию /var/lib/lxc/foo/config, на случай, если мои инструкции что-то сломают.

  2. Вам нужно будет настроить свой контейнер, чтобы сохранить SYS_MODULE возможность.

    Имейте в виду, что такая конфигурация дает этому контейнеру возможность захватывать ядро ​​и, следовательно, хост .

    Для этого вам нужно изменить строку конфигурации "lxc.cap.drop"или "lxc.cap.keep".

    Если вы работаете с гостем Ubuntu 19.04, который был создан с помощью "lxc-create --name foo --template download -- ...":

    • /var/lib/lxc/foo/config будет содержать строку

      lxc.include = /usr/share/lxc/ubuntu.common.conf
      
    • /usr/share/lxc/ubuntu.common.conf будет содержать строку

      lxc.include = /usr/share/lxc/config/common.conf
      
    • /usr/share/lxc/config/common.conf будет содержать такую ​​строку

      lxc.cap.drop = mac_admin mac_override sys_time sys_module sys_rawio
      

Вы должны скопировать эту последнюю строку в конец /var/lib/lxc/foo/config(или в любое место после "include /usr/share/lxc/ubuntu.common.conf"), а затем удалить "sys_module"из этого списка.

Часть Б

Вам нужна копия ваших модулей ядра в контейнере.

Если на вашем хосте работает ядро ​​Ubuntu, вы можете сделать что-то вроде "sudo apt install kernel-image-$(uname -r)"гостя.

В противном случае от хоста может потребоваться сделать что-то вроде этого (при условии, что ваш контейнер называется «foo»):

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

После этого закройте гостевой фу, если он запущен, а затем перезапустите его как-нибудь так "lxc-start --name foo".

Теперь контейнер LXC должен загружать и выгружать модули ядра.

Адам Рихтер
источник