mdev 与 udev:嵌入式及桌面 Linux 设备管理对比
mdev 和 udev 是 Linux 系统中两种主要的设备管理机制。mdev 作为 Busybox 内置的轻量级工具,适用于资源受限的嵌入式环境,配置简单但功能有限。udev 则是功能完整的守护进程,支持复杂规则、持久化命名及热插拔管理,广泛用于桌面和服务器系统。本文对比了两者在架构、性能、配置及应用场景上的差异,并提供了从 mdev 迁移至 udev 的示例,帮助开发者根据项目需求选择合适的设备管理方案。

mdev 和 udev 是 Linux 系统中两种主要的设备管理机制。mdev 作为 Busybox 内置的轻量级工具,适用于资源受限的嵌入式环境,配置简单但功能有限。udev 则是功能完整的守护进程,支持复杂规则、持久化命名及热插拔管理,广泛用于桌面和服务器系统。本文对比了两者在架构、性能、配置及应用场景上的差异,并提供了从 mdev 迁移至 udev 的示例,帮助开发者根据项目需求选择合适的设备管理方案。

| 特征 | mdev (Mini-udev) | udev (Userspace Device) |
|---|
| 定位 | 嵌入式系统的轻量级解决方案 | 桌面/服务器系统的标准设备管理器 |
| 大小 | ~10KB (极简) | ~1MB+ (功能完整) |
| 依赖 | Busybox (内置) | systemd (现代系统) 或独立运行 |
| 配置 | /etc/mdev.conf (简单规则) | /etc/udev/rules.d/ (复杂规则系统) |
内核发现设备 → 发送 uevent → mdev 读取 /etc/mdev.conf → 执行动作(创建/dev 节点、加载固件、执行脚本)。特点为事件驱动、同步执行、配置简单。
内核 uevent → udevd 守护进程 → 规则匹配引擎 → 并行处理 → 持久化命名 → 动态权限管理。具备高级功能如设备快照、硬件数据库、热插拔管理。特点为守护进程、异步处理、功能丰富。
| 对比维度 | mdev | udev |
|---|---|---|
| 架构模式 | 直接执行(无守护进程) | 守护进程(udevd) |
| 事件处理 | 同步(阻塞式) | 异步(非阻塞) |
| 规则语法 | 简单正则匹配 | 复杂键值匹配系统 |
| 设备命名 | 固定名称(内核提供) | 持久化命名(by-id, by-path 等) |
| 固件加载 | 支持(手动配置) | 自动固件加载 |
| 热插拔 | 基础支持 | 完整热插拔管理 |
| 权限管理 | 静态(配置文件指定) | 动态(规则可编程) |
| 网络设备 | 不支持 | 支持(与 NetworkManager 集成) |
| 依赖关系 | 几乎无依赖 | systemd/libudev 等 |
| 性能影响 | 极低 | 较低(但比 mdev 高) |
/etc/mdev.conf)# 格式:设备正则 用户:组 权限 [@$*命令]
sd[a-z][0-9]* 0:0 660 * /etc/mdev/automount.sh
ttyUSB[0-9]* root:uucp 660
video[0-9]* root:video 660
/etc/udev/rules.d/99-my.rules)# 更丰富的匹配条件和操作
SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", \
SYMLINK+="my_device", MODE="0660", GROUP="plugdev", \
RUN+="/usr/local/bin/setup_device.sh"
mdev 方式:
# /etc/mdev.conf
video[0-9]* root:video 660 @/etc/init.d/camera_setup
# camera_setup 脚本手动处理所有逻辑
#!/bin/sh
if [ "$ACTION" = "add" ]; then
v4l2-ctl --set-fmt-video=width=640,height=480
/usr/bin/start_streaming
fi
udev 方式:
# 自动规则
SUBSYSTEM=="video4linux", ATTR{index}=="0", \
TAG+="systemd", ENV{SYSTEMD_WANTS}="camera-stream.service"
# systemd 服务自动管理
mdev 实现:
# 简单但功能有限
mmcblk[0-9]p[0-9]* 0:0 660 $ /etc/mdev/sdhotplug.sh
# sdhotplug.sh 需要手动处理所有细节
case $ACTION in
add)
mount /dev/$MDEV /mnt/sd
;;
remove)
umount /mnt/sd
;;
esac
udev 实现:
# 更健壮的解决方案
SUBSYSTEM=="block", ENV{ID_TYPE}=="disk", ENV{DEVTYPE}=="disk", \
RUN+="/usr/bin/systemd-mount --no-block --automount=yes /dev/%k /mnt/%k"
# mdev
sda[0-9]* root:disk 660
# 对应的 udev 规则
KERNEL=="sda[0-9]*", OWNER="root", GROUP="disk", MODE="0660"
# mdev: 执行脚本
ttyACM[0-9]* 0:0 660 @/usr/local/bin/gps_setup.sh
# udev: 多种实现方式
# 方式 1: RUN 指令
SUBSYSTEM=="tty", KERNEL=="ttyACM[0-9]*", RUN+="/usr/local/bin/gps_setup.sh"
# 方式 2: systemd 服务(推荐)
SUBSYSTEM=="tty", KERNEL=="ttyACM[0-9]*", \
TAG+="systemd", ENV{SYSTEMD_WANTS}="gps-setup.service"
资源消耗对比 (相对值):
'小快灵,大而全' mdev:小型系统、快速启动、灵活简单 udev:大型系统、而且强大、全面功能
无论选择哪个,理解 Linux 设备模型(sysfs、devtmpfs、uevent)才是掌握设备管理的关键!

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online