Linux mdev -s介绍

mdevBusyBox 套件中提供的一个轻量级的 设备管理工具,主要用于嵌入式 Linux 系统或其他资源受限的环境。它的作用类似于标准的 udev,负责在 /dev 目录下动态创建和删除设备节点文件(device nodes),以反映系统中实际存在的硬件设备。

mdev -smdev 命令的一个特定用法,通常在系统启动过程中执行,用于初始化 /dev 目录

mdev -s 的作用详解

  1. 扫描 /sys 文件系统:

    • -s 选项告诉 mdev 扫描整个 /sys 文件系统(通常挂载在 /sys 目录下)。
    • /sys 是一个虚拟文件系统,由内核提供,它以结构化的方式暴露了系统中所有设备、总线、驱动程序和内核模块的信息。每个设备在 /sys 下都有一个对应的目录,包含其属性(如设备号、厂商ID、产品ID等)。
  2. 创建初始设备节点:

    • 在扫描过程中,mdev -s 会遍历 /sys 目录树。
    • 对于 /sys 中发现的每一个具有 dev 属性的设备(dev 属性包含了设备的主设备号和次设备号,格式如 254:0),mdev 会:
      • /dev 目录下创建对应的设备节点文件(例如 /dev/sda, /dev/ttyS0, /dev/input/event0 等)。
      • 根据 /sys 中的信息(如设备类、子系统)和 /etc/mdev.conf 配置文件(如果存在),设置设备节点的权限(用户、组、读写权限)和所有权
      • 根据 /etc/mdev.conf 中的规则,执行可能关联的命令(例如在设备出现时加载特定固件、创建符号链接等)。
  3. 解决启动依赖:

    • 在系统启动的早期阶段(通常在挂载根文件系统之后、执行初始化脚本之前),/dev 目录通常是空的或者只包含一些最基本的静态设备节点(如 /dev/console, /dev/null)。
    • 许多关键的守护进程和初始化脚本需要访问特定的设备节点(如磁盘分区 /dev/sda1、串口 /dev/ttyS0、随机数生成器 /dev/urandom 等)才能正常启动。
    • mdev -s 在这个关键时刻运行,确保所有内核已经检测到的硬件设备在 /dev 下都有对应的、权限正确的设备节点可用,为后续启动步骤提供必要的设备访问能力。

典型使用场景

  • 系统启动脚本: 这是 mdev -s 最常见的地方。通常在 /etc/inittab 或者 /etc/init.d/rcS 这样的早期初始化脚本中调用。例如,在 BusyBox 的 inittab 中你可能会看到这样一行:

    1
    ::sysinit:/bin/mdev -s

    这确保了在系统进入多用户模式或运行其他初始化脚本之前,/dev 目录已经被正确填充。

  • 手动初始化 /dev 如果你怀疑 /dev 目录下的设备节点不完整或损坏(例如在动态添加了许多设备之后),或者在一个非常规启动的环境中,可以手动以 root 身份运行 mdev -s 来重建 /dev

udev 的区别

  • 轻量级: mdev 是 BusyBox 的一部分,设计目标是小巧、快速、占用资源少,非常适合嵌入式系统。
  • 依赖 BusyBox: 需要 BusyBox 环境支持。
  • 配置 (/etc/mdev.conf): 规则语法比 udev 的规则文件简单,但功能也相对有限。
  • 热插拔支持: mdev 也可以配置为响应内核的 uevent(通常在 /proc/sys/kernel/hotplug 设置为 /sbin/mdev),实现设备热插拔时动态创建设备节点(这是 mdev 不加 -s 时的默认行为)。mdev -s 则专注于启动时的静态初始化。
  • 功能: udev 功能更强大、更复杂(持久化命名、更丰富的规则、集成 D-Bus 等),是现代桌面和服务器发行版的标准。

总结

mdev -s 是嵌入式 Linux 系统中(特别是使用 BusyBox 的)一个关键的启动时命令。它的核心任务是:在系统启动早期,通过扫描 /sys 文件系统,在 /dev 目录下自动创建所有内核已识别设备的设备节点文件,并设置正确的权限和所有权。 这为后续的系统服务和应用程序访问硬件设备奠定了必要的基础。理解它在启动流程中的作用对于管理和调试嵌入式系统非常重要。