red*_*0ct 11 linux networking ethernet iproute network-interface
在Linux中,有什么区别离职后ip link down
-condition和真正的链接不存在(例如交换机的端口被烧毁,或者有人绊到电线)。
我所说的差异是指系统中可以用来区分这两种情况的一些标志。
例如,在这两种情况下路由表是否相同?将ethtool
或其他东西显示相同的东西?是否有一些工具/实用程序可以区分这些条件?
管理上打开但断开连接或管理上关闭的接口之间存在差异。
接口获得运营商关闭状态。它的正确处理可能取决于接口的驱动程序和内核版本。通常它可以与ip link show
. 例如使用虚拟以太网veth接口:
# ip link add name vetha up type veth peer name vethb
# ip link show type veth
2: vethb@vetha: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 02:a0:3b:9a:ad:4d brd ff:ff:ff:ff:ff:ff
3: vetha@vethb: <NO-CARRIER,BROADCAST,MULTICAST,UP,M-DOWN> mtu 1500 qdisc noqueue state LOWERLAYERDOWN mode DEFAULT group default qlen 1000
link/ether 36:e3:62:1b:a8:1f brd ff:ff:ff:ff:ff:ff
Run Code Online (Sandbox Code Playgroud)
vetha本身在管理上NO-CARRIER
处于UP 状态,显示和等效的操作状态 LOWERLAYERDOWN
标志:它已断开连接。
也/sys/
存在等效条目:
# cat /sys/class/net/vetha/carrier /sys/class/net/vetha/operstate
0
lowerlayerdown
Run Code Online (Sandbox Code Playgroud)
在通常的设置中,对于管理性向上的接口,运营商和操作状态匹配(NO-CARRIER <=> LOWERLAYERDOWN 或 LOWER_UP <=> UP)。一个例外是例如使用 IEEE 802.1X 身份验证时(operstate 的高级详细信息在此内核文档中进行了描述:Operational States,但本解释不需要它)。
ethtool
查询较低级别的 API 以检索相同的运营商状态。
没有运营商不会阻止任何第 3 层设置保持有效。发生这种情况时,内核不会更改地址或路由。只是最终应该发出的数据包不会被接口发出,当然也不会有回复。因此,例如尝试连接到其他 IPv4 地址迟早会再次触发 ARP 请求,该请求将失败,并且应用程序将收到“没有到主机的路由”。已建立的 TCP 连接只会等待时间并保持建立。
上述vethb具有operstate DOWN和不显示任何载波状态(因为其具有将高达检测此。当然的物理以太网接口行为相同)。
当接口关闭 ( ip link set ... down
) 时,无法再检测到载体,因为底层硬件设备很可能已关闭电源并且操作状态变为“关闭”。ethtool
只会说也没有链接,因此不能可靠地用于此(它肯定也会显示一些未知条目,但是否有可靠的方案?)。
这次这将对第 3 层网络设置产生影响。内核将拒绝使用此接口添加路由,并将删除任何先前与之相关的路由:
proto kernel
添加地址时添加的自动 ( ) LAN 路由scope link
) 或其他先前删除的路由(可能那时scope global
)。因为当界面恢复时这些不会重新出现 ( ip link set ... up
) 它们会丢失,直到用户空间工具将它们添加回来。在使用 NetworkManager 等最近的工具时,人们可能会感到困惑,认为断开连接类似于接口关闭。那是因为 NM 会监控链接,并会在此类事件发生时采取行动。要了解该ip monitor
工具可用于从脚本进行监控,但它目前没有稳定/可解析的输出(没有可用的 JSON 输出),因此它的使用受到限制。
因此,当线路断开时,NM 很可能会认为它不再使用当前配置,除非特定设置阻止它:然后它会删除地址和路由本身。当线路重新连接时,NM 将再次应用其配置:添加回地址和路由(如果相关,使用 DHCP)。这看起来一样,但不是。一直以来,接口都保持正常,否则当连接恢复时,NM 甚至不可能得到警告。
很容易区分这两种情况:ip link show
将显示NO-CARRIER
+LOWERLAYERDOWN
表示断开连接的接口,以及DOWN
管理性关闭的接口。
以管理方式关闭(和打开)接口可能会丢失路由
丢失运营商并恢复它不会破坏网络设置。如果延迟足够短,它甚至不应该中断正在进行的网络连接
但是管理网络的应用程序可能会做出反应并更改网络设置,有时会导致类似于管理故障的结果
您可以使用命令ip monitor link
来接收有关接口设置为关闭/打开或运营商更改的事件,或者ip monitor
接收此时或之后将发生的所有多个相关事件(包括地址或路由更改)。
大多数ip
命令(但不是ip monitor
)都有一个 JSON 输出可ip -json ...
用于帮助脚本(以及jq
)。
示例(从第一个veth示例继续):
vethb仍然关闭:
# ip -j link show dev vethb | jq '.[].operstate'
"DOWN"
# ip -j link show dev vetha | jq '.[].operstate'
"LOWERLAYERDOWN"
Run Code Online (Sandbox Code Playgroud)
设置vethb,它现在在两者上都有一个载体:
# ip link set vethb up
# ip -j link show dev vetha | jq '.[].operstate'
"UP"
Run Code Online (Sandbox Code Playgroud)
这讲述了 3 种常见状态:管理上down,lowerlayerdown(即:up 但断开连接)或up(即:operating)。
归档时间: |
|
查看次数: |
2482 次 |
最近记录: |