【lenny】KVM with TUN/TAP birdged network

KVMでのTUN/TAPを使ったホストOSとゲストOSのブリッジ接続の設定。
結構ハマった。
※ゲストOSをsudoで起動しないとtapデバイスが起動(初期化)できないらしい。


1. 構成
こんな感じ。

 +------------------------------------+
 |                                    |
 |   +-------- (GuestOS) ---------+   |
 |   |                            |   |
 |   |        Windows2000         |   |
 |   |                            |   |
 |   |         eth0(DHCP)         |   |
 |   +-------------*--------------+   |
 |                 |                  | ### HostOSおよびGuestOSへのIPアドレス付与はDHCPで。
 |   +-------- (HostOS) ----------+   |
 |   |     tap0(virtual I/F)      |   |
 |   |    br0(DHCP/bridge eth0)   |   |
 |   |                            |   |
 |   |        Debian(lenny)       |   |
 |   |                            |   |
 |   |        eth0(real I/F)      |   |
 |   +-------------*--------------+   |
 |                 |                  |
 |  |------- (LAN/Internet) -------|  |
 |                                    |
 +------------------------------------+


2. ブリッジインタフェース(br0)の設定

# /etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 0.0.0.0

auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_maxwait 5

起動時にbr0が作成され、IPアドレスが付与される。
(eth0にはIPアドレスは付与されない。)


3. TAPデバイスの設定
まずは、tunモジュール確認。

# lsmod | grep tun
tun                    16640  0 

モジュールがない場合は、以下のコマンドを実行する。

# modprobe tun

起動時にロードされるようにする。

# /etc/modules

tun

TAPデバイス起動用スクリプトを準備する。
今回は、/etc/kvm/kvm-ifupを使用します。*1

# /etc/kvm/kvm-ifup
 
#!/bin/sh
switch=$(ip route ls | awk '/^default / { for(i=0;i<NF;i++) { if ($(i) == "dev") print $(i+1) }}')
/sbin/ifconfig $1 0.0.0.0 up
/usr/sbin/brctl addif ${switch} $1
exit 0


4. sudoの設定

# /etc/sudoers 

<kvmを起動するユーザ>      ALL=(ALL) ALL


5. ゲストOSの起動

$ sudo kvm -hda win2000 -boot c -m 512 -k ja -net nic -net tap,script=/etc/kvm/kvm-ifup -localtime

ゲストOSにホストOSと同セグメントのIPアドレスが付与され、直接通信ができる。
ホストOS側でifconfigを実行すると、tap0デバイスが起動している。
ちなみにsudoで起動しないと、こんな感じのエラーがでる。

warning: could not open /dev/net/tun: no virtual network emulation
Could not initialize device ‘tap’

*1:デフォルトで作成されているので、そのまま使用。