XenでVLANを使う

XenもVLANも大変便利なのですが、両方を同時に使うとなると
これが簡単にはいきません。
例えば、グローバル側にあるサーバと、ローカル側にあるサーバを
1台のXenホストに載せたいという要望があった場合に、
NICを一つでなんとかやる場合はXen上でVLANを使うことになります。
これが苦労しました。
理由はXenの起動スクリプトがVLANに対応していないためです。
そのため、起動スクリプトをLenny用に作成しました。
http://ken-etsu-tech.blogspot.com/2007/05/vlanxen3xen.html
を参考に作成しました。

まず、VLANを用意

大幅に省略しますが、

  1. L2SWでタグ付きVLANポートを用意
  2. aptでvlanをインストール
  3. /etc/network/interfacesにeth0.10、eth0.20といった感じでVLANを定義

こんな感じだと思います。

起動スクリプトを用意

/etc/xen/scripts/network-bridge
を使うのですが、これがVLANに対応していないので、
これをnetwork-vlan-bridgeコピーし、実行パーミッションを立てます。
そして、以下のパッチを当てます。

--- network-bridge      2009-04-22 11:47:06.207884200 +0900
+++ network-vlan-bridge 2009-04-23 11:00:51.203652220 +0900
@@ -97,13 +97,25 @@
 }
     
 do_ifup() {
-    if ! ifup $1 ; then
-        if [ -n "$addr_pfx" ] ; then
-            # use the info from get_ip_info()
-            ip addr flush $1
-            ip addr add ${addr_pfx} dev $1
-            ip link set dev $1 up
-            [ -n "$gateway" ] && ip route add default via ${gateway}
+    if is_vlan $1 || is_vlan p$1 ; then
+        if ! ifconfig|egrep "^$1" && ifconfig $1 up && ifconfig $1|egrep "^$1" ; then
+            if [ -n "$addr_pfx" ] ; then
+                # use the info from get_ip_info()
+                ip addr flush $1
+                ip addr add ${addr_pfx} dev $1
+                ip link set dev $1 up
+                [ -n "$gateway" ] && ip route add default via ${gateway}
+            fi
+        fi
+    else
+        if ! ifup $1 ; then
+            if [ -n "$addr_pfx" ] ; then
+                # use the info from get_ip_info()
+                ip addr flush $1
+                ip addr add ${addr_pfx} dev $1
+                ip link set dev $1 up
+                [ -n "$gateway" ] && ip route add default via ${gateway}
+            fi
         fi
     fi
 }
@@ -199,6 +211,9 @@
     route -n
     echo '============================================================'
 }
+is_vlan() {
+    [ -f "/proc/net/vlan/$1" ]
+}
 
 op_start () {
     if [ "${bridge}" = "null" ] ; then
@@ -214,9 +229,9 @@
 
     preiftransfer ${netdev}
     transfer_addrs ${netdev} ${tdev}
-    if ! ifdown ${netdev}; then
+    if is_vlan ${netdev} || ! ifdown ${netdev}; then
        # If ifdown fails, remember the IP details.
-       get_ip_info ${netdev}
+        get_ip_info ${netdev}
        ip link set ${netdev} down
        ip addr flush ${netdev}
     fi
@@ -242,7 +257,7 @@
     fi
 
     transfer_addrs ${bridge} ${pdev}
-    if ! ifdown ${bridge}; then
+    if is_vlan ${netdev} || ! ifdown ${bridge}; then
        get_ip_info ${bridge}
     fi
     ip link set ${pdev} down

通常のスクリプトはifdownしてその後にネットワークの設定を取得するのですが、
VLANはifdownするとネットワークの設定を取得できないので、
ifdownしないようにしています。また、ifupの部分も修正しています。

xend-config.sxpを修正

使うVLANが1つの場合は

(network-script 'network-vlan-bridge netdev=eth0.10')

でいいのですが、複数の場合はラッパーを用意します。

(network-script 'network-vlan-bridge-wrapper')

にします。

network-vlan-bridge-wrapperを用意

/etc/xen/scripts/network-vlan-bridge-wrapperに

#!/bin/sh
BRIDGE_SCRIPT=/etc/xen/scripts/network-vlan-bridge
$BRIDGE_SCRIPT "$@" netdev=eth0.10
$BRIDGE_SCRIPT "$@" netdev=eth0.20

こんな感じで用意します。
使用するVLANの数だけ用意しましょう。

VLANが多い場合

http://ken-etsu-tech.blogspot.com/2007/11/vlanxen5.html
によると、
moduleのオプションを変更するらしいのですが、
私はそんなにいっぱい必要ないのでまだ実験していません。
 
かしこ