다음으로 전환하고 싶습니다.체계이런 식으로 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
가상 머신이 실행되는 동안에 도 이를 얻을 수 있습니다 . xmlstarlet
xsl 스타일시트를 통해 필요한 정보를 얻기 위해 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$