简介

在 Linux 系统中,udev 和 mdev 都是负责动态管理设备文件的工具。它们的核心任务是在硬件设备(如U盘、摄像头、硬盘等)被添加或移除时,自动在 /dev 目录下创建或删除对应的设备节点,并可以执行用户定义的操作。

可以把 Linux 内核想象成发现新硬件的“报信者”,而 udev 和 mdev 则是收到消息后,负责在用户空间中创建文件和执行后续动作的“执行者”。尽管目标相似,但两者的设计哲学、工作机制和适用场景却有显著不同。

工作机制与核心区别

它们最本质的区别在于如何从内核接收“硬件变化”的消息:

  • udev:基于netlink的守护进程

    • 工作方式:udev 是一个在系统启动后一直运行的守护进程(systemd-udevd.service)。它通过高效的 netlink 套接字与内核通信,持续监听内核发出的"uevent"(设备事件)。
    • 特点:由于是常驻内存的守护进程,udev 处理事件的实时性高,能够并行处理多个事件,非常适合设备数量众多、热插拔频繁的复杂环境,因此它是现代桌面 Linux 和服务器系统的默认选择。
  • mdev:基于uevent_helper的轻量级工具

    • 工作方式:mdev 是一个轻量级工具,它本身不常驻内存。它利用了一种较为传统和简单的机制——uevent_helper。简单来说,就是告诉内核:“当有硬件事件发生时,请直接调用 /sbin/mdev 这个程序来处理”。通过 echo /sbin/mdev > /proc/sys/kernel/hotplug 命令即可设置。
    • 特点:这种方式实现简单,不占用额外系统资源。但每发生一个事件,内核就需要启动一次 mdev 程序,在处理大量并发事件时效率较低。因此,它非常适合于资源受限的嵌入式系统(如基于 BusyBox 的路由器、物联网设备)

下表总结了它们的主要区别:

特性 udev mdev
定位 功能全面的设备管理器 轻量级的设备管理工具
适用场景 桌面系统、服务器、复杂环境 嵌入式系统、资源受限设备
工作机制 守护进程(udevd)通过 netlink 监听内核事件 内核通过 uevent_helper 直接调用 /sbin/mdev 程序
事件处理 效率高,可并行处理 实现简单,但事件多时效率较低
配置方式 规则文件 /etc/udev/rules.d/*.rules 配置文件 /etc/mdev.conf
常见宿主 systemd,几乎所有主流Linux发行版 BusyBox,常用于嵌入式Linux

配置与管理

无论是 udev 还是 mdev,其灵活性都来自于通过规则文件让用户自定义设备的行为。

  • udev 规则文件 (/etc/udev/rules.d/)
    udev 的规则非常强大和精细。管理员可以通过匹配设备的多种属性(如内核名称、子系统、厂商ID、产品ID等)来执行特定操作。例如,下面的规则可以为特定厂商和产品ID的 USB 设备创建稳定的符号链接 /dev/myusb,并设置所有者和权限:
SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="myusb", OWNER="john", GROUP="usergroup", MODE="0660"

修改规则后,可以使用 udevadm control --reload-rules 重载配置,并用 udevadm trigger 重新触发事件。

  • mdev 配置文件 (/etc/mdev.conf)
    • mdev 的配置更为简洁。它主要根据设备名称进行匹配,并指定权限和事件发生前后要执行的命令。下面的例子展示了如何在插入 U 盘(sd[a-z][0-9] 设备)时自动挂载,移除时自动卸载:
sd[a-z][0-9] 0:0 777 * if [ $ACTION = "add" ]; then mkdir -p /mnt/$MDEV; mount /dev/$MDEV /mnt/$MDEV; else umount /mnt/$MDEV; rmdir /mnt/$MDEV; fi

这里的 $MDEV 和 $ACTION 是 mdev 提供的环境变量。

如何确定你的系统使用的是mdev还是udev

检查方法 udev 的特征 mdev 的特征
进程 有 systemd-udevd 或 udevd 进程 没有常驻的 udev 进程
热插拔配置 /proc/sys/kernel/hotplug 为空 /proc/sys/kernel/hotplug 内容为 /sbin/mdev
配置文件 /etc/udev/rules.d/ 目录存在且有规则 /etc/mdev.conf 文件存在
包管理器 安装了 udev 或 systemd 包 通常是 BusyBox 集成的 mdev

最快捷的方法:直接运行 ps aux | grep udev,如果有进程就是 udev;如果没有,再检查 cat /proc/sys/kernel/hotplug,如果显示 /sbin/mdev 就是 mdev。

总结

总的来说,udev 和 mdev 是 Linux 世界中为解决相同问题而生的“一体两面”的解决方案。

  • 如果你在使用一台标准的PC、服务器,或者任何运行着完整 Linux 发行版的系统,那么 udev 正在背后默默地为你工作,它强大且全面。

  • 如果你正在摆弄一个嵌入式设备,例如一个开源路由器、一个基于 BusyBox 构建的微型系统,那么你遇到的很可能是 mdev,它轻巧、简单,专注于在资源有限的环境下完成核心任务。

理解它们的区别,有助于在不同的场景下做出合适的选择,并在遇到设备相关问题时,能准确判断问题可能出在哪个环节。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐