尝试创建以前是虚拟的 veth 接口时,RTNETLINK“文件存在”错误

尝试创建以前是虚拟的 veth 接口时,RTNETLINK“文件存在”错误

Linux 薄荷 20.2

我使用此命令创建一个名为 veth0 的虚拟以太网接口:

sudo ip link add veth0 type dummy

完成后我将其删除:

sudo ip link delete veth0 type dummy

该接口肯定被删除了。重新启动后,我尝试使用以下命令创建虚拟以太网类型接口:

sudo ip link add veth0 type veth

但是当我这样做时,我收到“文件存在”错误。

它确实允许我再次使用第一个命令重新创建虚拟类型接口。它在哪里引用接口名称以防止其被重新用作虚拟以太网类型?

我的研究提出了很多类似的帖子,但它们通常都提到了物理接口无法使用 ifup 命令的问题。解决方法是刷新接口上的地址,并确保 /etc/network/interfaces 中列出的网关不超过一个。这两个修复均不适用于此处。我没有发现任何关于虚拟接口名称在删除前一个类型后不能重新用于不同接口类型的信息。

我意识到我可以使用不同的接口名称,但我想解决这个配置问题并了解导致它的原因。

答案1

此问题是可重现的,但这是由于选择的名称干扰了内核所做的默认选择。

当未指定对等接口的名称时,将附加尽可能小的整数来veth构建对等名称第一的。这首先发生在创建主界面本身之前。当指定一个不能冲突的名称时可以看到这一点:

# ip link add name myveth type veth
# ip link show type veth
17: veth0@myveth: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 2a:93:f8:8e:bc:b6 brd ff:ff:ff:ff:ff:ff
18: myveth@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 8a:c3:1d:82:93:a6 brd ff:ff:ff:ff:ff:ff

按照通常的方式选择对等名称:创建一个接口,并附加其类型和下一个可用整数:veth+ 0: veth0。较低的索引(此处为 17 与 18)意味着它是先创建的。

现在,如果指定的名称与内核首先自动创建的名称完全相同,则会发生冲突,不会创建指定的接口,并且对等接口将被删除。除了一个 之外没有任何痕迹RTNETLINK answers: File exists。在单独的 shell 中运行时可以清楚地看到这一点ip link monitor

外壳1:

$ ip link monitor

外壳2:

# ip link add name veth0 type veth
RTNETLINK answers: File exists

再次外壳1:

23: veth0@NONE: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether 72:2d:b8:9f:90:6c brd ff:ff:ff:ff:ff:ff
Deleted 23: veth0@NONE: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether 72:2d:b8:9f:90:6c brd ff:ff:ff:ff:ff:ff

@NONE意味着还没有关联的对等链接索引。接口veth确实有对等链路索引:虚拟以太网线路的另一侧。它应该已将对等链路索引解析为刚刚使用索引 24 创建的下一个接口,但随后无法使用该名称创建该接口,veth0因为它已经存在(即使这是因为它自己创建的)。这会触发整个操作的取消和临时的删除veth0以及作为 发回的错误消息File exists,否则不会留下任何问题的痕迹。

结论:为了避免任何冲突,

  • 不要指定任何名称并让内核选择它们:

    ip link add type veth
    

    得到:

    24: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default 
        link/ether 2a:93:f8:8e:bc:b6 brd ff:ff:ff:ff:ff:ff
    25: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default 
        link/ether 86:70:54:05:0f:75 brd ff:ff:ff:ff:ff:ff
    
  • 指定不遵循默认命名方案的名称

    ip link add name myveth type veth
    
  • 或指定两个名称,即使它们不是内核按照默认命名方案创建的默认顺序(peer asveth0和 main as veth1):

    ip link add name veth0 type veth peer name veth1
    
  • 不要忘记veth接口在大多数情况下(但并非总是)在网络命名空间环境之外毫无用处。如果需要,对等接口可以直接添加到其他地方:

    ip netns add othernamespace
    ip link add name veth0 type veth peer netns othernamespace
    

    其中对等点也将在没有任何冲突的情况下被创建veth0

    # ip link show type veth
    27: veth0@if2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
        link/ether 2a:93:f8:8e:bc:b6 brd ff:ff:ff:ff:ff:ff link-netns othernamespace
    # ip -n othernamespace link show type veth
    2: veth0@if27: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
        link/ether fa:cb:bf:23:fc:a6 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    

相关内容