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

Я пытаюсь установить 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?

2 ответа

Решение

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

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

Для целей этого ответа я предполагаю, что ваш контейнер называется "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" из этого список.

  1. Вам нужна копия ваших модулей ядра в контейнере. Если на вашем хосте запущено ядро ​​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 /

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

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

Другие вопросы по тегам