一.什么是 sysfs 文件系统
sysfs 文件系统是 Linux 内核提供的一种虚拟文件系统,用于向用户空间提供内核中设备,驱动程序和其他内核对象的信息。它以一种层次结构的方式组织数据,并将这些数据表示为文件和目录,使得用户空间可以通过文件系统接口访问和操作内核对象的属性。sysfs 提供了一种统一的接口,用于浏览和管理内核中的设备、总线、驱动程序和其他内核对象。它在 /sys 目录下挂载,用户可以通过查看和修改 /sys 目录下的文件和目录来获取和配置内核对象的信息。
二.设备模型的基本框架
在 Linux 内核中,kobject 是一个通用的基础结构,用于构建设备模型。每个kobject 实例对应于 sys 目录下的一个目录,这个目录包含了该 kobject 相关的属性,操作和状态信息。如下图所示:
说 kobject 是设备模型的基石,通过创建对应的目录结构和属性文件,它提供了一个统一的接口和框架,用于管理和操作设备模型中的各个实体。
三.sys目录结构
在系统启动的时候会在/sys 目录下创建以下目录:
/sys/devices:
这是系统中所有设备存放的目录,也就是系统中的所有设备在 sysfs 中的呈现、表达,也是 sysfs 管理设备的最重要的目录结构。
/sys/block:
块设备的存放目录,这是一个过时的接口,按照 sysfs 的设计理念,系统所有的设备都存放在/sys/devices 目录下,所以/sys/block 目录下的文件通常是链接到/sys/devices 目录下的文件。
/sys/bus:
这是系统中的所有设备按照总线类型分类放置的目录结构,/sys/devices 目录下每一种设备都是挂在某种总线下的,譬如 i2c 设备挂在 I2C 总线下。同样,/sys/bus 目录下的文件通常也是链接到了/sys/devices 目录。
/sys/class:
这是系统中的所有设备按照其功能分类放置的目录结构,同样该目录下的文件也是链接到了/sys/devices 目录。按照设备的功能划分组织在/sys/class 目录下,譬如/sys/class/leds目录中存放了所有的 LED 设备,/sys/class/input 目录中存放了所有的输入类设备。
/sys/dev:
这是按照设备号的方式放置的目录结构,同样该目录下的文件也是链接到了/sys/devices 目录。该目录下有很多以主设备号:次设备号(major:minor)命名的文件,这些文件都是链接文件,链接到/sys/devices 目录下对应的设备。
/sys/firmware:
描述了内核中的固件。
/sys/fs:
用于描述系统中所有文件系统,包括文件系统本身和按文件系统分类存放的已挂载点。
/sys/kernel:
这里是内核中所有可调参数的位置。
/sys/module:
这里有系统中所有模块的信息。
/sys/power:
这里是系统中电源选项,有一些属性可以用于控制整个系统的电源状态。