VM 关闭/重启后,保持主机系统上 VM 的特定 vnet(xx) 适配器不变

VM 关闭/重启后,保持主机系统上 VM 的特定 vnet(xx) 适配器不变

关机并重新启动时,从 VM 主机分配给 VM 的 vnet(xx) 适配器会发生变化。

有没有什么办法可以在它因某种原因关闭然后重新启动后,将其保留为特定的 vnet(xx),例如 vnet20。

答案1

这是有记录的(重点是我的):

覆盖目标元素

...
<devices>
  <interface type='network'>
    <source network='default'/>
    <target dev='vnet1'/>
  </interface>
</devices>
...

如果没有指定目标,某些虚拟机管理程序会自动为创建的 tun 设备生成一个名称.这个名字可以手动指定, 但是,那名称不应以“vnet”、“vif”、“macvtap”或“macvlan”开头,这些是 libvirt 和某些虚拟机管理程序保留的前缀。使用这些前缀的手动指定目标可能会被忽略。

因此这是可能的,但vnet20无法选择不发生冲突。手动定义的接口仍然仅在 VM 运行时存在。

ebtables这可能足以使用、iptables或应用网络过滤规则nftables,并且可能需要使用其他工具(如路由配置或)付出更多努力tc(它们只能与现有接口一起使用,因此必须在启动 VM 时运行)。

要将其应用于名为 的 VM myvm,可以使用virsh edit myvm(或可能是来自虚拟机管理程序上的授权用户virsh -c qemu:///system edit myvm)来更改其设置。例如,如果要更改的接口定义为 MAC 地址 52:54:00:12:34:56 并在名为 的桥上使用virbr0,请找到类似于下面的块:

    <interface type='bridge'>
      <mac address='52:54:00:12:34:56'/>
      <source bridge='virbr0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </interface>

并添加一个具有固定目标设备名称的条目(我们使用myvmtap0):

    <interface type='bridge'>
      <mac address='52:54:00:12:34:56'/>
      <source bridge='virbr0'/>
      <target dev='myvmtap0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </interface>

必须停止并启动虚拟机(而不仅仅是重新启动)才能使其生效。

这可以使用 XML 相关工具编写脚本,但 XML 看起来比 JSON 等更难。例如,使用xmlstarlet,下面的(一行长序列)命令应该可以执行与上面相同的更改,只要之前没有这样做过:

virsh -c qemu:///system dumpxml --inactive myvm | \
  xmlstarlet ed --subnode "domain/devices/interface[mac[@address='52:54:00:12:34:56']]" --type elem -n 'target' \
                --insert 'domain/devices/interface/target' --type attr -n dev -v 'myvmtap0' | \
  virsh -c qemu:///system define /dev/stdin --validate

警告:不要盲目使用。特别是:没有明确记录是否可以使用管道(/dev/stdin上文)而不是文件来重新定义域(即 VM))。

再次强调:必须完全停止虚拟机然后启动(而不是简单地重新启动)才能使其生效。

部分功劳归功于:

相关内容