Kenichi Maehashi's Blog

脳内コアダンプ

RSS
Category: Linux
(追記)
この問題は libvirt-0.6.3-33.el5_5.3 で解消されました(CentOS 5.x でも利用可能になっています)。

環境は CentOS 5.5 (x86_64)、libvirt-0.6.3-33.el5_5.1、bridge-utils-1.1-2。KVM と書きましたが、libvirt の問題なので Xen でも同様かと思われます。
ここでは、VM をブリッジ接続している状況 ... 例えば br0 に対して eth0 (実際のネットワークに接続するインターフェース) と vnet0 (仮想マシンのインターフェース) を enslave させているような場合 ... を前提としています。

さて、virsh でゲストを start したり destroy したりすると、ホスト側の SSH が一時的に応答しなくなる場合があります。この問題は、ブリッジに接続しているインターフェースが変更されるとブリッジの MAC アドレスが変更されてしまうことに起因します。具体的には、
  1. (Linux の)ブリッジは enslave された Ethernet インターフェースの持つ MAC アドレスのうち、一番小さいものをブリッジの MAC アドレスとして採用する
  2. libvirt は vnetX に対してランダムに MAC アドレスを付与する(*1)
  3. よって、VM が start ないし destroy され、ブリッジに参加しているインターフェースが変更されたとき、ブリッジの MAC アドレスが変更されてしまう場合がある
ということです。

これによって問題が生じるのは、そのブリッジインターフェースに割り当てた IP アドレスを使用して何らかのネットワークサービス(SSH による管理などを含む)を提供している場合です。このケースでは、MAC アドレスが頻繁に変更されるのは好ましくありません(クライアントは ARP キャッシュの期限が切れるまでアクセスできなくなってしまうため)。

この問題は既に報告されており、仮想マシンに付与する MAC アドレスの 1 オクテット目を FE にすることで対処されるようです。2010-07-26 に Fixed In Version: libvirt-0.6.3-35.el5 になっていますが、RHEL5 にもまだ出ていないようなので、CentOS で提供されるまではもうちょっとかかりそうですね(*2)。

(*1) ランダムと言っても locally administered フラグは立っているので、(実際のネットワークに接続する)Ethernet インターフェースの MAC アドレスの 1 オクテット目が 00 で始まる場合、問題は起きません(Lucky you!)。今回トラブルが起きたのは HP ML110 G5 の on-board NIC で、OUI が 78:E7:D1 となっていました。
(*2) 個人的には、とりあえず、ifcfg-eth0 に MACADDR=02:00:00:00:00:00 と書いてしまうことにしました(locally administered な MAC アドレスの中で最小なので、ブリッジ中で常に最小であることが保証される)。KVM ホストが複数ある場合は悩ましいですね...。

Comments

G5
2010/08/23
大変参考になりました。ありがとうございます。
同じくML115 G5でKVMを試しており、同じ問題で困っていました。

ただ、Ubuntu10.04のlibvirt 0.7.5-5ubuntu27.2 では
対応されておらず、手動での解決を必要としました。

eth0へlocally administered なMACアドレスの付与も考えましたが
ブリッジインターフェースは固定MACアドレスを設定すると
自動付け替え行わなわなくなるとの情報を以下で見つけ

http://backreference.org/2010/07/28/linux-bridge-mac-addresses-and-dynamic-ports/

次のような対処をしました。

--- /etc/network/interfaces ---
auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
hwaddress ether 78:e7:d1:xx:xx:xx (eth0のMACを指定)
address 10.0.0.2
netmask 255.255.255.0
gateway 10.0.0.1

bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0

今のところこの設定で安定しております。
ご参考まで。
2010/08/24
>> G5 さん
参考になったようで何よりです。
また、Ubuntu での情報ありがとうございます。

CentOS 5 では MACADDR=(eth0 と同じ MAC アドレス) を使用して br0 の MAC アドレスを固定しても、MAC アドレス書き換えの問題は起こってしまうようです。CentOS は kernel のバージョンが 2.6.18 と古いので、そのためかもしれません。
Leave Yours...
Name:
E-mail / URL (optional):
Comment:
Are You Robot?: