ip連結集上/下:如何呼叫腳本?

ip連結集上/下:如何呼叫腳本?

根據發行版,呼叫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

相關內容