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
原因
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
Linux bridge: MAC addresses and dynamic ports « \1
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
おまけ
上のpost-upの部分にも使われているipコマンドで思い出したので、Linuxのネットワーク関係の古いコマンドと新しいコマンドの対応表を引用。ブクマしただけだと埋もれそうなので...
Deprecated Linux networking commands and their replacements | Doug Vitale Tech Blog
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)