けさらんぱの自由帳

とあるFF14プレイヤーがFF14のこととか関係ないことを書いていく予定のブログです。記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

仮想環境のネットワーク接続をMACVLANとMACVTAPに切り替えてみた

今自分のメインPCでは、下記のOSが動いています。

OS 環境 用途
Arch Linux ホスト(物理マシン) デスクトップ
Debian GNU/Linux コンテナ(systemd-nspawn) サーバー
Windows 10 Pro 仮想マシンlibvirt ゲーム

今までDebian GNU/LinuxWindows 10 Proはソフトウェアブリッジ経由でネットワークに接続されていたのですが、これを性能が良いというMACVLAN/MACVTAP経由に切り替えてみることにしました。

systemd-nspawnでMACVLAN接続

設定ファイル中の下記のような記述を、

[Network]
Bridge=nm-bridge

次のように書き換えます。

[Network]
MACVLAN=eth0

libvirtでMACVTAP接続

設定ファイル中の下記のような記述を、

<interface type='bridge'>
  <mac address='xx:xx:xx:xx:xx:xx'/>
  <source bridge='br0'/>
  ...
</interface>

次のように書き換えます。

<interface type='direct'>
  <mac address='xx:xx:xx:xx:xx:xx'/>
  <source dev='eth0' mode='bridge'/>
  ...
</interface>

ホストと仮想環境での通信の設定

MACVLAN/MACVTAPで仮想環境をネットワークに接続する場合、そのままではホストと仮想環境の間の通信ができません。ただし、MACVLAN/MACVTAP同士の通信はできます。例えば今回の場合では、Arch LinuxDebian GNU/Linuxの間、Arch LinuxWindows 10 Proの間の通信ができませんが、Debian GNU/LinuxWindows 10 Proの間の通信は可能です。なので、ホストのArch LinuxもMACVLAN経由でネットワークで接続するようにしてしまえば、ホストと仮想環境の間で通信ができるようになります。

これをsystemd-networkdで実現する場合、下記のようにします。

#
# macvlan.netdev
#
[NetDev]
Name=macvlan0
Kind=macvlan

[MACVLAN]
Mode=bridge
#
# macvlan.network
#
[Match]
Name=macvlan0

[Network]
Address=192.168.x.y/24
...
#
# eth0.network
#
[Match]
MACAddress=xx:xx:xx:xx:xx:xx

[Network]
MACVLAN=macvlan0

記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。