systemd를 사용하여 Linux 브리지에서 가상 머신에 대한 VLAN 설정

systemd를 사용하여 Linux 브리지에서 가상 머신에 대한 VLAN 설정

다음으로 전환하고 싶습니다.체계이런 식으로 VLAN을 사용하려면 KVM의 가상 머신용 Linux 브리지를 설정해야 합니다.

Debian GNU/Linux 9.1(stretch)이 있으면 사용하세요.시스템 네트워크그리고라이브러리 가상 머신. 레거시 네트워킹(오프로드)을 사용하지 않습니다 ifupdown.

나는 콘솔의 브리지를 테스트하고 설정하기 위한 풀타임 워크스테이션인 Harley에 앉아 있습니다.

harley$ cat /etc/systemd/network/08-br0.netdev
[NetDev]
Name=br0
Kind=bridge
[Bridge]
VLANFiltering=true
STP=false  
harley$ cat /etc/systemd/network/12-br0_add-enp1s0.network
[Match]
Name=enp1s0
[Network]
Bridge=br0
[BridgeVLAN]
VLAN=10
[BridgeVLAN]
VLAN=20
[BridgeVLAN]
VLAN=30  
harley$ cat /etc/systemd/network/16-br0_up.network
[Match]
Name=br0

테스트에서 오래된 브리지를 정리하고 처음부터 새 브리지를 설정합니다.

harley$ sudo ip link set dev br0 down && sudo ip link del dev br0
harley$ sudo systemctl restart systemd-networkd
harley$

이제 모든 것이 준비되었습니다.

harley$ cat /sys/class/net/br0/bridge/vlan_filtering
1
harley$ cat /sys/class/net/br0/bridge/stp_state
0
harley$ sudo bridge vlan show
port    vlan ids
enp1s0   1 PVID Egress Untagged
         10
         20
         30  
br0      1 PVID Egress Untagged
harley$

이제 가상 머신을 시작하고 로그인한 후 인터페이스 설정을 표시합니다.

harley$ virsh start --console deb9-test

로그인

deb9-test$ cat /etc/systemd/network/08-vlan10.netdev
[NetDev]
Name=vlan10
Kind=vlan
[VLAN]
Id=10  
deb9-test$ cat /etc/systemd/network/12-vlan10_attach-to-if.network
[Match]
Name=ens2
[Network]
VLAN=vlan10  
deb9-test$ cat /etc/systemd/network/16-vlan10_up.network
[Match]
Name=vlan10
[Network]
Address=192.168.10.57/24
Gateway=192.168.10.1
DNS=192.168.10.8

그러나 이 단계에서는 게이트웨이를 ping해도 아무런 결과가 나오지 않습니다.

deb9-test$ ping -c1 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
From 192.168.10.57 icmp_seq=1 Destination Host Unreachable  
--- 192.168.10.1 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

이제 브리지에 다음이 표시됩니다.

harley$ sudo bridge vlan show
port    vlan ids
enp1s0   1 PVID Egress Untagged
         10
         20
         30  
br0      1 PVID Egress Untagged  
vnet0    1 PVID Egress Untagged

수정해야 합니다.

harley$ sudo bridge vlan del dev enp1s0 vid 1
harley$ sudo bridge vlan del dev br0 vid 1 self
harley$ sudo bridge vlan del dev vnet0 vid 1
harley$ sudo bridge vlan add vid 10 dev vnet0

이제 가상 머신이 작동합니다.

deb9-test$ ping -c1 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.843 ms  
--- 192.168.10.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.843/0.843/0.843/0.000 ms

수정 후에는 이것이 내가 원하는 것입니다. 간단하고 깔끔합니다.

harley$ sudo bridge vlan show
port    vlan ids
enp1s0   10
         20
         30  
br0     None
vnet0    10

마지막으로 내 질문:
DHCP를 통해 IP 주소를 얻을 수 있도록 가상 머신 인터페이스가 나타나기 전에 데비안이 이 작업을 수행하도록 하려면 어떻게 해야 합니까?

답변1

참고:
이 구성은 더 이상 사용되지 않으며 더 이상 지원되지 않습니다. 서버를 계속하기로 결정했습니다잘못존재하다libvirt는 가상 머신에 대한 Linux 브리징용 VLAN을 지원합니다., 정책에 기반한 사이트에 더 적합하다고 생각하기 때문입니다. 개선된 스크립트를 원한다면 여기를 살펴보세요.



나는 해결책을 연구하고 찾았습니다. 요컨대. 거기서 하나를 찾고 있어요더 자세한 설명.

libvirt도메인(게스트) 시작 시 브리지에 추가되는 동적으로 생성된 가상 네트워크 인터페이스(예: vnet0)에 올바른 VLAN-ID가 설정되도록 알려야 합니다 . 이를 위해 우리는 사용할 수 있습니다libvirt 후크 스크립트. 저는 3단계로 진행합니다.

1단계: 가상 머신이 속한 VLAN-ID 정의

이를 위해 우리는 추가로필드 XML 형식 요소 <metadata>사용자 정의 메타데이터의 경우. 다음과 같이 정적 구성에 정보를 간단히 추가할 수 있습니다 harley$ virsh edit deb9-test(<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>

2단계: 도메인의 런타임 XML 구성에서 시작 정보 얻기

이것후크 스크립트표준 입력에 대한 정보를 얻습니다. 이는 실행 중인 VM의 XML 구성입니다. harley$ virsh dumpxml deb9-test가상 머신이 실행되는 동안에 도 이를 얻을 수 있습니다 . xmlstarletxsl 스타일시트를 통해 필요한 정보를 얻기 위해 XSLT를 사용하고 있습니다 . 으로 테스트할 수 있습니다 harley$ virsh dumpxml deb9-test | xmlstarlet tr qemu.xsl. 스타일시트는 다음과 같습니다.

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$

3단계: VLAN-ID를 동적 가상 네트워크 인터페이스 vnet으로 설정*

스타일시트의 정보를 기반으로 이제 다음 명령을 사용하여 네트워크 인터페이스를 설정할 수 있습니다.후크 스크립트. 실행 가능하게 만드세요.

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$

관련 정보