Humanity

Edit the world by your favorite way

lxc-start/lxc-stopする度に接続が切れる問題

ずっと悩んでたLXCの問題が今日解決した。
lxc-develで同じ現象が起きている人がいて助かった。

http://sourceforge.net/mailarchive/forum.php?thread_name=0A2009F9DE7D46469F263CB6367EA1356C908183%40dnbf-ex1.AD.DDB.DE&forum_name=lxc-devel
http://sourceforge.net/tracker/?func=detail&aid=3411497&group_id=163076&atid=826303

現象

  • ssh経由でlxc-stopかlxc-startするとsshが固まってしまう
  • ログ見るとどうやらsshだけじゃなくネットワーク自体が(一定時間)ダウンしてるらしい
  • 起きる時と起きない時がある

原因

Linuxのbridgeデバイスが原因。
vethデバイス*1 *2がbridgeに繋がったり取り除かれたりした際に、もしvethデバイスのMACアドレスがbridgeの現在のMACアドレスよりも「下」(例えばbridgeデバイスが01:xx:xx:xx:xx:xxでvethデバイスが02:xx:xx:xx:xx:xx)だとbridgeデバイスがvethデバイスよりも「下」のアドレスに変わってしまい、ARPエントリが更新されるまで通信不可能になるため。

このLinuxのbridgeデバイスの問題は結構有名らしく、libvirtではvethデバイスのMACアドレスを「FE:〜」で始まるようにしたりして対処しているらしい。 *3

起きる時と起きない時があったのは、自動生成されたvethデバイスのMACアドレスがbridgeのMACアドレスより大きければ起きなかった、ってことだと思う。多分。

解決策

bridgeデバイスのMACアドレスが変わらないようにする方法が以下のページに書いてあった。

Linux bridge: MAC addresses and dynamic ports « \1

/etc/network/interfacesに、以下のようにpost-upでMACアドレスをセットすればMACアドレスが変わることはないらしい。

auto br0
iface br0 inet static
  address 10.4.0.3
  netmask 255.255.255.0
  gateway 10.4.0.254
  bridge_ports eth0
  bridge_stp off
  post-up ip link set br0 address 00:0a:e7:2c:44:2a

Linux bridge: MAC addresses and dynamic ports « \1

おまけ

上のpost-upの部分にも使われているipコマンドで思い出したので、Linuxのネットワーク関係の古いコマンドと新しいコマンドの対応表を引用。ブクマしただけだと埋もれそうなので...

Deprecated command Replacement command(s)
arp ip n (ip neighbor)
ifconfig ip a (ip addr), ip link, ip -s (ip -stats)
iptunnel ip tunnel
iwconfig iw
nameif ip link, ifrename
netstat ss, ip route (for netstat-r), ip -s link (for netstat -i), ip maddr (for netstat-g)
route ip r (ip route)
Deprecated Linux networking commands and their replacements | Doug Vitale Tech Blog

*1:ググってみたらveth interfaceとはあまり言わない...?interfaceとdeviceの違いがよく分かってないけどこの記事では「vethデバイス」「bridgeデバイス」で統一する。

*2:/sbin/ifconfigを見ると「veth〜」で始まるインターフェースが現在アクティブな仮想マシンの数だけあるはずです

*3:根本的解決ではない