作者:CloudDeveloper 2019-04-17 18:04:10
云计算
虚拟化 今天要讲的 macvlan 也是其中的一种,准确说这是一种网卡虚拟化的解决方案。因为 macvlan 这种技术能将 一块物理网卡虚拟成多块虚拟网卡 ,相当于物理网卡施展了 多重影分身之术 ,由一个变多个。
创新互联是一家集网站建设,米林企业网站建设,米林品牌网站建设,网站定制,米林网站建设报价,网络营销,网络优化,米林网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
01 macvlan 简介
前面的文章讲过了几种 Linux 虚拟网络设备:tap/tun、veth-pair、bridge,它们本质上是 Linux 系统 提供的网络虚拟化解决方案,今天要讲的 macvlan 也是其中的一种,准确说这是一种网卡虚拟化的解决方案。因为 macvlan 这种技术能将 一块物理网卡虚拟成多块虚拟网卡 ,相当于物理网卡施展了 多重影分身之术 ,由一个变多个。
02 macvlan 的工作原理
macvlan 是 Linux kernel 支持的新特性,支持的版本有 v3.9-3.19 和 4.0+,比较稳定的版本推荐 4.0+。它一般是以内核模块的形式存在,我们可以通过以下方法判断当前系统是否支持:
- # modprobe macvlan
- # lsmod | grep macvlan
- macvlan 24576 0
如果***个命令报错,或者第二个命令没有返回,说明当前系统不支持 macvlan,需要升级内核。
macvlan 这种技术听起来有点像 VLAN,但它们的实现机制是完全不一样的。macvlan 子接口和原来的主接口是完全独立的,可以单独配置 MAC 地址和 IP 地址,而 VLAN 子接口和主接口共用相同的 MAC 地址。VLAN 用来划分广播域,而 macvlan 共享同一个广播域。
通过不同的子接口,macvlan 也能做到流量的隔离。macvlan 会根据收到包的目的 MAC 地址判断这个包需要交给哪个虚拟网卡,虚拟网卡再把包交给上层的协议栈处理。
03 四种模式
根据 macvlan 子接口之间的通信模式,macvlan 有四种网络模式:
默认使用的是 vepa 模式。
3.1 private
这种模式下,同一主接口下的子接口之间彼此隔离,不能通信。即使从外部的物理交换机导流,也会被无情地丢掉。
3.2 vepa
这种模式下,子接口之间的通信流量需要导到外部支持 802.1Qbg/VPEA 功能的交换机上(可以是物理的或者虚拟的),经由外部交换机转发,再绕回来。
注: 802.1Qbg/VPEA 功能简单说就是交换机要支持 发夹(hairpin) 功能,也就是数据包从一个接口上收上来之后还能再扔回去。
3.3 bridge
这种模式下,模拟的是 Linux bridge 的功能,但比 bridge 要好的一点是每个接口的 MAC 地址是已知的,不用学习。所以,这种模式下,子接口之间就是直接可以通信的。
3.4 passthru
这种模式,只允许单个子接口连接主接口,且必须设置成混杂模式,一般用于子接口桥接和创建 VLAN 子接口的场景。
3.5 mactap
和 macvlan 相似的技术还有一种是 mactap。和 macvlan 不同的是,mactap 收到包之后不是交给协议栈,而是交给一个 tapX 文件,然后通过这个文件,完成和用户态的直接通信。
04 实践
在 Linux 系统下,创建 macvlan 的命令形式如下:
- ip link add link DEVICE name NAME type { macvlan | macvtap } mode { private | vepa | bridge |
- passthru [ nopromisc ] }
通常,单独使用 macvlan 毫无意义,一般都是结合 VM 和容器来构建网络。下面我们就简单使用 namespace 来看看 Linux 是怎么使用 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: 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
可以看到,能够 ping 通,如果把上面的 mode 换成其他模式就行不通了,这个就留给大家去实验了(默认是 vepa 模式)。
另外,在 docker 中,macvlan 是一种较为重要的跨主机网络模型,这块的内容就留作下篇文章再做讲解了。
05 总结
macvlan 是一种网卡虚拟化技术,能够将一张网卡虚拟出多张网卡。
macvlan 的四种通信模式,常用模式是 bridge。
思考一下:
本文转载自微信公众号「 Linux云计算网络(ID:cloud_dev)」,公众号主要专注在 Linux、云计算、网络方面的技术分享,可以通过以下二维码关注。转载本文请联系 Linux云计算网络 公众号。
网站标题:什么?网卡也能虚拟化?
本文路径:http://www.shufengxianlan.com/qtweb/news49/524899.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联