devtmpfs in Linux

sysfs 和 /dev

linux kernel 在启动阶段后期,分析设备树匹配相应的driver在用sysfs构建系统的设备和驱动的连接和分类信息。在sysfs devices下会有设备major 和minor信息。
/dev目录下是系统中所有的设备节点,设备节点就是设备文件,操作设备文件就是操作具体的设备。设备文件分为字符设备和块设备文件。创建这些文件的方式在古早时期就是mknod 命令,它参数就是设备文件名称和major minor号。
简单来说,sysfs是系统驱动和设备信息管理和展示的虚拟文件系统。/dev 是所有设备文件存放的目录。他们之间的关系是,设备文件的major minor 号可以从sysfs中找到。

/dev 下设备文件是何时创建的?

在没有devtmpfs时,系统的启动必须的设备文件在制作文件系统时用mknod 或者makedevs创建,设备的major 和minor 信息只有通过以下方式获得
获取方式:

  • 查 内核官方文档 Documentation/admin-guide/devices.txt
  • 查 现有 /dev 节点 (ls -l /dev)
  • 查 驱动源码
  • 或使用老系统的 MAKEDEV 脚本

其他设备节点在系统启动后由udev/mdev 这个用户程序扫描sysfs 挂载目录自动在/dev下创建。
系统支持的热插拔设备,如SDCARD, usb 设备也是由udev支持设备文件节点自动创建。

devtmpfs

devtmpfs 的出现解决了在系统启动前必须手动创建设备节点的问题。系统启动必须的设备和其他设备只要设备和驱动匹配成功,在启动阶段就在devtmpfs中创建好了相应的节点。在启动之后也不需要udev这样的用户程序去自动创建节点。

下边是devtmpfs 和sysfs的对比

sysfs:设备和内核对象的“信息树”

  • 挂载点:通常挂载在 /sys
    本质:虚拟文件系统(VFS),由内核提供,用来暴露内核内部数据结构给用户空间。
  • 作用:
    展示 设备、驱动、总线、模块 等内核对象的层次结构。
    提供 只读或可写属性文件,用户空间程序可以读取设备状态或写入配置。
  • 特点:
    只提供信息,不直接提供设备节点。

例如:

ls /sys/class/net/
ls /sys/block/
cat /sys/class/net/eth0/address

这些都是 内核对象属性,而不是 /dev 下的设备文件。

devtmpfs:自动生成设备节点的文件系统

  • 挂载点:通常挂载在 /dev
  • 本质:虚拟文件系统,由内核自动创建 设备节点(character/block devices)。
  • 作用:
    在内核探测到硬件设备时,自动创建对应的 /dev 节点。
    解决了以前用户空间工具(如 mdev 或 udev)手动创建设备节点的需求。
  • 特点:
    设备节点的 主次设备号 和 类型 从内核获取。
    可以配合 udev 动态设置权限、符号链接等。

两者的关系

特性 sysfs devtmpfs
类型 虚拟文件系统(信息树) 虚拟文件系统(设备节点树)
挂载点 /sys /dev
内容 内核对象信息(只读或可写属性) 真实设备节点(字符/块设备)
自动生成 内核创建对象信息 内核创建节点
用户空间依赖 用户可以读取/写入配置 用户空间通常用 udev 进一步管理

关键点:
devtmpfs 的生成依赖 内核已经探测到的设备对象。
这些设备对象信息本身就是在 sysfs 中体现的:
例如,内核探测到的 tty 设备:
/sys/class/tty/tty0 → 内核对象信息
/dev/tty0 → devtmpfs 创建的字符设备节点

可以理解为:
sysfs 提供“设备对象信息”,
devtmpfs 基于这些信息自动生成“对应的 /dev 节点”

devtmpfs 的内核支持需要开启
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
这两个选项。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐