libvirt:将现有的 Tap 接口分配给 VM

libvirt:将现有的 Tap 接口分配给 VM

我正在使用 qemu/kvm 创建虚拟机,并希望将现有的 Tap 接口分配给该虚拟机。如何使用virshCLI 或virt-managerGUI 来做到这一点?

我正在寻找此手动 qemu 调用的 libvirt 等效项:

qemu-system-x86_64 -net nic,model=virtio,macaddr= -net tap,ifname=MY_EXISTING_TAP_INTERFACE,script=no

我想要这个,因为我有一个复杂的多宿主防火墙和路由器,我自己在上面管理所有网络,包括网桥。我希望虚拟机只使用我为其准备的 Tap 接口,而不执行其他任何操作。

答案1

使用 virt-manager GUI,您可以查看虚拟机的详细信息,单击按钮Add Hardware,选择Network并在对话框中输入详细信息。

从命令行,您可以使用,virsh attach-interface或者,如果您已为 NIC 创建/复制了合适的 XML 片段,请使用virsh attach-device(顺便说一句,attach-interface子命令有一个--print-xml选项,仅打印 XML 片段而不是附加接口)。

virsh在其手册页和libvirt.org网站,并且还具有广泛的内置帮助。例如:

# virsh attach-interface --help
  NAME
    attach-interface - attach network interface

  SYNOPSIS
    attach-interface <domain> <type> <source> [--target <string>] [--mac <string>]
      [--script <string>] [--model <string>] [--alias <string>] [--inbound <string>]
      [--outbound <string>] [--persistent] [--config] [--live] [--current] [--print-xml]
      [--managed] [--source-mode <string>]

  DESCRIPTION
    Attach new network interface.

  OPTIONS
    [--domain] <string>  domain name, id or uuid
    [--type] <string>  network interface type
    [--source] <string>  source of network interface
    --target <string>  target network name
    --mac <string>   MAC address
    --script <string>  script used to bridge network interface
    --model <string>  model type
    --alias <string>  custom alias name of interface device
    --inbound <string>  control domain's incoming traffics
    --outbound <string>  control domain's outgoing traffics
    --persistent     make live change persistent
    --config         affect next boot
    --live           affect running domain
    --current        affect current domain
    --print-xml      print XML document rather than attach the interface
    --managed        libvirt will automatically detach/attach the device from/to host
    --source-mode <string>  mode attribute of <source/> element


# virsh attach-device --help
  NAME
    attach-device - attach device from an XML file

  SYNOPSIS
    attach-device <domain> <file> [--persistent] [--config] [--live] [--current]

  DESCRIPTION
    Attach device from an XML <file>.

  OPTIONS
    [--domain] <string>  domain name, id or uuid
    [--file] <string>  XML file
    --persistent     make live change persistent
    --config         affect next boot
    --live           affect running domain
    --current        affect current domain

请记住,与libvirt一切关于VM(“域”)最终是用XML配置的。 virshvirt-manager都是用于为 libvirt 本身和 libvirt 管理的任何虚拟机创建和修改 XML 配置文件和配置文件片段的工具。

virsh有几个命令可将域的整个 XML 配置或特定设备的 XML 片段转储到标准输出。这可以重定向到文件以供以后使用。它也可以使用 或 类似的方法进行修改xmlstarlet(请注意,XML 输出很方便地采用几乎面向行的格式,因此可以使用 awk 或 sed 或 perl 等合理地进行修改...但是您最好使用工具或语言可以解析并生成正确的 XML)并重新用于更新现有 VM 或创建略有不同的新 VM。

例如,尝试运行virsh help | grep -i xml以了解可以使用virsh命令和 XML 配置文件/片段执行哪些操作。

顺便说一句,各种“编辑”子命令(例如,,,edit等)将 XML 加载到您的首选编辑器中(通过通常的或环境变量),以便您可以编辑它 - 保存更改后,如果 XML 通过验证,它用于重新配置虚拟机或其本身,具体取决于您正在编辑的内容。iface-editpool-edit$EDITOR$VISUALlibvirt

答案2

有同样的问题。以下是适合我的(大部分)基于主机的网络的 XML:

<interface type="ethernet">
  <script path="/vm/qemu/tap-up.sh"/>
  <target dev="tap10"/>
  <mac address="00:11:22:33:44:55"/>
  <model type="virtio"/>
  <address type:="pci"/>
</interface>

当本机使用 QEMU 时,所有网络配置都是在主机上完成的,但由于某种原因,libvirt 忽略了此处提到的“托管”指令:https://libvirt.org/formatdomain.html#generic-ethernet-connection

因此,我只需在主机上配置桥并让 libvirt 创建分接头。创建 Tap 后,上面列出的脚本将“tap10”添加为该桥接接口的成员。这并不理想,但它有效。

相关内容