ip link down 和物理链路不存在的区别

red*_*0ct 11 linux networking ethernet iproute network-interface

在Linux中,有什么区别离职后ip link down-condition真正的链接不存在(例如交换机的端口被烧毁,或者有人绊到电线)。
我所说的差异是指系统中可以用来区分这两种情况的一些标志。
例如,在这两种情况下路由表是否相同?将ethtool或其他东西显示相同的东西?是否有一些工具/实用程序可以区分这些条件?

A.B*_*A.B 8

管理上打开但断开连接或管理上关闭的接口之间存在差异。

断开连接

接口获得运营商关闭状态。它的正确处理可能取决于接口的驱动程序和内核版本。通常它可以与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 种常见状态:管理上downlowerlayerdown(即:up 但断开连接)或up(即:operating)。