Linux 傳統靜態裝置節點方式會在 /dev 建立大量無用節點。udev 基於 sysfs,僅在偵測到硬體時動態建立對應節點,並可透過規則檔實現自動掛載等進階功能。本文詳述 udev 移植與 USB/SD 卡自動掛載完整流程。
# 下載 udev-080.tar.bz2 並解壓
# 修改 Makefile
CROSS = arm-softfloat-linux-gnu-
# 編譯並 strip
make
arm-softfloat-linux-gnu-strip udev udevd udevstart udevinfo udevtest
# 複製至 rootfs/bin/
三種等效方式(擇一):
/etc/init.d/rcS: 加入掛載指令與 /bin/udevd --daemon、/bin/udevstart/linuxrc(若為二進位): 同樣加入掛載與 udev 啟動指令,最後 exec /sbin/init/etc/fstab 與 rcS: 將 sysfs、tmpfs 寫入 fstab,rcS 僅啟動 udevd 與 udevstart重啟後系統即具備自動建立裝置節點能力。
mkdir -p /etc/udev/rules.d
# /etc/udev/udev.conf
udev_log="err"
/etc/udev/rules.d/11-add-usb.rulesACTION!="add", GOTO="farsight"
KERNEL=="sd[a-z][0-9]", RUN+="/sbin/mount-usb.sh %k"
LABEL="farsight"
%k 為核心傳入的裝置名稱(如 sda1)。
/sbin/mount-usb.sh#!/bin/sh
/bin/mount -t vfat /dev/$1 /tmp
sync
記得 chmod +x /sbin/mount-usb.sh。
11-add-remove.rules 與 umount-usb.sh# 規則
ACTION!="remove", GOTO="farsight"
SUBSYSTEM!="block", GOTO="farsight"
KERNEL=="sd[a-z][0-9]", RUN+="/sbin/umount-usb.sh"
LABEL="farsight"
# 腳本
#!/bin/sh
sync
umount /tmp/
# 11-add-sd.rules
ACTION!="add", GOTO="farsight"
KERNEL=="mmcblk[0-9]p[0-9]", RUN+="/sbin/mount-sd.sh %k"
LABEL="farsight"
# mount-sd.sh
#!/bin/sh
/bin/mount -t vfat /dev/$1 /tmp
sync
# 11-remove-sd.rules
ACTION!="remove", GOTO="farsight"
SUBSYSTEM!="block", GOTO="farsight"
KERNEL=="mmcblk[0-9]p[0-9]", RUN+="/sbin/umount-sd.sh"
LABEL="farsight"
# umount-sd.sh
#!/bin/sh
sync
umount /tmp/
插入 USB 或 SD 卡,系統自動掛載至 /tmp;拔出時自動卸載並同步緩衝區,資料更安全。此架構輕量、無需額外守護程式,極適合嵌入式裝置。