
我正在嘗試 Linux,並試圖了解早期啟動過程。至少在我使用 udev 的系統上是發現裝置的「模組」。然而,一旦發現,它就會以某種方式「新增」到可用介面清單中,然後您可以執行「ip link set dev up」命令。在此步驟之前,它無法識別設備名稱。
我的問題是這種情況發生在哪裡,使用了什麼指令?
我知道它發生在“早期用戶空間”之後,因為我向 initramfs 映像添加了一個鉤子,並使用“ip link”轉儲接口,並且僅存在環回接口。
不過,它必須很早就發生,並且在我的系統環境中,當我執行 systemctl 命令時,會有一個「裝置」條目作為 sys-subsystem-net-devices-ens33.device 。
根本不清楚該條目如何添加到設備列表中或它執行什麼命令。
感謝您的幫助,我一直在探索,但這個過程的細節並不容易找到。
答案1
沒有命令。它首先不是由用戶空間完成的 - 它完全由卡的乙太網路驅動程式完成,該驅動程式使用register_netdev()
核心的“net”子系統來顯示新的介面。
流程大致是:
核心發現 PCI 或 USB 設備,建構描述它的“modalias”,並向 udev 發送宣布該設備的 uevent。例如:
ACTION=add DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3 DEVTYPE=usb_device SUBSYSTEM=usb ... ACTION=add DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0 DEVTYPE=usb_interface MODALIAS=usb:v0B95p1790d0100dcFFdscFFdp00icFFiscFFip00in00 SUBSYSTEM=usb ...
udev 接收 uevent,根據規則處理它(運行幫助工具、添加各種元資料、建立符號連結)並再次發送它,這次發送到各種使用 libudev 的程式。
udev 規則檔案之一
80-drivers.rules
處理包含MODALIAS=
並使用 libkmod 的 uevent 來載入與該別名相符的任何核心模組。 (過去,它用於運行modprobe
模組加載。不過,您仍然可以將模態別名傳遞給modprobe
ormodinfo
。)$ modinfo usb:v0B95p1790d0100dcFFdscFFdp00icFFiscFFip00in00 filename: /lib/modules/4.7.2-1-ARCH/kernel/drivers/net/usb/ax88179_178a.ko.gz description: ASIX AX88179/178A based USB 3.0/2.0 Gigabit Ethernet Devices alias: usb:v0DF6p0072d*dc*dsc*dp*ic*isc*ip*in* alias: usb:v2001p4A00d*dc*dsc*dp*ic*isc*ip*in* alias: usb:v0B95p178Ad*dc*dsc*dp*ic*isc*ip*in* alias: usb:v0B95p1790d*dc*dsc*dp*ic*isc*ip*in* depends: usbnet,usbcore,mii ...
所以對於這個設備,udev會載入
ax88179_178a
驅動程式。無論驅動程式是剛剛加載還是之前已經加載,內核都會調用其
.probe
函數將其附加到特定設備。驅動程式的
probe
函數會執行任何必要的晶片魔法來為裝置供電、初始化、配置它,最後呼叫register_netdev()
為自己創建一個真正的乙太網路介面。(對於 USB 設備,某些驅動程式推遲探測
usbnet
模組,該模組完成大部分標準 USB 工作並創建實際的以太網接口,並且僅調用主驅動程式來執行特定於硬體的魔法。)Sep 04 21:25:11 kernel: ax88179_178a 2-1.3:1.0 eth1: register 'ax88179_178a' ↵ at usb-0000:00:1d.0-1.3, ASIX AX88179 USB 3.0 Gigabit Ethernet, 8c:ae:4c:f4:06:33