我正在构建一个带有只读 rootfs 的系统。
此 rootfs 在主机和创建的容器之间共享。
主机不能有任何与网络相关的服务或文件,这意味着我无法桥接主机连接。
我目前正在使用 USB 网络适配器。
如何仅在容器内启动此设备和网络服务?
任何容器都可以为 /etc /var 等拥有新的 RW 挂载点,这样,所需的任何文件都可以在另一个分区中访问。但是主机仍然是 RO 并且文件有限。
我正在构建一个带有只读 rootfs 的系统。
此 rootfs 在主机和创建的容器之间共享。
主机不能有任何与网络相关的服务或文件,这意味着我无法桥接主机连接。
我目前正在使用 USB 网络适配器。
如何仅在容器内启动此设备和网络服务?
任何容器都可以为 /etc /var 等拥有新的 RW 挂载点,这样,所需的任何文件都可以在另一个分区中访问。但是主机仍然是 RO 并且文件有限。
忘记网卡作为特定硬件。只需考虑您有一个网络接口,并且必须将其移动到容器中。这不是 USB 或 PCI 直通。我们称之为接口传递,它由网络命名空间逻辑专门处理,例如
ip link
:该接口最初必须出现在主机上,但您可以将其移动到容器中。没有选项可以在插入时直接出现在容器中(当然在容器启动时,使用容器的特定配置,可以移动接口,见后文),但它可能可以使用
udev
. 此外,内核在主机和容器之间是唯一的,主机即使根本不使用网络,当然也必须编译所有必需的网络选项,并且如果需要仍然负责加载相关的内核模块(通常是透明地完成)。因此,如果最终您的卡
eth0
在主机上被调用并且实际上是以太网(不是无线),则此命令会将其移动到目标命名空间:其中 NETNSNAME 可以是目标网络名称空间中进程的 pid,也可以是“已安装”并由
ip netns add NETNSNAME
上述方式处理的网络名称空间。对于两种常见的容器技术,LXC 和 Docker,以下是如何将 NETNSNAME 替换为名为 的目标容器
containername
:LXC:
码头工人:
对于无线,如果只有一个无线接口,则(没有很好记录的)命令将与以下内容明确相关
phy0
:但这只有在驱动程序支持时才有效,显示如下:
这可能不应该使用上面的命令手动完成,而是使用特定容器的配置(LXC、Docker ...)。例如,对于 LXC 3.0(从 LXC 2.x 更改的语法),配置文件将包括如下行:
相同的配置将处理以太网或无线。
并且每当容器启动时,接口都会被容器吞噬。当容器(更准确地说是它的网络命名空间)停止时,接口将返回给主机(无法直接将其返回给其他容器)。
Wireguard 描述了一些用例。
To,详细说明frostschutz的评论。
您可以按照以下说明允许容器访问带有或不带有 --privileged 模式的 USB 设备:Instructions。 (但是,由于这是一个网络设备,它很可能需要驱动程序)
如果您正在使用 USB 直通,并且可以看到容器内的设备,则只需对该设备的内核模块在容器内进行 modprobe,然后重新启动容器即可。然后当然是设置网络。
在适应您的用例时,下页讨论中的信息应该对您有所帮助。Page (请记住,关于它在新启动时未显示的最后一条声明是因为它尚未设置为这样做,但您应该从那里获得它,因为驱动程序现在应该可以工作了。)