ip link down 和physical link缺席的區別
在 Linux 中,後置條件和真正的鏈路缺失(例如交換機的埠燒毀或有人絆倒電線)之間
ip link down
是否有任何區別。 我所說的差異是指系統中可以用來區分這兩種情況的一些標誌。 例如,在這兩種情況下,路由表是否相同?會或其他東西顯示相同的東西嗎?是否有一些工具/實用程序可以區分這些條件?
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
vetha本身在管理上是 UP,顯示
NO-CARRIER
和等效的操作狀態LOWERLAYERDOWN
標誌:它已斷開連接。也存在等效
/sys/
條目:# cat /sys/class/net/vetha/carrier /sys/class/net/vetha/operstate 0 lowerlayerdown
在通常的設置中,對於管理上的介面,運營商和操作狀態匹配(NO-CARRIER <=> LOWERLAYERDOWN或 LOWER_UP <=> UP)。例如,當使用 IEEE 802.1X 身份驗證時,一個例外情況(本核心文件中描述了操作狀態的高級細節:操作狀態,但本解釋不需要它)。
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"
設置vethb,它現在在兩者上都有一個載體:
# ip link set vethb up # ip -j link show dev vetha | jq '.[].operstate' "UP"
這講述了 3 種通常的狀態:管理上的down、lowerlayerdown(即:啟動但斷開連接)或up(即:操作)。