XenでVLANを使う
XenもVLANも大変便利なのですが、両方を同時に使うとなると
これが簡単にはいきません。
例えば、グローバル側にあるサーバと、ローカル側にあるサーバを
1台のXenホストに載せたいという要望があった場合に、
NICを一つでなんとかやる場合はXen上でVLANを使うことになります。
これが苦労しました。
理由はXenの起動スクリプトがVLANに対応していないためです。
そのため、起動スクリプトをLenny用に作成しました。
http://ken-etsu-tech.blogspot.com/2007/05/vlanxen3xen.html
を参考に作成しました。
まず、VLANを用意
大幅に省略しますが、
- L2SWでタグ付きVLANポートを用意
- aptでvlanをインストール
- /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のオプションを変更するらしいのですが、
私はそんなにいっぱい必要ないのでまだ実験していません。
かしこ