首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RTNETLINK“文件存在”错误当试图创建以前是虚拟的veth接口时

问RTNETLINK“文件存在”错误当试图创建以前是虚拟的veth接口时
EN

Unix & Linux用户
提问于 2021-10-29 14:56:39
回答 1查看 963关注 0票数 1

Linux 20.2

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

代码语言:javascript
复制
sudo ip link add veth0 type dummy

完成后,我删除了它:

代码语言:javascript
复制
sudo ip link delete veth0 type dummy

接口确实被删除了。重新启动之后,我尝试创建一个虚拟以太网类型接口:

代码语言:javascript
复制
sudo ip link add veth0 type veth

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

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

我的研究已经出现了很多类似的文章,但是它们都提到了物理接口不能使用ifup命令的问题。修复方法是刷新接口上的地址,并确保不超过/etc/network/接口中列出的一个网关。这两种方法都不适用。在删除之前的接口类型之后,我没有发现虚拟接口名称对于不同的接口类型是不可重用的。

我意识到我可以使用一个不同的接口名称,但我想解决这个配置问题,并了解是什么原因造成的。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2021-10-31 19:22:27

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

当不为对等接口指定名称时,最低可能的接口被追加到veth中,以便首先构建对等名称。这首先发生在创建主接口之前。当指定一个不能冲突的名称时,可以看到这一点:

代码语言:javascript
复制
# 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:

代码语言:javascript
复制
$ ip link monitor

空壳2:

代码语言:javascript
复制
# ip link add name veth0 type veth
RTNETLINK answers: File exists

空壳1再次:

代码语言:javascript
复制
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链路添加类型veth let : 24: veth0@veth1:<广播,多播,M- DOWN > mtu 1500 qdisc noop状态下组默认链接/以太2a:93:93:F8:8e:bc:B6 brd ff:ff 25: veth 1@veth 0:<广播,多播,mtu >mtu 1500 group状态下组默认链接/醚86:70:54:05:0f:75 bc:ff
  • 指定不遵循默认命名方案的名称ip链接添加名称myveth类型veth
  • 或者指定两个名称,即使它们不是默认的顺序,它们也将由内核在其默认命名方案中创建(对等名为veth0,主名称为veth1):ip链接添加名称veth0类型veth1 veth1
  • 不要忘记,在网络命名空间环境之外,veth接口在大多数情况下(但并不总是)是无用的。如果需要,对等接口可以直接添加到其他地方: ip添加其他名称空间、ip链接、添加名称、veth0类型、对等网、其他名称空间,其中对等点也将被创建为veth0,而不会发生任何冲突。# ip链接显示类型veth 27: veth0@if2:< MULTICAST> mtu 1 500 group状态下模式默认组默认qlen 1000链接/以太2a:93:f8:8e:bc:b6 brd ff:ff链接-netns# ip -n -n命名空间#ip-n其他命名空间链接显示类型veth 2: veth0@if27:< MULTICAST> mtu 1 500 qdisc noop默认组默认qlen 1000链接/醚fa:bf:23:fc:ff链接-netnsid 0
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/675317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档