本文將講述一個問題:kvm guest使用libvirt xml定義如何使用virtual network?


1)nat, route ,isolated, open類型

在host中定義virtual network會創建一個虛擬的bridge,相當于一個交換機。guest只需要連接到這個交換機上就可以了。

在guest的xml中添加:

#?virsh?edit?vm
...
<interface?type='network'/>
<source?network='net1'/>??====>net1是已經定義好的一個虛擬網絡
</interface>
...

上述是最簡單的xml,保存后會自動添加一些必要信息,如mac,pci address, model type等信息。當然也可以手動指定。


2)user(Userspace SLIRP stack),vhost-user,Multicast tunnel, TCP tunnel,UDP unicast tunnel等類型

只能在guest中以interface來引用。如user是qemu提供的非特權用戶可以使用的類型,可以這樣引用:

??<interface?type='user'/>(mac,pci地址,model?type如果哦不指定,會自動生成)


3)bridge(use an exsiting host linux bridge)

本身存在一個linux bridge,可以定義成網絡給guest用(不會再創建bridge),也可以直接給guest用。兩種方式本質是一樣的。


?#?virsh?net-dumpxml?birdge-net
<network><name>bridge-net</name><forward?mode='birdge'/><bridge?name='br0'/></network>
#?virsh?edit?vm
...
<interface?type='network'><source?network='bridge-net'>
</interface>
...


直接給guest用( 1)中由libvirt創建的bridge也可以這樣引用 ):

<interface?type='bridge'><source?bridge='br0'/>
</interface>


4)macvtap(包括bridge,vepa,private,passthrough四種), hostdev

可以定義一個network作為interface pool, 以network的形式引用,也可以直接引用。同 3),兩種方式本質是一樣的。

定義interface pool

??<network><name>direct-macvtap</name><forward?mode="bridge"><interface?dev="eth20"/><interface?dev="eth21"/><interface?dev="eth22"/><interface?dev="eth23"/><interface?dev="eth24"/></forward></network>
<network><name>hostdev-net</name><forward?mode='hostdev'?managed='yes'><driver?name='vfio'/><address?type='pci'?domain='0'?bus='4'?slot='0'?function='1'/><address?type='pci'?domain='0'?bus='4'?slot='0'?function='2'/><address?type='pci'?domain='0'?bus='4'?slot='0'?function='3'/></forward></network>

guest中直接引用

#?virsh?edit?vm
...
<interface?type='direct'><source?dev='enp0s25'?mode='vepa'/>
</interface>
...
#?virsh?edit?vm
...<interface?type='hostdev'?managed='yes'><source><address?type='pci'?domain='0x0000'?bus='0x00'?slot='0x19'?function='0x0'/></source></interface>
...