Как установить модуль ядра на гостевой компьютер 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".
С хоста сохраните копию / var / lib / lxc / foo / config на случай, если мои инструкции что-то сломают.
Вам нужно будет сконфигурировать ваш контейнер, чтобы сохранить возможность 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 /
- После этого завершите работу гостевого foo, если он работает, а затем перезапустите его с помощью команды "lxc-start --name foo".
Теперь контейнер LXC должен загружать и выгружать модули ядра.