Linux内核的sysfs模块解析——了解你所需的数据 (linux kernel sysfs)
系统文件系统(sysfs)是Linux内核提供的一个文件系统,其目标是提供一个统一的接口来展示内核中存在的设备、对象和子系统的详细信息。它为用户提供了一种简单易用的方式,来获取这些信息以便于对系统进行诊断和管理。sysfs提供了一个虚拟文件系统,并将内核数据组织为一系列的目录树,用户可以仅仅通过查看这些目录及其文件就能获取到设备和其他系统信息。在这篇文章中,我将会深入探讨sysfs的一些重要特性以及它的应用。
sysfs目录结构
sysfs有自己的层次结构,它将Linux内核中的各种子系统、设备及其属性组织在一起,树形结构如下:
/sys
/block 存储所有块设备
/bus 存储所有总线和设备
/class 存储设备类型及其相关属性
/dev 存储设备节点
/fs 存储文件系统相关信息
/kernel 存储内核参数和模块信息
/module 存储模块信息
/power 存储电源管理模块信息
/sys 存储sysfs的根目录
/firmware 存储所有固件以及相关信息
/devices 存储设备驱动相关信息
/debug 存储调试信息
/security 存储安全相关信息
在/sys目录下有很多子目录,每个子目录都包含有所代表的对象的详细信息。例如,/sys/block 子目录包含所有块设备,每个块设备都作为一个子目录存在。在/sys/block/sda 子目录中,存储了硬盘sda相关的文件信息,例如/sys/block/sda/size,它保存了硬盘分区的大小(单位为块)。此外,一些可读可写的文件可以被用于改变设备的行为配置。例如/sys/block/sda/queue/rotational保存的是硬盘是否旋转的信息。
sysfs与设备驱动
sysfs是设备驱动的非常重要的一部分。驱动程序通过sysfs提供设备的属性、状态以及其他介绍信息。这些信息可以帮助用户了解一个设备的性质,例如使用哪个驱动,在系统启动时是否已经成功初始化。此外,设备的驱动程序也可以用 sysfs 来公开设备的控制面板,让用户能够改变设备的配置参数、调整工作模式等。
为了使一个设备的driver能够与其他Linux内核子系统进行集成,它应当符合设备模型的基本原则。这意味着设备应该声明自己的属性,并将其公开。此外,设备模型支持一种机制,即添加设备特定的属性或文件,以便于相应的设备驱动程序来控制这些属性或文件。例如,有一个名叫tfp401设备,它是一个液晶显示器的控制器。这个设备需要控制的寄存器位于/dev/tfp401文件中,这个tfp401驱动需要通过sysfs来公开这个文件并进行控制。
sysfs与内核模块
sysfs还提供了一个叫做内核模块的接口。内核模块,也被称为驱动程序,可以添加新的系统功能,或者改进现有的功能。一个模块就是一组定义、初始化及处理请求的函数。sysfs通过模块接口来使模块在系统中注册和取消注册。sysfs向用户公开了sys/module目录,这里存储了所有已注册模块的信息。
/sys/module
/module1 存储模块1相关信息
/module2 存储模块2相关信息
…
/modulen 存储模块n相关信息
根据上述的目录,在/sys/module/module1目录中可以找到如下的一些文件:
filename 模块文件的路径(只读)
holders 持有当前模块的模块列表(只读)
name 模块的名称(只读)
notes 模块的描述信息(只读)
parameters 模块使用的可配置参数(可读可写)
refcnt 对模块进行引用计数(只读)
sect_attrs 分部文件属性列表
srcversion 模块的源代码版本(只读)
对于开发者与系统管理员而言,sysfs的另外一个功能是方便调试。许多内核子系统都保存了调试信息,以便于发现问题,当这些信息出现时,用户可以在/sys/kernel/debug子目录下找到它们。内核调试的各个方面,包括网络调试、进程跟踪、内存调试和CPU分析等等,都分别有特定的文件/子目录来存储调试信息。
结论
在Linux内核中,sysfs是一种非常强大的工具,它可以帮助用户了解系统的特定组件、子系统和设备的详细信息。 sysfs 的实际应用非常广泛,可以用于许多不同的方面,包括驱动程序、内核模块和调试。由于 sysfs 能够对 Linux 内核中的对象进行统一表示,因此能够让开发人员和系统管理员更方便地进行管理和调试。作为Linux系统管理员,了解sysfs的这些基础知识是非常重要的。因此,相信这篇文章能给你带来更深入的系统理解,并且为你在日常管理和调试Linux系统中提供一些启示和帮助。