假设我使用ip 链接(8)创建一个接口,test-macvlan
并为其分配地址10.11.12.13
:
# ip link add link eno1 name test-macvlan type macvlan
# ip address add 10.11.12.13 dev test-macvlan
# ip address show test-macvlan
10: test-macvlan@eno1: <BROADCAST,MULTICAST> mtu 1500 ...
link/ether d2:f7:32:3f:c9:4a brd ff:ff:ff:ff:ff:ff
inet 10.11.12.13/32 scope global test-macvlan
然后,我用ip-netns(8)创建网络命名空间,test-netns
并使用ip 链接(8)将test-macvlan
接口分配给新的命名空间:
# ip netns add test-netns
# ip link set test-macvlan netns test-netns
# ip netns exec test-netns ip address show test-macvlan
10: test-macvlan@if2: <BROADCAST,MULTICAST> mtu 1500 ...
link/ether d2:f7:32:3f:c9:4a brd ff:ff:ff:ff:ff:ff link-netns root
该接口不再有 IP 地址。同样的事情也会发生在vlan
接口上,这大概就是为什么有关路由和网络命名空间集成的 WireGuard 教程要求您分配wireguard
设备分配 IP 地址后更改其网络名称空间。
为什么会出现这种情况?代表着systemd-networkd 需要新代码来支持在网络命名空间中创建虚拟网络设备。如果网络接口的配置可以跨网络命名空间移植,那么通过避免容器运行自己的网络管理器的需要,这不是可以简化事情吗?