Ubuntu 上“ip address”命令(或“ip link”命令)输出中的接口名称中的 at 符号 (@) 有何含义,例如以下输出中的接口名称“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
答案1
这表示链路的对等接口索引。尽管此属性似乎适用于任何接口,但它仅对少数接口类型有意义:veth、macvlan、vlan(子接口)...,因为它们与其他接口有关系。
任何给定的接口都有一个可以读取的索引,例如:
/sys/class/net/<interface>/ifindex
可以在那里读取其对等链接接口:
/sys/class/net/<interface>/iflink
显然,如果没有意义,该参数仍然存在,但与索引。通常的普通或简单接口就是这种情况(真实硬件 eth0、wlan0、dummy0,...)
这ip link
命令只是解释链接价值:
- 如果链接是 0 (显然对于 ipip 隧道,它对于网络命名空间也表现得很奇怪),它将打印
@NONE
- 如果链接没有匹配的索引,它将显示
@ifXX
为XX
显示索引。没有匹配的索引足以知道它与其他网络命名空间相关,请参阅稍后。 - 如果链接本身就是(链接==索引)它不会显示任何
@
。这就是真实接口(eth0 ...)应该发生的情况,但也可能是一个错误(见下文)。 - 如果链接有一个匹配的索引,它将显示该索引的名称。
什么时候找不到匹配的索引?当该接口位于其他网络命名空间。这是因为link-netnsid
结果末尾附加的 。该值在外部不容易获得ip link
(请参阅此问答:如何找到 veth 对等点 ifindex 的网络命名空间?)。它代表的是本地分配对应对等网络命名空间的 nsid。对于容器来说,第一个(也可能是唯一的)值 0 几乎总是代表主机的网络命名空间。对于主机来说,每个容器可能会有一个 link-netnsid 值,第一个容器的 link-netnsid 为 0。请注意,该值是 net 命名空间的本地值,而不是绝对 id,因此不能直接比较两个网络命名空间之间(参见上一个链接)。
所以没有找到一个索引当然意味着它位于其他名称空间中。这是通过财产的存在来证实的link-netnsid
。
有时,链接,即为索引值同行接口在其他网络命名空间中时,恰好与本地接口(在当前网络命名空间中)具有相同的 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 链接。 (除非有中间不可见的网络命名空间)。