KVM仮想マシンのVLAN接続問題解決ガイド(libvirtフック活用)

インフラ

1. 定義:KVMでのVLANフィルタリング問題

KVM環境において、Linux BridgeのVLANフィルタリング(vlan_filtering=1)を有効にすると、仮想マシン(VM)がVLANネットワークと通信できなくなる問題が発生します。これは、VM起動時に動的に生成されるTAPデバイス(仮想インターフェース)に対して、適切なVLAN IDが自動で割り当てられないためです。

2. 要点:解決のための2段階設定

  • ホストNW起動時: 外部ツールを使わず、OS標準の /etc/sysconfig/network-scripts/ifup-post を利用し、物理デバイスとブリッジデバイスにVLAN IDを付与します。
  • VM起動時: libvirtのフック機能(/etc/libvirt/hooks/qemu)を利用し、VM起動完了後に生成されたTAPデバイスへ直接VLAN IDを付与します。

3. 比較:標準機能とフックスクリプトの違い

項目 libvirt標準設定 フックスクリプト(本方式)
設定場所 XML定義ファイル ifup-post / hooks/qemu
適用タイミング libvirtのネットワーク起動時 OSネットワーク起動時 / VM起動完了時
TAPデバイス制御 自動生成に依存 ブリッジコマンドで直接制御可能

4. 具体例:ifup-postとqemuフックの設定手順

Linux Bridge環境を想定した最短設定手順です。

手順1:ホストNW起動時の設定

ネットワークスクリプト実行後にVLANを許可します。

# /etc/sysconfig/network-scripts/ifup-post
#!/bin/bash

# 定義: 対象のVLAN ID、ブリッジ、物理デバイス
VLAN_ID=100
BRIDGE_DEV="br0"
PHYS_DEV="eth0"

# ブリッジデバイス自身(self)と物理デバイスにVLAN IDを追加
bridge vlan add vid $VLAN_ID dev $BRIDGE_DEV self
bridge vlan add vid $VLAN_ID dev $PHYS_DEV

手順2:VM起動時の動的設定

VMの起動完了を検知してTAPデバイスをVLANに参加させます。

# /etc/libvirt/hooks/qemu
#!/bin/bash

OBJECT="$1"     # ドメイン名(VM名)
OPERATION="$2"  # 動作ステータス

VLAN_ID=100

# 仮想マシンの起動完了を確認
if [ "$OPERATION" = "started" ]; then
    # TAPデバイス名を取得
    TAP_DEV=$(virsh domiflist "$OBJECT" | grep bridge | awk '{print $1}')
    
    if [ -n "$TAP_DEV" ]; then
        # 生成されたtapデバイスにVLAN IDを付与
        bridge vlan add vid $VLAN_ID dev $TAP_DEV
    fi
fi

5. 注意事項

作成したスクリプトには実行権限(chmod +x)を付与してください。
また、VM側のインターフェースをアクセスポート(タグなし)として動作させる場合は、TAPデバイスへのコマンド末尾に pvid untagged を付与する必要があるかもしれません

コメント

タイトルとURLをコピーしました