关机并重新启动时,从 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))。
再次强调:必须完全停止虚拟机然后启动(而不是简单地重新启动)才能使其生效。
部分功劳归功于: