今自分のメインPCでは、下記のOSが動いています。
OS | 環境 | 用途 |
---|---|---|
Arch Linux | ホスト(物理マシン) | デスクトップ |
Debian GNU/Linux | コンテナ(systemd-nspawn) | サーバー |
Windows 10 Pro | 仮想マシン(libvirt) | ゲーム |
今までDebian GNU/LinuxとWindows 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 LinuxとDebian GNU/Linuxの間、Arch LinuxとWindows 10 Proの間の通信ができませんが、Debian GNU/LinuxとWindows 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