Linux2.6 的内核引入了 sysfs 文件系统。sysfs 被看成是与 proc,devfs,和 devpty 同类别的文件系统。sysfs 把连接在系统上的设备和总线组织成为一个分级的文件,它们可以被从用户的空间存取到。这是被设计用来处理那些以前驻留在 /proc/ 的设备和驱动程序指定的选件以及用来处理那些以前由 devfs 提供支持的动态加载设备。在早期的 sysfs 实现中,一些驱动和应用仍然被当做老的 proc 条目。但是 sysfs 是未来的发展方向。
提要
sysfs是2.6内核的一个特性,它允许内核代码经由一个in-memory的文件系 统把信息出报(export)到用户进程中,文件系统的目录等列(heirarchy)的组织是严格的,并构成了内核数据结构的内部组织的基础。在这种文 件系统中产生的文件大多数是ASCII文件,通常每个文件有一个值。这些特性保证了被出报的信息的准确性并易于被访问,从而使sysfs成为2.6内核的 最直观、最有用的特性之一。
介绍
sysfs是内核对象、属性及它们的相互关系的一种表现机制。它提供了两个组件:把这些条目通过 sysfs来出报的内核编程接口,和一个用户接口,用来查看和操作这些映射了它们所代表的内核对象的条目。下面这个表揭示了内部(内核)建制与他们的外部 (用户空间)sysfs映射。
内部----- 外部
内核对象---目录
对象属性---常规文件
对象关系---软连接
sysfs 是内核底层的一个核心成分,它的意义在于提供一个较为简单的接口来实施一项简单的任务,代码中很少有过分复杂的内容或含混的描述。然而,像许多底层的核心 成分一样,它会有点抽象和疏离以致于难以缕清思路。为了减轻困难,在进入实质性的细节之前本文先对sysfs来一个渐进的诠释。
首先写一段短小精悍的历史描述它的起源,其次是包括了对sysfs的挂载与访问的关键信息,而后传述了sysfs中的目录组织和子系统布局,它为用户理解通过sysfs出报的信息的组织与内容提供了足够的信息,尽管由于时间与篇幅的局限,不是每个对象及其属性都会被写到。
这 篇文章的首要目的是为内部sysfs接口 - 用来把内核建制向用户空间出报的数据结构与函数 - 提供一个技术视角,它描述了上面提到的三个概念(内核对象、对象属性和对象关系)中的函数,并为每个概念设一个章节。它还为另外两个用来简化一些普通操作 的常规文件接口 - 属性组与二进制属性 - 分别设一个章节。
sysfs是内核空间与用户空间之间的一个信息渠道,用户空间的应用程序有很多机会来利用这种信息,目前的利用法是I/O调度器的参数能力与udev程序。最末章节叙述了使用sysfs的当前应用的一个范例,并且为促使这个领域的进一步开发作一个鞭策。
因 为它是个简单的而且基本上是抽象的接口,所以需要很多时间来描述它与使用它的子系统们之间的交互。对于kobject与device model来说更是这样,这两个都是2.6内核的新特性并与sysfs密切地交织在一起,由于篇幅所限本文不可能对这些话题都充分地展开,还是把它们留给 其它的文章作主题吧。
1. sysfs 的历史
sysfs是一个in-memory 文件系统,最开始是基于ramfs的, ramfs是在2.4.0版内核稳定过程中的时候写成的,它作得很妙,通过它可以看到利用当时还是新事物的VFS layer写一个简单的文件系统是多么地容易,由于它简易并使用VFS,它成为一个好的基础,使其它的in-memory文件系统从它那里衍生出来。
sysfs 最初被称为ddfs(设备驱动文件系统),它的产生是为了调试正在开发过程中的新的驱动模型,调试代码最初使用procfs来出报设备树,但在莱纳斯*托瓦兹的严格的催促下,它转而使用了一个基于ramfs的新的文件系统。
当 时,这种新的设备模型被溶入内核(2.5.1前后),为了使其更明了给它换了个名字叫driverfs,次年在2.5版的开发中,这种设备模型与设备文件 系统的底层功能证明对其它的子系统很有用。kobject被开发出来,提供了一个中央对象管理机制,而设备文件系统则被转换成sysfs,来表示它的子系 统的不可预知性。
2. sysfs 的挂载
sysfs像其它基于内存的文件系统一样可以从用户空间挂载:
mount -t sysfs sysfs /sys
sysfs还能够在启动时用/etc/fstab文件来自动挂载。大多数支持2.6 内核的发行版都在 /etc/fstab有sysfs行:
sysfs /sys sysfs noauto 0 0
注意sysfs被挂载的目录:/sys, 这是sysfs 佳载点的事实标准位置,各主流发行版都采用这个作法。
3.sysfs 的浏览
既然sysfs是由目录、文件、软连接组成的集合,那么就可以用简单的 shell工具来浏览和操作,本人推荐用 tree(1)这个工具,它是内核对象底层的核心的开发过程中最得力的助手。
sysfs挂载点的顶层是一定数量的目录,这些目录代表了注册了sysfs的主要的子系统。在本文撰写之时, 这些目录是:
/sys/
| - - block
| - - bus
| - - class
| - - device
| - - firmware
| - - mod