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 as
veth0
和 main asveth1
):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