ip link set <interface> up / down:腳本是如何呼叫的?
根據發行版,呼叫
ip link set <iface> up
(或關閉;還有 ifup / ifdown)將查看各種配置文件(我認為 Debian 上的 /etc/network/interfaces,Gentoo 有 /etc/conf.d/net…),然後更改(例如與 DHCP 互動等)據我所見
strace
,該ip
命令直接與核心對話(是這樣嗎?)。但是,最終,有人啟動了這些 shell 腳本/讀取了配置。這背後的機制是什麼?初始化系統是否在某些核心介面上偵聽啟動/關閉狀態更改並啟動這些腳本?還是有什麼不同?
正如您所描述的那樣呼叫
ip link set <iface> up
只是通過rtnetlink API與核心進行最小的通信(這不僅涉及路由,還涉及連結、地址等。這裡就是RTM_NEWLINK
)以管理方式啟動介面。較舊ifconfig
的工具使用已棄用的(用於網路)ioctl API(此處為)向核心提出相同的要求SIOCGIFFLAGS
。這些命令是低級命令,僅執行所要求的操作,僅此而已。
ifup
是ifupdown(或備用ifupdown2)套件的一部分(在 Debian 上),並且在不同的 Linux 發行版上有不同的實現。它們只是一套腳本,可能會呼叫ip link set ...
它們自己,也許其中一些還會直接使用其他可用的工具(如NetworkManager)。因此,您絕對不能將它們放在同一級別:ip link set ... up
根本不是ifup ...
.現在其他網路工具(如NetworkManager )將如何互動並知道發生了什麼?因為他們通過rtnetlink向核心詢問他們感興趣的一些網路事件。netlink API 實現支持多播:這意味著單個消息可以被多個相關方(屬於使用者空間或核心)有效地接收,所以這簡化了事件的實現。
通常,當某些東西(此處
ip link set ... up
)向核心發送消息時,核心會回復一條多播給相關方的消息:該ip link
命令會收到此消息,但所有等待的工具現在都知道“介面剛剛啟動” “(我將拋開管理狀態向上與操作狀態向上之間的差異)。
ip monitor
可以在腳本中使用由等待來自核心的網路事件的命令的輸出驅動的事件循環來執行相同的操作。當然,真正可解析的輸出會更可取,遺憾的是,許多其他iproute2子命令支持 JSON 輸出(使用-json
),而ip monitor
.這是一個基本的shell 範例,
ip monitor link
用於在更改此介面時顯示介面的操作狀態(即使它與其操作狀態無關……這是一個基本範例)。由於它正在解析不可靠的輸出,因此預計它在某些情況下會失敗:#!/bin/sh ip -o monitor link | while read -r index interface status remaining; do iface=$(printf '%s\n' "$interface" | sed -E 's/(@.*)?:$//') operstate=$(printf '%s\n' "$remaining" | grep -Eo ' state [^ ]+' | sed 's/^ state //') printf '%s %s\n' "$iface" "$operstate" done
當上面的腳本執行時,在別處嘗試這些命令:
# ip link add test1 type veth peer name test2 # ip link set test1 up # ip link set test2 up # ip link delete test1 # script doesn't handle correctly lines starting with Deleted
地址、路由等也是如此。這就是NetworkManager等工具對命令的反應
ip link set <iface> up
。