2012-05-18

Ubuntu で KVM 仮想マシンをブリッジ接続する

過去にUbuntuでKVM仮想マシンを作成するで作成した仮想マシンは Ubuntu マシン内の仮想ネットワークセグメントに接続され、外部へのネットワーク接続はできるが、外部からの接続を受け取れないようになっていた。これではサーバの実験などを行うのに向かないので、仮想マシンを外部のネットワークセグメントに直接接続しているように見せかけたい。これにはイーサネットブリッジを用いる。以下で Ubuntu でのブリッジの設定を説明する。

Linux のブリッジインタフェース

イーサネットブリッジとは複数のイーサネットセグメントを接続して、一つのイーサネットセグメントとして機能させるようにするためのデバイスである。

Linux では、このイーサネットブリッジの働きをエミュレートするデバイスドライバが用意されていて、brctl コマンドによって操作できる。

まず brctl addbr によりイーサネットブリッジのインスタンスを作成し、これに対して既存のネットワークインタフェースを brctl addif により追加する。すると追加されたネットワークインタフェースが接続されたセグメント達が一つの論理セグメントとして機能するようになる。この論理セグメントに対する通信はイーサネットブリッジのインスタンスに対応する新たなインタフェースに対して行うことになる。TCP/IP のレベルでいうと、IP アドレスを持つのはイーサネットブリッジインタフェースであり、ブリッジに接続されたネットワークインタフェースはもはや IP アドレスを持たない。

Ubuntu でのブリッジの設定

ブリッジを設定するには bridge-utils パッケージをインストールする必要がある(KVM 関連のパッケージをインストールしていれば既にインストールされている)。

$ sudo apt-get install bridge-utils

Ubuntu でもブリッジの設定には brctl を用いるのであるが、/etc/network/interfaces にブリッジ用の記述をすることで、起動時に裏で brctl が実行されて希望の設定でマシンが起動するようにできる。ここでは有線イーサネットインタフェース eth0 をブリッジに参加させた状態で起動するように設定しよう。後で仮想マシンをこのブリッジに接続することになる。

Ubuntu Desktop では /etc/network/interfaces はデフォルトで以下のようになっているだろう。

auto lo
iface lo inet loopback

ここに eth0 などの記述が無いのは、Ubuntu 特有の Network Manager というパッケージが /etc/network/interfaces に記述の無いネットワークインタフェースを自動設定してくれるようになっているからである。

新たにブリッジインタフェースを生成して既存のインタフェースを追加するには以下のように変更する。

auto lo
iface lo inet loopback

auto br0
iface br0 inet dhcp
    bridge_ports eth0

Ubuntu でのブリッジに関して検索すると何かいろいろ設定するようなことが出てくるが、上記以外の設定は基本的には不要である。

  • eth0 をプロミスキャスモードに設定する必要があるが、bridge_ports eth0 の記述で設定してくれる。
  • bridge_stp off などの記述で不要なオーバーヘッドを回避できるが大したオーバーヘッドではない。
  • Network Manager との競合を避ける設定は(少なくとも Ubuntu 11.04 以降では)必要無い。上記の /etc/network/interfaces の記述により br0, eth0 とも Network Manager の管轄から外してくれる。

なお、DHCP を使っていない場合は上記 dhcpstatic にし、必要な設定を記述すればよい。

ブリッジに接続する仮想マシンを作る

KVM でブリッジに参加させる仮想マシンを libvirt で作成する方法は、virt-install--network='bridge=br0' を追加するだけでよい。UbuntuでKVM仮想マシンを作成するの例でいえば、以下のようにすればよい。

$ sudo virt-install --name=example --ram=1024 --vcpus=2    \
                    --cdrom=debian-6.0.4-i386-netinst.iso  \
                    --os-variant=virtio26
                    --disk='path=example.img,format=qcow2' \
                    --graphics='type=vnc,listen=0.0.0.0'   \
                    --network='bridge=br0'

既存の仮想マシンをブリッジに接続する

既存の仮想マシンをブリッジに接続するには、libvirt の *.xml 設定ファイルを直接いじる。ここでは mykvm という名前の仮想マシン(ドメイン)を変更するとする。

$ virsh edit mykvm

ここで、<interface type='network'> を探し以下の変更を行う。

  • typebridge に変更する
  • <mac address='xx:xx:xx:xx:xx:xx'/> の値を少し変える。
  • <source network='default'/> を <source bridge='br0'/> に変える。

以上の変更後保存して、仮想マシンを起動するとうまくいく…はずであるが、うまくいかない。

これは以下の事情による。Ubuntu (Debian) では、異なる NIC に異なるインタフェース名が付くようにするために、/etc/udev/rules.d/70-persistent-net.rules に MAC アドレスを記録している。これで新たな設定のネットワークインタフェースが eth1 になってしまったためにうまくいかないのだ。/etc/udev/rules.d/70-persistent-net.rules のエントリを手動で削除して再起動するとうまくいくようになる。

References

microHOWTO: Persistently bridge traffic between two or more Ethernet interfaces (Debian) に簡にして要を得た説明がある。

DebianでNICを差し替えたとき認識しなくなる話 - 揮発性のメモ に Ubuntu (Debian) でのネットワークインタフェースの名前付けに関する情報がある。

0 件のコメント:

コメントを投稿