macvlanとnetplan

ASRock H97 Pro4にXeon E3-1265L v3を載せたHaswellにKVM環境を構築。

macvtap does not work for host to guest network communication

virt-managerのNIC設定より

他のPCからLAN経由でアクセスできるようにしたいので、仮想NICの設定を物理NICの"Bridge"モードにしたところ

In most configurations, macvtap does not work for host to guest network communication.

という警告が表示された。

確かにLAN内の別マシンと仮想マシンとのpingは通るものの、ホストとゲストHaswellに閉じた世界では、どちらからもpingが疎通しない。そう言えば以前も悩んだような…と記憶を辿ってみたところ、物理NICをmacvlanでブリッジして、macvlanの方にIPを付与すればいい、という対処法を思い出した。

具体的には

$ ip addr del 192.168.199.2/24 dev enp0s25
$ ip link add dev macvlan0 link enp0s25 type macvlan mode bridge
$ sudo ip addr add 192.168.199.2/24 dev macvlan0
$ sudo ip link set macvlan0 up
$ ip route add default via 192.168.199.254 dev macvlan0

という手順でIPアドレスをenp0s25からmacvlan0に移設すればよい。

で、再起動にも自動的に同様の設定になるよう/etc/network/interfaces

auto **enp0s25**
iface **enp0s25** inet manual
    gateway 192.168.199.254
    dns-nameservers 192.168.199.254
    post-up   ip link add dev macvlan0 link **enp0s25** type macvlan mode bridge
    post-up   ip addr add 192.168.199.2/24 broadcast 192.168.199.255 dev macvlan0
    post-up   ip link set macvlan0 up
    pre-down  ip link set macvlan0 down
    pre-down  ip link del dev macvlan0 link **enp0s25**

としようと思ったのだが、18.04 Bionic以降では/etc/netplan/*.yamlの方でやる必要がある。

で、netplanのお作法を調べてみたところ、何ということでしょう!Bug #1664847 “[Wishlist] Support macvlan/macvtap interfaces”によって**“netplanはmacvlanに未対応”**という事情が判明。

“Wishlist"というステータスだが、“そのうち"では困るので今できる対処方法を誰か書いてないかしら…、と思いつつ読み進めていったところComment #19networkdnetworkd-dispatcherを併用すればmacvlanを生成できるらしいとわかったので、早速先達に倣って

/etc/networkd-dispatcher/routable.d/10-macvlan-interfaces.sh

#! /bin/bash
ip link add macvlan0 link enp0s25 type macvlan mode bridge

と、/etc/netplan/81-macvlan-config.yaml

# network: {config: disabled}
network:
    version: 2
    **renderer: networkd**
    ethernets:
        macvlan0:
            addresses:
            - 192.168.199.2/24
            - 240f:ca:5fb8:1:192:168:199:2/64
            gateway4: 192.168.199.254
            gateway6: 240f:ca:5fb8:1:192:168:199:254
            nameservers:
                addresses: [240f:ca:5fb8:1:192:168:199:1, 192.168.199.1, 8.8.8.8]
            dhcp4: no
            dhcp6: no
            mtu: 8996

の2つを用意して、

$ sudo systemctl enable systemd-networkd.service
$ sudo systemctl enable networkd-dispatcher.service
$ sudo netplan apply

とやる事でうまくいった。

参照

Qiita https://qiita.com/

Launchpad Bugs https://bugs.launchpad.net/

Netplan https://netplan.io/

Ubuntu Manpage https://manpages.ubuntu.com/

Wikipedia http://ja.wikipedia.org/wiki/