2007/05/23

VLANとXenを組合わせて使う・その3・Xenネットワーク

VLANとXenを組合わせて使うシリーズの三回目。今回は、Xenのネットワーク設定について解説する。
注意: 2007.5.23(水)改訂

Xenでは、デフォルトで、Xen WikiXenNetworkingで解説されている様なネットワークを構成する。この設定は、/etc/xen/xend-config.sxpに記述されている。この中で、ネットワークに関しては、
(network-script network-bridge)
という行が見つかる。この行により、シェルスクリプト/etc/xen/scripts/network-bridgeが呼び出される。

スクリプト/etc/xen/scripts/network-bridgeは、最初にstartもしくはstopのうちいずれかを引数としてとり、その後に、以下の四つの引数を指定することができる。例は、既定経路(default route)がeth0の先にある場合の値。
引数内容既定値
vifnum=番号仮想インターフェース番号既定経路を持つインターフェースの番号0
bridge=名前ブリッジ名xenbr${vifnum}xenbr0
netdev=名前ブリッジに対応するインターフェース名eth${vifnum}eth0
antispoof=yes|noIPスプーフィングを行うかnono

ただ、これは前回解説した様なVLAN設定を行っている場合は正常に動作しない。
このスクリプトは、netdevに対して、一旦ダウン(ifdown ${netdev})させ、IPアドレス情報を取得し、名前をp${netdev}に変更しようとする。例えば、VLANインターフェースeth0.09000が既定経路を持っていた場合、このスクリプトでは、
  • vifnum: 0.0900
  • bridge: xenbr0.0900
  • netdev: eth0.0900
となり、eth0.0900をダウンしようとするが、VLANインターフェースは、物理インターフェースと違い、一旦ダウンさせるとインターフェース自体が消えてしまう。このため、IPアドレス情報を取得できず、スクリプトが異常終了する(bondingインターフェースもVLANインターフェースと同様、ダウンさせると消えてしまうが、このスクリプトはbondingインターフェースには対応している)
2008/6/20追記:
上の様なブリッジ名、インターフェース名を使用すると、snmpdがエラーメッセージをはく場合がある。『snmpd: ioctl 35123 returned -1』参照。


この問題を解決するため、/etc/xen/scripts/network-bridgeを改造したスクリプト/etc/xen/scripts/network-vlan-bridgeを作成する。まずは、
# cd /etc/xen/scripts
# cp network-bridge network-vlan-bridge
#
でコピーを作成し、以下の通り修正する。
# diff network-bridge network-vlan-bridge
80a81,84
> is_vlan() {
>     [ -f "/proc/net/vlan/$1" ]
> }
>
217c221
<>       if is_vlan ${netdev} || is_bonding ${netdev} || ! ifdown ${netdev}; then
257c261
<>       if is_vlan ${netdev} || ! ifdown ${netdev}; then
#
要するに、ifdownを実行する前に、VLANインターフェースかどうかをチェックするように修正した。

この様に修正した上で、以下の様なネットワークを構成する(これはあくまでも私のやり方。他にいい方法があるだろう。よい方法を考え付いた人は教えて欲しい)。VLAN ID MMMMを持つethNのVLANインターフェースethN.MMMMに対して、
  • ブリッジxenbrMMMMを作成する。
  • MMMMに1:1に対応する仮想インターフェース番号をKとする。
すなわち、
network-vlan-bridge start vifnum=K netdev=ethN.MMMM bridge=xenbrMMMM
を実行する。これは、VLANが一つだけの場合であれば、xend-config.sxpの当該部分を、
(network-script 'network-bridge vifnum=0 netdev=eth0.1000 bridge=xenbr1000')
の様に変更すればよい。

しかし、VLANの用途から考えて、VLANが一つだけということは考えにくい(一つで済むなら、VLANで運用しなくてもよいはず)。その場合、xend-config.sxpのコメントに
It is possible to use the network-bridge script in more complicated scenarios, such as having two outgoing interfaces, with two bridges, and two fake interfaces per guest domain. To do things like this, write yourself a wrapper script, and call network-bridge from it, as appropriate.
とあるように、xend-config.sxp以外のところでスクリプトを実行する必要がある(あるいは、network-bridgeスクリプトを複数回呼び出すスクリプトを準備する手もある)。まず、xend-config.sxpの当該行を
#(network-script network-bridge)
の様にコメントアウトした上で、/etc/init.d/xendを以下の様に変更する。
# diff xend.dist xend
21a22,23
> BRIDGE_SCRIPT=/etc/xen/scripts/network-vlan-bridge
>
47a50,51
>       $BRIDGE_SCRIPT start vifnum=0 netdev=eth0.1000 bridge=xenbr1000
>       $BRIDGE_SCRIPT start vifnum=1 netdev=eth0.1001 bridge=xenbr1001
52a57,58
>       $BRIDGE_SCRIPT stop vifnum=0 netdev=eth0.1000 bridge=xenbr1000
>       $BRIDGE_SCRIPT stop vifnum=1 netdev=eth0.1001 bridge=xenbr1001
#

とあるように、network-vlan-bridgeを複数回呼び出すラッパーnetwork-vlan-bridge-wrapperを作成し、これを呼び出すように変更する。まず、xend-config.sxpの当該行を以下のように変更する。
(network-script network-vlan-bridge-wrapper)
これにより、network-bridgeの代わりにnetwork-vlan-bridge-wrapperが呼び出されるようになる。
ラッパー/etc/xen/scripts/network-vlan-bridge-wrapperは、以下の通り。
#!/bin/sh
BRIDGE_SCRIPT=/etc/xen/scripts/network-vlan-bridge
$BRIDGE_SCRIPT "$@" vifnum=0 netdev=eth0.1000 bridge=xenbr1000
$BRIDGE_SCRIPT "$@" vifnum=1 netdev=eth0.1001 bridge=xenbr1001
上は、VLAN ID 1000および1001を使う場合の例。より多くのVLANを使用する場合には、行を追加すればよい。

が、/etc/xen/scripts/network-bridgeの中に
# vifnum     Virtual device number to use (default 0). Numbers >=8
#            require the netback driver to have nloopbacks set to a
#            higher value than its default of 8.
とあるように、カーネル変数の変更が必要らしいが、試していない。悪しからず。

2007/11/22追記:
これについて検証した。『VLANとXenを組合わせて使う・その5・仮想ブリッジが多い場合』参照。


VLANとXenを組合わせて使う・その1
VLANとXenを組合わせて使う・その2・VLAN設定l
VLANとXenを組合わせて使う・その3・Xenネットワーク
VLANとXenを組合わせて使う・その4・DomUインストール
VLANとXenを組合わせて使う・その5・仮想ブリッジが多い場合

0 件のコメント: