我正在使用 qemu/kvm 创建虚拟机,并希望将现有的 Tap 接口分配给该虚拟机。如何使用virsh
CLI 或virt-manager
GUI 来做到这一点?
我正在寻找此手动 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配置的。 virsh
和virt-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-edit
pool-edit
$EDITOR
$VISUAL
libvirt
答案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”添加为该桥接接口的成员。这并不理想,但它有效。