创建macvlan的命令

本文命令参考来源于:

http://manpages.ubuntu.com/manpages/bionic/man8/ip-link.8.html

一、macvlan或macvtap 命令格式

添加 macvlan或macvtap 命令如下

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


# 举例:现有网卡名称为ens33,创建macvlan类型的,名为ens33.1的 网卡
ip link add link ens33 name ens33.1 type macvlan mode bridge

type {macvlan | macvtap}

指定即将创建link的类型。macvlan仅创建虚拟网卡,macvtap除了创建虚拟网卡,还创建字符设备(character device)  /dev/tapX,该字符设备就和tuntap设备类似。

假设

  1. 物理网卡为p
  2. 在这一张物理网卡上,创建了两个macvlan网卡,分别为m1和m2。

定好以上前提,我们描述下面5种模式

1. mode private

m1和m2直接无法通信,即使外部交换机支持hairpin模式,m1和m2也无法通信。

为什么提到外部交换机呢?因为:macvlan是二层,都连在同一个交换机上。这里的意思是说即使p所连接到的交换机支持hairpin,m1和m2也无法通信。

2. mode vepa(虚拟以太网端口聚合模式)。默认

m1和m2之间的数据传输,总是走p。p连接的交换机必须要能支持hairpin模式,或p连接到路由器(路由器都支持包转发的)。

3. mode bridge

所有终端都两两相连。通信无需p转发。

4. mode passthru [nopromisc]

该模式赋予单个终端更多能力,经常用在macvtap下。在此模式下,同一张物理网卡只允许单一一个终端。全部流量都被转发到该终端,允许virtio guest更改MAC地址,或设置promiscuous 模式,以支持对网卡进行桥接或在网卡上创建vlan接口。

默认情况下,该模式强制网卡进入promiscuous模式。传入nopromisc 标志可以禁止进入promiscuous模式。

5. mode source

该模式允许设置所允许的MAC地址列表,从底层的网卡收到frame时,对比frame中的source字段。这使得可以创建基于MAC地址的VLAN,而不是基于标准端口(port)或标记(tag)的VLAN。在部署基于 802.1x MAC的行为时,由于底层网卡的驱动不支持基于MAC的VLAN,此时mode source就很有用啦。

二、我们来试试

我们通过创建network namespace来试验下。

macvlan网卡的IP和物理网卡的IP必须位于同一个网段,在我们的例子中:

物理网卡为ens33,其IP为 192.168.86.205

两个macvlan的IP分别为:192.168.86.101 和 192.168.86.102

# 创建 macvlan网卡

sudo ip link del dev ens33.1

sudo ip link add link ens33 name ens33.1 type macvlan mode bridge

# 创建 namespace

sudo ip netns del ns1

sudo ip netns add ns1

# 将子接口挂到 namespace

sudo ip link set ens33.1 netns ns1

# 配置 IP 并启用

sudo ip netns exec ns1 ip addr add 192.168.86.101/24 dev ens33.1

sudo ip netns exec ns1 ip link set ens33.1 up

配置完成后,ns1中的配置如下

marvin@vm205:~$ sudo ip netns exec ns1 ip -c addr 
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
43: ens33.1@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether c2:bf:47:28:89:f1 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.86.101/24 scope global ens33.1
       valid_lft forever preferred_lft forever
    inet6 fe80::c0bf:47ff:fe28:89f1/64 scope link 
       valid_lft forever preferred_lft forever
marvin@vm205:~$ sudo ip netns exec ns1 ip -c route
192.168.86.0/24 dev ens33.1 proto kernel scope link src 192.168.86.101 
marvin@vm205:~$ 

#同样的,配置起来第二个macvlan网卡

# ens33.2
sudo ip link del dev ens33.2
sudo ip link add link ens33 name ens33.2 type macvlan mode bridge

sudo ip netns del ns2
sudo ip netns add ns2
sudo ip link set ens33.2 netns ns2
sudo ip netns exec ns2 ip addr add 192.168.86.102/24 dev ens33.2
sudo ip netns exec ns2 ip link set ens33.2 up

看下效果:

marvin@vm205:~$ sudo ip netns exec ns2 ping 192.168.86.101
PING 192.168.86.101 (192.168.86.101) 56(84) bytes of data.
64 bytes from 192.168.86.101: icmp_seq=1 ttl=64 time=0.124 ms
....
^C
--- 192.168.86.101 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4092ms
rtt min/avg/max/mdev = 0.028/0.049/0.124/0.037 ms
marvin@vm205:~$ sudo ip netns exec ns1 ping 192.168.86.102
PING 192.168.86.102 (192.168.86.102) 56(84) bytes of data.
64 bytes from 192.168.86.102: icmp_seq=1 ttl=64 time=0.021 ms
....
^C
--- 192.168.86.102 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2056ms
rtt min/avg/max/mdev = 0.021/0.026/0.030/0.004 ms
marvin@vm205:~$ 

mode bridge,通

mode private,不通

mode vepa,不通

(可能是由于我的物理网卡所连接到的交换机192.168.86.2,不支持hairpin模式)

完 

### SQL 中获取字符串长度的函数 不同类型的数据库管理系统 (DBMS) 提供不同的内置函数来计算字符串长度。以下是几种常见 DBMS 获取字符串长度的方式: #### MySQL 对于MySQL而言,`CHAR_LENGTH(str)` 是用来计算给定字符串 `str` 中字符的数量[^1]。 ```sql SELECT CHAR_LENGTH('a好的'); ``` 这段代码会返回数值 3,表示该字符串由三个字符组成。 #### SQL Server 在SQL Server环境中,存在两个主要函数用于测量字符串长度:`LEN()` 和 `DATALENGTH()`。其中,`LEN()` 函数返回的是字符数量,而不论这些字符是单字节还是多字节编码形式;相反地,如果想要得到实际占用存储空间大小,则应该采用 `DATALENGTH()` 函数[^2]。 ```sql -- 使用 LEN() 函数获得字符数目 SELECT LEN(N'我是一名教师'); -- 使用 DATALENGTH() 函数获得字节数目 SELECT DATALENGTH(N'我是一名教师'); ``` 上述第一个查询将给出结果为6,因为这里只统计了汉字个数而不考虑其内部编码方式所占的空间量。第二个查询则显示12作为输出值,这是因为每个Unicode字符通常占据两个字节。 #### Oracle Database Oracle提供了两种方法来衡量字符串长度:`LENGTH()` 和 `LENGTHB()` 。前者类似于其他系统的标准做法—按字符计数;后者则是基于字节而非字符来进行度量,在处理包含非ASCII字符的数据集时尤为有用[^4]. ```sql -- LENGTH(): 按照字符计算长度 SELECT LENGTH('string') FROM dual; -- LENGTHB(): 按照字节计算长度 SELECT LENGTHB('string') FROM dual; ``` 通过以上介绍可以看出,尽管各个平台之间存在一定差异,但总体上都具备相应机制以满足开发者需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值