萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

mdev hotplug 與 udev coldplug 機制深度解析:initramfs 裝置管理實戰

mdev Hotplug 模式:輕量級熱插拔

BusyBox mdev 可作為核心熱插拔處理程式,流程:


# 設定 hotplug handler 為 mdev (需核心 CONFIG_UEVENT_HELPER=y)
echo /sbin/mdev > /proc/sys/kernel/hotplug

# 後續 insmod 載入模組時,核心自動調用 mdev 建立 /dev 節點
insmod scsi_mod.ko
insmod sd_mod.ko
# /dev/sda, /dev/sda1 等自動出現

優點:極輕量、無 daemon、適合 initramfs/嵌入式。缺點:規則功能弱、無持久命名、無資料庫追蹤。

udev Coldplug 機制:標準桌面/伺服器方案

核心啟動時已偵測硬體並透過 sysfs (/sys) 匯出資訊。udev 掃描 sysfs 產生「冷插拔」事件 (無實體插拔動作),再處理事件建立裝置節點。

三大核心程式

程式角色
udevdDaemon,接收事件、排隊、分發給 worker,避免競態條件
udevtrigger (或 udevadm trigger)掃描 sysfs,為現有裝置合成 add 事件
udevsettle (或 udevadm settle)等待事件隊列清空,確保所有裝置就緒

initramfs 中實現 coldplug 腳本片段


mkdir -p /dev/.udev/db /dev/.udev/queue
udevd --daemon
udevtrigger
udevsettle
# 此時 /dev 已含所有核心偵測到的裝置節點
# 切換根檔案系統前必須殺掉 udevd,避免與真實系統 udev 衝突
killall udevd
exec switch_root /mnt /sbin/init

註:現代 initramfs (systemd-udev) 已簡化為 udevadm trigger --action=add + udevadm settle,無需手動管理目錄與 daemon。

udev 規則自動載入驅動模組

關鍵規則 (40-modprobe.rules):


# 通用模組自動載入:根據 MODALIAS (裝置 ID) 呼叫 modprobe
ENV{MODALIAS}=="?*", RUN+="/sbin/modprobe $env{MODALIAS}"

# SCSI 裝置專用規則
SUBSYSTEM=="scsi_device", ACTION=="add", SYSFS{device_type}=="0|7|14", RUN+="/sbin/modprobe sd_mod"
SUBSYSTEM=="scsi_device", ACTION=="add", SYSFS{device_type}=="1", RUN+="/sbin/modprobe st"
SUBSYSTEM=="scsi_device", ACTION=="add", SYSFS{device_type}=="[45]", RUN+="/sbin/modprobe sr_mod"

MODALIAS 由核心模組 MODULE_ALIAS() 宏產生,包含裝置總線類型、廠商/產品 ID 等,讓 modprobe 精確匹配驅動。

initramfs 整合 udev 完整清單

  1. 複製 udevd, udevtrigger, udevsettle, modprobe 至 initramfs /sbin。
  2. ldd 檢查並複製所需共享庫至 /lib。
  3. 複製規則檔至 /etc/udev/rules.d/。
  4. init 腳本中執行 coldplug 流程 (掛載 sysfs/proc → udevd → trigger → settle)。
  5. switch_root 前 killall udevd。

此機制讓 initramfs 能自動偵測並載入 SATA/SCSI/USB/NVMe 等根裝置驅動,實現通用啟動映像。

copyright © 萬盛學電腦網 all rights reserved