【问题标题】:issue with kvm/libvirt and linux-namespaceskvm/libvirt 和 linux-namespaces 的问题
【发布时间】:2025-12-14 00:35:01
【问题描述】:

我的 Ubuntu 16.04 LTS 上的 kvm/libvirt 虚拟化和网络命名空间存在问题。我想要做的是以下围栏设置:

  • 一个网络命名空间(围栏)
  • 命名空间中有两个 Linux 网桥。
  • 每个网桥都有自己的 ip 网络。
  • 允许这两个网桥之间的 ip 转发。
  • 两个虚拟机。 VM1 连接到bridge1,VM2 连接到bridge2。
  • Ping VM1 到 VM2。

我的目的是在我的笔记本电脑上建立一个小实验室,它完全独立于主机剩余的与外界通信的网络设置,在我看来,网络命名空间是实现这一目标的方法,但我遇到了一些障碍.

到目前为止,我已经设置了以下内容:

ip netns add internalSpielwiese
ip netns exec internalSpielwiese bash
    ip addr add 127.0.0.1/8 dev lo
    ip link set lo up
    ip link add name iBr0 type bridge
    ip addr add 172.0.0.1/24 dev iBr0
    ip link set iBr0 up
    ip link add name iBr1 type bridge
    ip addr add 172.0.1.1/24 dev iBr1
    ip link set iBr1 up

Ping 命名空间内的 ip 成功。 IP 转发已启用。在命名空间之外,桥不可见/不存在。现在是时候让 libvirt 中的桥梁为人所知了。但它不起作用。我用这个 xml 试过了

<network>
  <name>internalBr0</name>
  <uuid>3f4647d9-0c19-509f-b512-9cac91c7149b</uuid>
  <forward mode='bridge'/>
  <bridge name='iBr0'/>
</network>

以及适当的 virsh net-define 和 net-start 命令。我编辑了一个 VM 的 xml 文件并启动了 VM,但结果是这样的:

virsh # start kirke2
error: Failed to start domain kirke2
error: Cannot get interface MTU on 'iBr0': No such device

显然,libvirt 没有在命名空间 internalSpielwiese 中找到 iBr0,经过一番谷歌搜索后,我觉得 libvirt 无法处理网络命名空间。或者有什么办法吗?如何?

【问题讨论】:

  • 这里不在主题范围内。但我根本看不出有任何理由使用网络命名空间。 Libvirt 很乐意将自己的网络与您的其他网络分开。
  • 不,由 libvirt 控制的 (l3-)bridges 和那些由其他 linux 工具“控制”的桥之间没有区别。我的意思是,最后“libvirt-bridges”只有在事先使用 ip link、bridge、brctl 或您喜欢的任何工具创建时才有效。这就是为什么我正在寻找一种可能性,将我的用于测试的小网络设置与其他网络设置完全分开。说得更清楚一点:与 virbr0 和 eth0 完全分开。
  • Libvirt 将自己创建自己的内部网桥。您不必事先创建它们。如果你把它放在一个命名空间中,它会使得与外界建立通信变得更加困难。
  • 好的。您说 libvirt 管理自己的网桥,不需要使用标准 linux 工具创建网桥。也许你是对的。但后来我错过了迄今为止我所做的一些事情。这当然是可能的,因为我不是专业人士。但我总是渴望学习新事物,如果你能提供你的知识,我将不胜感激。 ...(对不起。我需要把它分成两个 cmets)
  • 创建新网络的常用方法是: 1. 使用适当的 linux 工具定义新网桥。 2. 使用适当的 virsh 命令定义一个新网络: ... 其中步骤 1 和 2 可以互换。 3. 编辑 VM 的 xml 文件以连接到该新网桥。 4. 启动虚拟机并使用它...当我跳过第 1 步时,我总是收到错误消息。然后虚拟机根本无法启动。

标签: kvm libvirt linux-namespaces


【解决方案1】:

Libvirt 只能看到与运行 libvirtd 相同的命名空间中的资源。因此,私有命名空间中的设备对 libvirtd 是不可见的。目前没有什么好的办法,除了让 libvirtd 在这个自定义的网络命名空间中运行。然后主机网卡对 libvirtd 是不可见的 - 这是否是一个问题取决于您尝试执行的操作。

【讨论】:

  • 经过进一步阅读,我现在认为我走错了路。在某些时候,我读到 l2-bridges 不打算放在命名空间中。我的意思是,最后一个 l3 网桥(l2 网桥 + ip 地址)仍然是一个网桥。感谢您的评论。它帮助我弄清楚了这一点。