根據發行版,呼叫ip link set <iface> up
(或down;還有ifup / ifdown)將查看各種設定檔(Debian 上的/etc/network/interfaces 我認為,Gentoo 有/etc/conf.d/net...),並進行更改(例如與 DHCP 互動等)
據我所見strace
,該ip
命令直接與內核對話(是這樣嗎?)。但最終,有人啟動這些 shell 腳本/讀取配置。這背後的機制是什麼? init 系統是否在某些核心介面上偵聽 up/down 狀態變更並啟動這些腳本?或有什麼不同嗎?
答案1
正如您所描述的那樣,調用ip link set <iface> up
只是通過內核與內核進行最少的通信rtnetlink應用程式介面(這不僅與路由有關,還與連結、位址等有關。這裡是RTM_NEWLINK
)以管理方式啟動介面。較舊的ifconfig
工具使用已棄用的(針對網路)ioctl API(此處為SIOCGIFFLAGS
)向核心提出相同的要求。
這些命令是低階命令,僅執行所要求的操作,僅此而已。
ifup
是(在 Debian 上)的一部分如果向上向下(或替代的如果上下2)套件,並且在不同的 Linux 發行版上有不同的實作。它們只是一套腳本,可能會呼叫ip link set ...
自身,也許其中一些也會直接使用其他可用的工具(例如網路管理器)。所以你絕對不能把它們放在同一水平上:ip link set ... up
根本不是ifup ...
。
現在其他網路工具會怎麼樣網路管理器互動並知道發生了什麼?因為他們在詢問內核,透過rtnetlink,取得他們感興趣的一些網路事件的通知。網路連結API 實作支援多播:這表示多個感興趣方(屬於使用者空間或核心)可以有效地接收單一訊息,因此這簡化了事件實作。
通常,當某些東西(此處ip link set ... up
)向內核發送訊息時,內核會回復一條訊息,該訊息被多播給感興趣的各方:該ip link
命令收到此訊息,而且所有等待的工具現在都知道“剛剛啟動了一個介面」 「(我將忽略管理狀態啟動與操作狀態啟動之間的差異)。
可以使用由命令輸出驅動的事件循環在腳本中執行相同的操作ip monitor
它正在等待來自核心的網路事件。當然,真正可解析的輸出會更好,遺憾的是,而許多其他輸出ip路由2子命令支援 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
地址、路線等也是可能的。網路管理器正在對命令做出反應ip link set <iface> up
。