macvlan和macvtap介绍和使用

2023-11-02 16:40
文章标签 使用 介绍 macvlan macvtap

本文主要是介绍macvlan和macvtap介绍和使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考文献:
https://blog.csdn.net/dkfajsldfsdfsd/article/details/79525187
http://www.qingpingshan.com/m/view.php?aid=389184

学习这个的目的,是为了了解下面的内容:
https://github.com/containernetworking/plugins

 

01 macvlan 简介

前面的文章讲过了几种 Linux 虚拟网络设备:tap/tun、veth-pair、bridge,它们本质上是 Linux 系统 提供的网络虚拟化解决方案,今天要讲的 macvlan 也是其中的一种,准确说这是一种网卡虚拟化的解决方案。因为 macvlan 这种技术能将 一块物理网卡虚拟成多块虚拟网卡 ,相当于物理网卡施展了 多重影分身之术 ,由一个变多个。它可以为一张物理同时要求物理网卡打开混杂模式。针对每个mac地址,都可以设置IP地址,本来是一块物理网卡连接到交换机,现在是多块虚拟网卡连接到交换机。macvlan应该很简单。

 

 mavclan要知道的小知识点

  • macvlan并不创建网络,只创建虚拟网卡,(网络和网卡的区别)
  • macvlan会共享物理网卡所链接的外部网络,实现的效果跟桥接模式是一样的。
  1. macvlan 既不创建网络,主要有什么特性?或者说,macvlan的使用场景?
  • macvlan主要是用来解决效率问题的。
  • 也就是说macvlan是效率贵高的跨主机网络虚拟化解决方案之一。
  • 适合在对网络性能要求极高的场景下。
  1. 网络虚拟化的目的?
    就是在多租户场景下,在统一的底层网络之上,单独为每个租户虚拟出自己的网络从而达到隔离的目的。

  2. macvlan属于什么解决方案呢?或者说,macvlan到底是干什么的,? 或者说,有什么用?

  • macvlan是网卡虚拟化方案
  • macvlan将一张物理网卡设置多个mac地址,就是一变多,一对多;类似于鸣人的影分身之术, 注意: 需要物理网卡,打开混杂模
  • [root@localhost ~]# ifconfig 
    docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0ether 02:42:03:f4:36:a8  txqueuelen 0  (Ethernet)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0enp49s0f0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 10.10.1.2  netmask 255.255.255.0  broadcast 10.10.1.255inet6 fe80::d65d:64ff:fe07:a8ea  prefixlen 64  scopeid 0x20<link>ether d4:5d:64:07:a8:ea  txqueuelen 1000  (Ethernet)RX packets 753534  bytes 87775044 (83.7 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 197292  bytes 17180026 (16.3 MiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0device memory 0xe6e20000-e6e3ffff  enp49s0f1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 10.10.1.3  netmask 255.255.255.0  broadcast 10.10.1.255inet6 fe80::630d:9f6c:1f70:ee47  prefixlen 64  scopeid 0x20<link>ether d4:5d:64:07:a8:eb  txqueuelen 1000  (Ethernet)RX packets 870944  bytes 127812481 (121.8 MiB)RX errors 0  dropped 23689  overruns 0  frame 0TX packets 15528  bytes 1014159 (990.3 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0device memory 0xe6e00000-e6e1ffff  lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 127.0.0.1  netmask 255.0.0.0inet6 ::1  prefixlen 128  scopeid 0x10<host>loop  txqueuelen 1000  (Local Loopback)RX packets 2798  bytes 295384 (288.4 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 2798  bytes 295384 (288.4 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    

    此处我对enp49s0f1网卡做macvaln

  • 开始混杂模式ifconfig enp49s0f1 promisc   网卡混杂模式介绍以及有几种模式:

          网卡具有如下的几种工作模式:
         1) 广播模式(Broad Cast Model):它的物理地址(MAC)地址是 0Xffffff 的帧为广播帧,工作在广播模式的网卡接收广播帧。
         2)多播传送(MultiCast Model):多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收,而组外主机却接收不到。但是,如果将网卡设置为多播传送模式,它可以接收所有的多播传送帧,而不论它是不是组内成员。
         3)直接模式(Direct Model):工作在直接模式下的网卡只接收目地址是自己 Mac地址的帧。
         4)混杂模式(Promiscuous Model):工作在混杂模式下的网卡接收所有的流过网卡的帧,信包捕获程序就是在这种模式下运行的。
              网卡的缺省工作模式包含广播模式和直接模式,即它只接收广播帧和发给自己的帧。如果采用混杂模式,一个站点的网卡将接受同一网络内所有站点所发送的数据包这样就可以到达对于网络信息监视捕获的目的。     

 

 取消混杂模式ifconfig enp49s0f1 -promisc 注意是“-”符号

[root@localhost ~]# ifconfig enp49s0f1 -promisc
[root@localhost ~]# ifconfig enp49s0f1
enp49s0f1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 10.10.1.3  netmask 255.255.255.0  broadcast 10.10.1.255inet6 fe80::630d:9f6c:1f70:ee47  prefixlen 64  scopeid 0x20<link>ether d4:5d:64:07:a8:eb  txqueuelen 1000  (Ethernet)RX packets 872501  bytes 127974143 (122.0 MiB)RX errors 0  dropped 23717  overruns 0  frame 0TX packets 15533  bytes 1014464 (990.6 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0device memory 0xe6e00000-e6e1ffff
  • 既然有了多个mac地址,就可以设置多个IP地址了,从而实现,一块物理网卡链接到交换机,变成多个虚拟网卡链接到交换机。

  1. macvlan是linux kernel提供的一种network driver类型, 如何查看当前内核是否加载了该driver呢?
  • lsmod | grep macvlan (查看是否加载了)
  • modprobe macvlan (手动加载macvlan驱动到内核)
  • /drivers/net/macvlan.c (源码地址)

 02 macvlan 的工作原理

macvlan 是 Linux kernel 支持的新特性,支持的版本有 v3.9-3.19 和 4.0+,比较稳定的版本推荐 4.0+。它一般是以内核模块的形式存在,我们可以通过以下方法判断当前系统是否支持:

[root@localhost ~]# uname -a
Linux localhost.localdomain 4.18.0+ #1 SMP Thu Nov 19 16:39:22 CST 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# modprobe macvlan
[root@localhost ~]# lsmod | grep macvlan
macvlan                28672  0 
[root@localhost ~]# modinfo macvlan
filename:       /lib/modules/4.18.0+/kernel/drivers/net/macvlan.ko
alias:          rtnl-link-macvlan
description:    Driver for MAC address based VLANs
author:         Patrick McHardy <kaber@trash.net>
license:        GPL
rhelversion:    8.2
srcversion:     43A1B84175291054C98F5FD
depends:        
intree:         Y
name:           macvlan
vermagic:       4.18.0+ SMP mod_unload modversions

如果第一个命令报错,或者第二个命令没有返回,说明当前系统不支持 macvlan,需要升级内核。

macvlan 这种技术听起来有点像 VLAN,但它们的实现机制是完全不一样的。macvlan 子接口和原来的主接口是完全独立的,可以单独配置 MAC 地址和 IP 地址,而 VLAN 子接口和主接口共用相同的 MAC 地址。VLAN 用来划分广播域,而 macvlan 共享同一个广播域。

通过不同的子接口,macvlan 也能做到流量的隔离。macvlan 会根据收到包的目的 MAC 地址判断这个包需要交给哪个虚拟网卡,虚拟网卡再把包交给上层的协议栈处理。

03 四种模式man ip link(  ip link add link DEVICE name NAME type { macvlan | macvtap } mode { private | vepa | bridge | passthru  [ nopromisc ] | source })

根据 macvlan 子接口之间的通信模式,macvlan 有四种网络模式:

  • private 模式

  • vepa(virtual ethernet port aggregator) 模式

  • bridge 模式

  • passthru 模式

默认使用的是 vepa 模式。

3.1 private

这种模式下,同一主接口下的子接口之间彼此隔离,不能通信。即使从外部的物理交换机导流,也会被无情地丢掉。(子接口之间不可以通信,但是可以和父接口直接通信)

3.2 vepa

这种模式下,子接口之间的通信流量需要导到外部支持 802.1Qbg/VPEA 功能的交换机上(可以是物理的或者虚拟的{bridge}),经由外部交换机转发,再绕回来。

注: 802.1Qbg/VPEA 功能简单说就是交换机要支持 发夹(hairpin) 功能,也就是数据包从一个接口上收上来之后还能再扔回去。

3.3 bridge

这种模式下,模拟的是 Linux bridge 的功能,但比 bridge 要好的一点是每个接口的 MAC 地址是已知的,不用学习。所以,这种模式下,子接口之间就是直接可以通信的,也可以和父接口通信。

3.4 passthru

这种模式,只允许单个子接口连接主接口,且必须设置成混杂模式,一般用于子接口桥接和创建 VLAN 子接口的场景。

3.5 mactap 没有mactun这样的设备 tun属于三层。mac开头的都是2层

和 macvlan 相似的技术还有一种是 mactap。和 macvlan 不同的是,mactap 收到包之后不是交给协议栈,而是交给一个 tapX 文件/dev/net/tapX,然后通过这个文件,完成和用户态的直接通信。

04 实践

在 Linux 系统下,创建 macvlan 的命令形式如下:

在 Linux 系统下,创建 macvlan 的命令形式如下:

 
  1. ip link add link DEVICE name NAME type { macvlan | macvtap } mode { private | vepa | bridge | passthru [ nopromisc ] }

通常,单独使用 macvlan 毫无意义,一般都是结合 VM 和容器来构建网络。下面我们就简单使用 namespace 来看看 Linux 是怎么使用 macvlan 的。

namespace :ip netns add ns1  也代表的是一个网络空间 ns1 就是代表一个vm或容器。但也只是网络隔离,没有pid,进程,相关的隔离

Linux Namespace

Linux Namespace(命名空间)是一种操作系统层级的资源隔离技术,能够将 Linux 的全局资源,划分为 namespace 范围内的资源,而且不同 namespace 间的资源彼此透明,不同 namespace 里的进程无法感知到其它 namespace 里面的进程和资源。

Linux namespace 实现了 6 项资源隔离,基本上涵盖了一个小型操作系统的运行要素,包括主机名、用户权限、文件系统、网络、进程号、进程间通信。Linux Namespace 是操作系统虚拟化技术(e.g. 容器)的底层实现支撑。

在这里插入图片描述

Linux Namespace 的类型

  • UTS namespace 提供了 hostname 和 domain 的隔离,这样每个容器就拥有独立的主机名和域名了,在网络上就可以被视为一个独立的节点,在容器中对 hostname 的命名不会对宿主机造成任何影响。

  • PID namespace 完成的是进程号的隔离,保证了容器的 init 进程是以 1 号进程来启动的。

  • IPC namespace 实现了进程间通信的隔离,包括常见的几种进程间通信机制,例如:信号量,消息队列和共享内存。我们知道,要完成 IPC,需要申请一个全局唯一的标识符,即 IPC 标识符,所以 IPC 资源隔离主要完成的就是隔离 IPC 标识符。

  • Mount namespace 通过隔离文件系统的挂载点来达到对文件系统的隔离。保证了容器看到的文件系统的视图,是容器镜像提供的一个文件系统,也就是说它看不见宿主机上的其它文件,除了通过 -v 参数 bound 的那种模式,是可以把宿主机上面的一些目录和文件,让它在容器里面可见的;

  • Network namespace 实现了操作系统层面的网络资源隔离,包括网络设备接口、IPv4 和 IPv6 协议栈,IP 路由表,防火墙,/proc/net 目录,/sys/class/net 目录,Sockets 套接字等资源。同一个网络设备只能位于一个 Network namespace 中,不同 namespace 中的网络设备可以利用 veth pair 进行桥接。

  • User namespace 主要隔离了安全相关的标识符和属性,包括 User ID、User Group ID、root 目录、key 以及特殊权限。

实际上,还有第 7 个是 cgroup namespace。Docker 中用到了前六种,第 7 种 cgroup namespace 在 Docker 本身并没有用到,但是在 runC 实现中实现了 cgroup namespace。用 cgroup namespace 带来的一个好处是容器中看到的 cgroup 视图是以根的形式来呈现的,这样的话就和宿主机上面进程看到的 cgroup namespace 的一个视图方式是相同的,另外一个好处是让容器内部使用 cgroup 会变得更安全。

实验拓扑如下:

在我的系统中,以接口 enp0s8 为例创建两个 macvlan 子接口(使用 bridge 模式),配置 IP 并将其挂到两个 namespace 中,测试连通性。

# 创建两个 macvlan 子接口
[root@localhost ~]# ip link add link enp49s0f1 dev mac1 type macvlan mode bridge
[root@localhost ~]# ip link add link enp49s0f1 dev mac2 type macvlan mode bridge
[root@localhost ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp49s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000link/ether d4:5d:64:07:a8:ea brd ff:ff:ff:ff:ff:ff
3: enp49s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000link/ether d4:5d:64:07:a8:eb brd ff:ff:ff:ff:ff:ff
110: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default link/ether 02:42:03:f4:36:a8 brd ff:ff:ff:ff:ff:ff
115: mac1@enp49s0f1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000link/ether 76:1e:ff:99:9c:d8 brd ff:ff:ff:ff:ff:ff
116: mac2@enp49s0f1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000link/ether 8e:45:af:31:ca:ca brd ff:ff:ff:ff:ff:ff# 创建两个 namespace
[root@localhost ~]# ip netns add ns1
[root@localhost ~]# ip netns add ns2
[root@localhost ~]# ip netns list
ns2
ns1# 将两个子接口分别挂到两个 namespace 中
[root@localhost ~]# ip link set dev mac1 netns ns1
[root@localhost ~]# ip link set dev mac2 netns ns2
[root@localhost ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp49s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000link/ether d4:5d:64:07:a8:ea brd ff:ff:ff:ff:ff:ff
3: enp49s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000link/ether d4:5d:64:07:a8:eb brd ff:ff:ff:ff:ff:ff
110: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default link/ether 02:42:03:f4:36:a8 brd ff:ff:ff:ff:ff:ff# 配置 IP 并启用 ip netns exec ns1 dhclient mac1或ip netns exec ns1 ip address add 10.10.1.20/24 dev mac1   注: enp49s0f1  的 IP 是 10.10.1.20/24,配置的子接口 IP 也必须是同一网段的。
[root@localhost ~]# ip netns exec ns1 dhclient mac1 
dhclient(38370) is already running - exiting.                       说名pid进程没有隔离This version of ISC DHCP is based on the release available
on ftp.isc.org.  Features have been added and other changes
have been made to the base software release in order to make
it work better with this distribution.Please report for this software via the CentOS Bugs Database:http://bugs.centos.org/exiting.
[root@localhost ~]# kill -9 38370   杀死dhclient进程
[root@localhost ~]# ip netns exec ns1 dhclient mac1
[root@localhost ~]# ip netns exec ns2 dhclient mac2
dhclient(113930) is already running - exiting.                       说名pid进程没有隔离This version of ISC DHCP is based on the release available
on ftp.isc.org.  Features have been added and other changes
have been made to the base software release in order to make
it work better with this distribution.Please report for this software via the CentOS Bugs Database:http://bugs.centos.org/exiting.
[root@localhost ~]# kill -9 113930
[root@localhost ~]# ip netns exec ns2 dhclient mac2
[root@localhost ~]# ip netns exec ns1 ip link set dev mac1 up
[root@localhost ~]# ip netns exec ns2 ip link set dev mac2 up
[root@localhost ~]# ip netns exec ns1 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
115: mac1@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000link/ether 76:1e:ff:99:9c:d8 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 10.10.1.127/24 brd 10.10.1.255 scope global dynamic mac1valid_lft 86351sec preferred_lft 86351secinet6 fe80::741e:ffff:fe99:9cd8/64 scope link valid_lft forever preferred_lft forever
[root@localhost ~]# ip netns exec ns2 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
116: mac2@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000link/ether 8e:45:af:31:ca:ca brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 10.10.1.115/24 brd 10.10.1.255 scope global dynamic mac2valid_lft 86365sec preferred_lft 86365secinet6 fe80::8c45:afff:fe31:caca/64 scope link valid_lft forever preferred_lft forever
[root@localhost ~]#

完了两个子接口 ping 一下:ping自己不通,ping其他子接口和父接口父接口的网关都是通的 

[root@localhost ~]# ip netns exec ns1 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
115: mac1@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000link/ether 76:1e:ff:99:9c:d8 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 10.10.1.127/24 brd 10.10.1.255 scope global dynamic mac1valid_lft 86065sec preferred_lft 86065secinet6 fe80::741e:ffff:fe99:9cd8/64 scope link valid_lft forever preferred_lft forever
[root@localhost ~]# ip netns exec ns2 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
116: mac2@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000link/ether 8e:45:af:31:ca:ca brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 10.10.1.115/24 brd 10.10.1.255 scope global dynamic mac2valid_lft 86078sec preferred_lft 86078secinet6 fe80::8c45:afff:fe31:caca/64 scope link valid_lft forever preferred_lft forever
[root@localhost ~]# ip netns exec ns1 ping 10.10.1.115
PING 10.10.1.115 (10.10.1.115) 56(84) bytes of data.
64 bytes from 10.10.1.115: icmp_seq=1 ttl=64 time=0.095 ms
^C
--- 10.10.1.115 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.095/0.095/0.095/0.000 ms
[root@localhost ~]# ip netns exec ns1 ping 10.10.1.127
PING 10.10.1.127 (10.10.1.127) 56(84) bytes of data.
^C
--- 10.10.1.127 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms[root@localhost ~]# ip netns exec ns1 ping 10.10.1.1
PING 10.10.1.1 (10.10.1.1) 56(84) bytes of data.
64 bytes from 10.10.1.1: icmp_seq=1 ttl=255 time=4.37 ms
^C
--- 10.10.1.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 4.375/4.375/4.375/0.000 ms
[root@localhost ~]# ip netns exec ns1 ping 10.10.1.2
PING 10.10.1.2 (10.10.1.2) 56(84) bytes of data.
64 bytes from 10.10.1.2: icmp_seq=1 ttl=64 time=0.172 ms
^C
--- 10.10.1.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.172/0.172/0.172/0.000 ms

可以看到,能够 ping 通,如果把上面的 mode 换成其他模式就行不通了,这个就留给大家去实验了(默认是 vepa 模式)。

另外,在 docker 中,macvlan 是一种较为重要的跨主机网络模型,这块的内容就留作下篇文章再做讲解了。https://blog.csdn.net/Michaelwubo/article/details/110483589

经过确认可以知道mac1与mac2都正确分配到了网段10.10.1.0/24中的地址。创建的虚拟网卡既可以给本地宿主机使用,也可以指定宿主机上创建的虚拟机。

macvlan作用

        从以上的创建步骤可以看出,macvlan并没有创建网络,只是虚拟了网卡,共享了物理网卡所连接的外部网络,它的效果与桥接模式是一样的。网络虚拟化的目的就是在多租户场景,在统一的低层网络之上,单独为每个租户虚拟出自己的网络从而达到隔离的目的。macvlan既然不创建网络,又有什么用处呢?答案是效率,它是效率最高的跨主机网络虚拟化解决方案之一。vlan与vxlan方案中涉及到的虚拟化设备:

1.tap设备,就是虚拟机的网卡。

2.bridge设备,宿主机内的网络。

3.vlan/vxlan设备。

而macvlan只涉及到一个虚拟设备macvlan。可以看出,macvlan方案涉及到的虚拟设备更少,数据包处理所经过的点就更少,效率就更高。macvlan会出现在一些对网络性能要求极高的场景下.

05 总结

macvlan 是一种网卡虚拟化技术,能够将一张网卡虚拟出多张网卡。

macvlan 的四种通信模式,常用模式是 bridge。

思考一下:

  1. macvlan bridge 和 bridge 的异同点?  

  2. 还有一种类似的技术,多张虚拟网卡共享相同 MAC 地址,但有独立的 IP 地址,这是什么技术?这是vlan技术,vlan和macvlan区别

参考

https://mp.weixin.qq.com/s?__biz=MzI1OTY2MzMxOQ==&mid=2247485246&idx=1&sn=c42a3618c357ebf5f6b7b7ce78ae568f&chksm=ea743386dd03ba90ad65940321385f68f9315fec16d82a08efa12c18501d8cadf95cf9e614a2&scene=21#wechat_redirect

https://www.jianshu.com/p/2b8b6c738bf6

https://blog.csdn.net/dkfajsldfsdfsd/article/details/79525187

 

 

 

 

 

 

 

 

这篇关于macvlan和macvtap介绍和使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/331900

相关文章

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min