我正在尝试在 LXC 客户机上安装 OpenStack DevStack。DevStack 的一个软件包需要一个新的内核模块,但当我尝试在 LXC 客户机上运行 modprobe 时,出现错误:
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 客户机安装此模块?
答案1
简短的回答是,你不能。LXC 容器与主机共享内核,默认情况下不允许加载模块(因为这非常危险)。
标准建议是在启动容器之前在主机上加载任何模块。您可以使用旧的 init 脚本或使用 lxc hook 来执行此操作(有关详细信息,请参阅我最近的帖子:https://www.stgraber.org/2013/12/23/lxc-1-0-some-more-advanced-container-usage/)
答案2
为了回答这个问题,我们假设您的容器名为“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"
从该列表中删除。
B 部分
您需要容器中内核模块的副本。
如果您的主机正在运行 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 容器现在应该能够加载和卸载内核模块。