June 29, 2009
kvmのブリッジ設定
最近、研究室のUbuntuマシンで、kvmをいじっているのだが、今日になってようやくブリッジによるネットワーク設定が出来たので、備忘録を書いておく。ちゃんと整理したものについても、そのうち書きたいと思う。
前提として、kvm自体の環境は一通り整っているものとする。
まずはブリッジ設定に必要なパッケージのインストール。
tun
bridge
の二行を追加しておくとよい。
次に、エディタで/etc/network/interfacesを開く。
と編集する。br0のアドレス設定は環境によって適宜変えること。別にdhcpでも構わない。"ユーザ名"としたところは、実際にkvmコマンドを使うユーザの名前を書いておく(管理者権限なら"root")。
今までは実NICのeth0にIPアドレスやゲートウェイなどのネットワーク設定がなされていたと思うが(環境によってはeth1のように、別の名前になっていたりするかも)、その設定はブリッジであるbr0というインターフェイスに渡す。そして、ネットワークブリッジであるbr0に実NICのeth0と仮想NICのtap0を追加する。ここで、これらのインターフェイスをプロミスキャスモード(promiscオプション)で立ち上げることで、TUN/TAPデバイス(仮想NIC)宛のパケットを実NICが受信できるようにしているのだ。
これらの設定が終わったらネットワークを再起動する。
これで、設定は終わりだ。あとはkvmコマンド(OSによってはqemuコマンドかも)に"-net nic -net tap,ifname=tap0,script=no"というオプションをつけて実行すればホストOSとゲストOSが同じネットワークに参加できる筈だ。
前提として、kvm自体の環境は一通り整っているものとする。
まずはブリッジ設定に必要なパッケージのインストール。
# apt-get install bridge-utils uml-utilities
さらに、モジュールをロードしておく。# modprobe bridge tun
これでブリッジとTUN/TAPデバイス(仮想ネットワークインターフェイス)が使えるようになる。毎回このコマンドを実行するのは面倒なので、/etc/modulesにtun
bridge
の二行を追加しておくとよい。
次に、エディタで/etc/network/interfacesを開く。
auto lo
iface lo inet loopback
iface eth0 inet manual
auto br0
iface br0 inet static
address 192.168.0.2
network 192.168.0.0
gateway 192.168.0.1
broadcast 192.168.0.255
netmask 255.255.255.0
pre-up /sbin/ifconfig eth0 0.0.0.0 promisc up
pre-up /usr/sbin/brctl addbr br0
pre-up /usr/sbin/tunctl -u ユーザ名 -t tap0
pre-up /sbin/ifconfig tap0 0.0.0.0 promisc up
post-up /usr/sbin/brctl addif br0 eth0
post-up /usr/sbin/brctl addif br0 tap0
pre-down /sbin/ifconfig tap0 down
pre-down /sbin/ifconfig eth0 down
post-down /sbin/ifconfig br0 down
post-down /usr/sbin/brctl delbr br0
iface lo inet loopback
iface eth0 inet manual
auto br0
iface br0 inet static
address 192.168.0.2
network 192.168.0.0
gateway 192.168.0.1
broadcast 192.168.0.255
netmask 255.255.255.0
pre-up /sbin/ifconfig eth0 0.0.0.0 promisc up
pre-up /usr/sbin/brctl addbr br0
pre-up /usr/sbin/tunctl -u ユーザ名 -t tap0
pre-up /sbin/ifconfig tap0 0.0.0.0 promisc up
post-up /usr/sbin/brctl addif br0 eth0
post-up /usr/sbin/brctl addif br0 tap0
pre-down /sbin/ifconfig tap0 down
pre-down /sbin/ifconfig eth0 down
post-down /sbin/ifconfig br0 down
post-down /usr/sbin/brctl delbr br0
と編集する。br0のアドレス設定は環境によって適宜変えること。別にdhcpでも構わない。"ユーザ名"としたところは、実際にkvmコマンドを使うユーザの名前を書いておく(管理者権限なら"root")。
今までは実NICのeth0にIPアドレスやゲートウェイなどのネットワーク設定がなされていたと思うが(環境によってはeth1のように、別の名前になっていたりするかも)、その設定はブリッジであるbr0というインターフェイスに渡す。そして、ネットワークブリッジであるbr0に実NICのeth0と仮想NICのtap0を追加する。ここで、これらのインターフェイスをプロミスキャスモード(promiscオプション)で立ち上げることで、TUN/TAPデバイス(仮想NIC)宛のパケットを実NICが受信できるようにしているのだ。
これらの設定が終わったらネットワークを再起動する。
# /etc/init.d/networking restart
で先ほど書いた設定が反映されるはずだ。端末からifconfigコマンドを使えばbr0やtap0といったインターフェイスがあるか、また、br0にアドレスが割り振られているか等を確認することができる。これで、設定は終わりだ。あとはkvmコマンド(OSによってはqemuコマンドかも)に"-net nic -net tap,ifname=tap0,script=no"というオプションをつけて実行すればホストOSとゲストOSが同じネットワークに参加できる筈だ。
$ kvm -hda guest.img -boot c -m 512 -no-acpi -net nic -net tap,ifname=tap0,script=no &
実際に使う時はこんな感じだろうか。どうしてもコマンドが長くなるので、エイリアスを張るなりして簡単にするといいと思う。