Ubuntu上“ip地址”命令輸出中的介面名稱中的“if1@if2”是什麼意思
符號 (@) 在 Ubuntu 上的“ip address”命令(或“ip link”命令)的輸出中的介面名稱中是什麼意思,例如以下輸出中的介面名稱“eth0@if44”:
root@aafa1fc24a0b:/# ip address 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1 link/ipip 0.0.0.0 brd 0.0.0.0 3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1 link/tunnel6 :: brd :: 43: eth0@if44: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0 valid_lft forever preferred_lft forever
其他相關資訊:
- 這是在 Ubuntu 16.04 上
- 在 docker 容器內執行
- 容器附加到使用者定義的網橋
- 有問題的介面 (eth0@if44) 不是 VLAN
設置創建如下:
docker network create my-bridge docker run --name my-container-1 --network my-bridge --detach --tty ubuntu:16.04 sleep infinity docker run --name my-container-2 --network my-bridge --detach --tty ubuntu:16.04 sleep infinity
這表示鏈路的對等介面索引。儘管此屬性似乎可用於任何介面,但僅對少數介面類型有意義:veth、macvlan、vlan(子介面)……因為它們與其他介面有關係。
任何給定的介面都有一個可以讀取的索引,例如:
/sys/class/net/<interface>/ifindex
它的對等鏈路介面可以在那裡讀取:
/sys/class/net/<interface>/iflink
顯然,如果它沒有意義,該參數仍然存在,但與ifindex相同。對於通常的普通或簡單介面(真正的硬體 eth0、wlan0、dummy0,…),情況就是如此
這些
ip link
命令只解釋iflink值:
- 如果iflink為 0(顯然對於 ipip 隧道,它在網路名稱空間中的行為也很奇怪),它將列印
@NONE
- 如果iflink沒有匹配的 ifindex,它將顯示
@ifXX
為XX
ifindex 。沒有匹配的ifindex就足以知道它與其他網路命名空間相關,請參見下文。- 如果iflink是它本身 ( iflink == ifindex ) 它不會顯示任何東西
@
。這就是真實介面(eth0 …)應該發生的事情,但也可能是一個錯誤(見下文)。- 如果iflink有一個匹配的ifindex,它將顯示這個索引的名稱。
什麼時候找不到匹配的ifindex?當該介面位於其他網路命名空間中時。這是已知的,因為
link-netnsid
附加在結果的末尾。該值在外部不容易獲得ip link
(請參閱此 Q/A:如何找到 veth 對等點 ifindex 的網路命名空間?)。它表示本地分配的對應對等網路命名空間的 nsid。對於容器,第一個(也可能是唯一的)值 0 幾乎總是代表主機的網路命名空間。對於主機,每個容器可能會有一個 link-netnsid 值,第一個容器的 link-netnsid 為 0。注意這個值是 net 命名空間的本地值,不是絕對 id,所以不能直接比較在兩個網路命名空間之間(參見上一個連結)。所以找不到ifindex肯定意味著它在另一個命名空間中。
link-netnsid
財產的存在證實了這一點。有時iflink,即對等介面的索引值,在另一個網路命名空間中時,恰好與本地介面(在目前網路命名空間中)具有相同的 id。
ip link
在這種情況下不會顯示任何@
內容,其邏輯是它是一個通用介面,但這是錯誤的,如本例所示:# ip -o link show dev veth1 3: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000\ link/ether 7e:d9:ca:77:87:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0 # cat /sys/class/net/veth1/{ifindex,iflink} 3 3
(請注意
link-netnsid 0
連結位於其他網路名稱空間中的含義。)在其他情況下(我沒有設法重現,因此可能已更正)它甚至可能使用其他網路名稱空間索引顯示本地介面名稱。
對於您的範例,如果您在主機上執行(而不是在容器中):
ip -o link |grep ^44:
. 您肯定會找到索引為 44 的介面,這是對等點的 veth 連結。(除非有一個中間不可見的網路命名空間)。