🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习 🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发 ❄️作者主页:一个平凡而乐于分享的小比特的个人主页 ✨收录专栏:Linux,本专栏目的在于,记录学习Linux操作系统的总结 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

特征 | mdev (Mini-udev) | udev (Userspace Device) |
|---|---|---|
定位 | 嵌入式系统的轻量级解决方案 | 桌面/服务器系统的标准设备管理器 |
大小 | ~10KB (极简) | ~1MB+ (功能完整) |
依赖 | Busybox (内置) | systemd (现代系统) 或独立运行 |
配置 | /etc/mdev.conf (简单规则) | /etc/udev/rules.d/ (复杂规则系统) |
┌─────────────────────────────────────┐
│ 内核发现设备 → 发送uevent → mdev │
│ │
│ 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
fiudev方式:
# 自动规则
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 ;;
esacudev实现:
# 更健壮的解决方案
SUBSYSTEM=="block", ENV{ID_TYPE}=="disk", ENV{DEVTYPE}=="disk", \
RUN{program}+="/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"资源消耗对比 (相对值)
↑
100%├───────────┬─────────────┬─────────────┐
│ 内存占用 │ 启动时间 │ CPU使用率 │
├───────────┼─────────────┼─────────────┤
mdev│ ███ 10%│ ███ 15% │ ███ 5% │
├───────────┼─────────────┼─────────────┤
udev│ ███████100%│█████████100%│ ███████ 80% │
└───────────┴─────────────┴─────────────┘“小快灵,大而全”
无论选择哪个,理解Linux设备模型(sysfs、devtmpfs、uevent)才是掌握设备管理的关键!