如何在 LXC 客户机中安装内核模块?

如何在 LXC 客户机中安装内核模块?

我正在尝试在 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”。

第一部分

  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"从该列表中删除。

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 容器现在应该能够加载和卸载内核模块。

相关内容