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/嵌入式。缺點:規則功能弱、無持久命名、無資料庫追蹤。
核心啟動時已偵測硬體並透過 sysfs (/sys) 匯出資訊。udev 掃描 sysfs 產生「冷插拔」事件 (無實體插拔動作),再處理事件建立裝置節點。
| 程式 | 角色 |
|---|---|
udevd | Daemon,接收事件、排隊、分發給 worker,避免競態條件 |
udevtrigger (或 udevadm trigger) | 掃描 sysfs,為現有裝置合成 add 事件 |
udevsettle (或 udevadm settle) | 等待事件隊列清空,確保所有裝置就緒 |
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。
關鍵規則 (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 精確匹配驅動。
udevd, udevtrigger, udevsettle, modprobe 至 initramfs /sbin。ldd 檢查並複製所需共享庫至 /lib。/etc/udev/rules.d/。switch_root 前 killall udevd。此機制讓 initramfs 能自動偵測並載入 SATA/SCSI/USB/NVMe 等根裝置驅動,實現通用啟動映像。