我正在使用netplan
20.04 (Focal) 并且只想匹配其中一个节中的物理 if。
如果我使用:
ethernets:
dmz0:
match:
macaddress: b8:a3:86:70:cc:e6
name: dmz*|en*
set-name: dmz0
它会抱怨Cannot find unique matching interface for dmz0
并且不匹配,如果我没有匹配,那么name
在创建 v-dev 后它也会做同样的事情。
$ ip l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: dmz0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether b8:a3:86:70:cc:e6 brd ff:ff:ff:ff:ff:ff
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether f0:4d:a2:25:df:d0 brd ff:ff:ff:ff:ff:ff
匹配(不带name
)在启动时起作用,这就是我获取创建防火墙规则等所需的 i/f 名称的方式。
匹配(无论哪种方式)以后都不起作用(netplan try|apply
),因为 VLan 和网桥采用与物理接口相同的 MAC 地址。我需要重置 netplan 配置,因为服务(以及相关的 v-devs)会来来去去。
对于如何实现稳定、可重复的匹配,您有什么建议吗?
答案1
正如您正确发现的那样,如果配置了(并采用相同的 MAC 地址),macaddress
仅进行匹配是不够的。vlans
不幸的是,netplan 目前不支持完整的 RegEx 匹配,而仅支持 shell 样式的 glob 匹配。因此,您的 name 匹配中的运算符无法按预期工作,并且"|"
找不到接口。目前有一个开放的 pull request 来改善这种情况,以便将来进行匹配:driver
name
https://github.com/canonical/netplan/pull/202
现在你可能需要将你的比赛分成两部分,以达到预期的效果:
ethernets:
id0:
match:
macaddress: b8:a3:86:70:cc:e6
name: dmz*
set-name: dmz0
id1:
match:
macaddress: b8:a3:86:70:cc:e6
name: en*
set-name: dmz0
答案2
我知道这个问题有点老了,可能你已经找到了解决方案并继续前进了。以下仅供将来的我参考:
对我来说最有效的方法是同时使用driver
匹配。因为物理接口的驱动程序与虚拟接口不同。以下是我的服务器中的一些示例。
# /etc/netplan/01-persistent-net.yaml
network:
version: 2
renderer: networkd
ethernets:
ens160:
match:
macaddress: 00:50:56:bc:80:f4
driver: vmxnet3
set-name: ens160
或者
# /etc/netplan/01-persistent-net.yaml
network:
version: 2
renderer: networkd
ethernets:
intf_eth2:
match:
macaddress: 00:e0:4c:68:05:6a
driver: r8152
set-name: intf_eth2
intf_eth3:
match:
macaddress: 00:e0:4c:68:0e:95
driver: r8152
set-name: intf_eth3