嘗試建立先前是虛擬的 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
    

相關內容