Eu trabalhei nisso e encontrei uma solução. Aqui está em resumo. Procure por uma descrição mais detalhada .
Precisamos informar libvirt
para definir a VLAN-ID correta para a interface de rede virtual criada dinâmica (por exemplo, vnet0) adicionada à ponte na inicialização de um domínio (guest). Para isso, podemos usar scripts de hook libvirt . Eu faço isso em três etapas.
Etapa 1: definir a VLAN-ID à qual a máquina virtual pertence
Para isso, temos um elemento extra < metadata > no formato XML do domínio para metadados personalizados. Podemos simplesmente adicionar as informações à configuração estática com harley$ virsh edit deb9-test
desta forma (veja apenas o elemento < metadata >):
harley$ virsh dumpxml deb9-test | head -n9
<domain type='kvm' id='1'>
<name>deb9-test</name>
<uuid>70d56a28-795d-4010-9403-513a4bd6b66a</uuid>
<metadata>
<my:home xmlns:my="http://hoeft-online.de/my/">
<my:vlan>10</my:vlan>
</my:home>
</metadata>
<memory unit='KiB'>1048576</memory>
Etapa 2: obtenha informações sobre a inicialização a partir do XML-config de tempo de execução do domínio
O script de gancho obtém informações sobre sua entrada padrão. Esta é a configuração XML da VM em execução. Também podemos obtê-lo com harley$ virsh dumpxml deb9-test
quando a VM está em execução. Eu uso o XSLT com xmlstarlet
para obter informações necessárias com uma folha de estilo xsl. Eu posso testar com harley$ virsh dumpxml deb9-test | xmlstarlet tr qemu.xsl
. Aqui está a folha de estilo:
harley$ cat /etc/libvirt/hooks/qemu.xsl
<?xml version="1.0" encoding="UTF-8"?>
<!-- This stylesheet extracts the VLAN-ID and the target device of the
bridge from the domain-xml given to the libvirt hook-script "qemu".
Example output: <meta><vlan>10</vlan><dev>vnet0</dev></meta>
-->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="http://hoeft-online.de/my/" exclude-result-prefixes="my">
<xsl:output omit-xml-declaration="yes" indent="no"
encoding="utf-8" media-type="text/xml"/>
<xsl:strip-space elements="*"/>
<xsl:template match="text()|@*"/>
<xsl:template match="/domain">
<meta>
<xsl:apply-templates/>
</meta>
</xsl:template>
<xsl:template match="metadata/my:home/my:vlan">
<vlan>
<xsl:value-of select="."/>
</vlan>
</xsl:template>
<xsl:template match='interface[@type="bridge"]/target'>
<dev>
<xsl:value-of select="@dev"/>
</dev>
</xsl:template>
</xsl:stylesheet>
harley$
Etapa 3: defina VLAN-ID para a interface de rede virtual dinâmica vnet *
Com as informações da folha de estilos, agora podemos configurar a interface de rede com um script de gancho . Torne isso executável.
harley$ cat /etc/libvirt/hooks/qemu
#!/bin/bash
#/etc/libvirt/hooks/qemu
# Docs: https://www.libvirt.org/hooks.html
# If you make a new hook script then 'sudo systemctl restart libvirtd'.
# On startup of the domain (guest) This script does:
# Get Metadata VLAN-ID of the guest and target device of the bridge from
# the domain-xml available on standard input. It is the runtime
# version from 'virsh dumpxml domainname'. For extracting the
# information we use a XSL-stylesheet. Example input into $META:
# <meta><vlan>10</vlan><dev>vnet0</dev></meta>
# Select $DEV from $META
# Select $VLAN from $META
# Set $VLAN to $DEV on the bridge
case "$2" in
prepare)
;;
start)
META=$(/usr/bin/xmlstarlet tr /etc/libvirt/hooks/qemu.xsl -)
DEV=$(echo "$META" | /usr/bin/xmlstarlet sel -t -v '/meta/dev')
VLAN=$(echo "$META" | /usr/bin/xmlstarlet sel -t -v '/meta/vlan')
if [[ -n $DEV && -n $VLAN ]]; then
/sbin/bridge vlan add vid "$VLAN" dev "$DEV"
fi
;;
started)
;;
stopped)
;;
release)
;;
migrate)
;;
restore)
;;
reconnect)
;;
attach)
;;
*)
echo "qemu hook called with unexpected options $*" >&2
exit 1
;;
esac
harley$