ip link add link DEVICE name NAME type { macvlan | macvtap } mode { private | vepa | bridge |
passthru [ nopromisc ] }
通常,单独使用 macvlan 毫无意义,一般都是结合 VM 和容器来构建网络。下面我们就简单使用 namespace 来看看 Linux 是怎么使用 macvlan 的。
实验拓扑如下:
网卡也能虚拟化?网卡虚拟化技术 macvlan 详解
在我的系统中,以接口
enp0s8
为例创建两个 macvlan 子接口(使用 bridge 模式),配置 IP 并将其挂到两个 namespace 中,测试连通性。
# 创建两个 macvlan 子接口
ip link add link enp0s8 dev mac1 type macvlan mode bridge
ip link add link enp0s8 dev mac2 type macvlan mode bridge
# 创建两个 namespace
ip netns add ns1
ip netns add ns2
# 将两个子接口分别挂到两个 namespace 中
ip link set mac1 netns ns1
ip link set mac2 netns ns2
# 配置 IP 并启用
ip netns exec ns1 ip a a 192.168.56.122/24 dev mac1
ip netns exec ns1 ip l s mac1 up
ip netns exec ns1 ip a a 192.168.56.123/24 dev mac2
ip netns exec ns2 ip l s mac2 up
enp0s8
的 IP 是
192.168.56.110/24
,配置的子接口 IP 也必须是同一网段的。
完了两个子接口 ping 一下:
root@ubuntu:~# ip netns exec ns1 ip a show mac1
9: mac1@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1
link/ether 2e:6e:d9:08:c5:05 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.56.122/24 scope global mac1
valid_lft forever preferred_lft forever
inet6 fe80::2c6e:d9ff:fe08:c505/64 scope link
valid_lft forever preferred_lft forever
root@ubuntu:~# ip netns exec ns1 ping 192.168.56.123
PING 192.168.56.123 (192.168.56.123) 56(84) bytes of data.
64 bytes from 192.168.56.123: icmp_seq=1 ttl=64 time=0.052 ms
64 bytes from 192.168.56.123: icmp_seq=2 ttl=64 time=0.028 ms
^C
--- 192.168.56.123 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.028/0.040/0.052/0.012 ms