macvtap でつないだ kvm ゲストとホスト間の通信
kvm ゲストの仮想 NIC を macvtap 経由で物理 NIC に直接アタッチするとパフォーマンスが良いようですね.macvtap については
- MacVTap - Linux Virtualization Wiki
- libvirt 文書の Domain XML format のDirect attachment to physical interface セクション
- http://wiki.libvirt.org/page/Guest_can_reach_outside_network,_but_can't_reach_host_(macvtap)
- libvirtで色々な仮想NICの設定を使い分ける - かーねる・う゛いえむにっき
等が判りやすいかと.
この際,ゲスト〜ホスト間の通信はできません.まあ,きちんとしたサービスとしてやるときは必要ないかもしれませんが,手元でちょっとテストをやってる時なんかは,ゲスト〜ホスト間通信ができると便利な事もあります.
macvtap というのは Linux kernel の持つ機能で macvlan というインターフェースを作れますが,これを Tap として利用するモノのようです.ということは macvlan/macvtap 間の通信は "bridgeモード" に設定しておけば可能です(この辺りのモードについては前述の参考文書を参照) ので,ホスト上に macvlan インターフェースを作成して,そこにホストのアドレスを割り当ててしまえば,ゲスト〜ホスト間の通信は可能なはず,ということでやってみました.
ゲストVMは eth0 に作られた macvtap につながっています.
- macvlanインターフェースを作成."macvlan0" という名前にします.
ip link add dev macvlan0 link eth0 type macvlan mode bridge
- eth0 のアドレスは削除して macvlan0 に割り当て.
ip addr del 172.16.44.18/24 dev eth0
ip addr add 172.16.44.18/24 broadcast 172.16.44.255 dev macvlan0
ip link set macvlan0 up - デフォルトルート設定.
ip route flush dev eth0
ip route add default via 172.16.44.254 dev macvlan0 proto static
ごちゃごちゃと試行錯誤しながらやってたので,ヌケがあるかもしれませんが,大体こんな感じで無事ゲスト〜ホスト間の通信が可能になりました.(後日確認します)