sysfs 文件系统

Posted Li-Yongjun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sysfs 文件系统相关的知识,希望对你有一定的参考价值。

活动地址:CSDN21天学习挑战赛

文章目录

由来

  sysfs 文件系统是 Linux 众多文件系统中的一个。在 Linux 系统中,每一个文件系统都有其特殊的用途,如 ext2 用于快速读写存储文件,ext3 用来记录日志文件。
  Linux 设备驱动模型由大量的数据结构和算法组成。这些结构之间的关系非常复杂,多数结构之间通过指针互相关联,构成树型或者网状关系。显示这种关系的最好方法是利用一种树型的文件系统,但是这种文件系统需要具有其它文件系统没有的功能,例如显示内核中的一些关于设备、驱动和总线的信息。
  为了达到这个目的,Linux 内核开发者创建了一种新的文件系统,这就是 sysfs 文件系统。

特性

  sysfs 文件系统是 Linux 2.6 内核的一个新特性,它是一个只存在于内存中的文件系统。内核通过这个文件系统将信息导出到用户空间中。
  sysfs 文件系统目录之间的关系非常复杂,各目录与文件之间既有树型关系,又有目录关系。在内核中,这种关系由设备驱动模型来表示。
  在 sysfs 文件系统中产生的文件大多数是 ASCII 文件,通常每个文件有一个值,而且易于访问。
  Linux 设备模型如同一栋规模宏大的建筑,为了构建它,除了基本的建筑材料(kobject、kset 等基础数据结构)外,尚需要一种机制,来向建筑外面的世界(用户空间程序)展示内部的构造,并且通过文件接口的方式实现与外界的沟通与互动。sysfs 文件系统就充当了这种角色。
  透过 sysfs 文件系统可以取代 ioctl 的功能,如果想向一个设备文件发送 ioctl 命令的话,首先需要打开该设备文件,然后再通过 ioctl 函数向设备发出命令,很显然需要一个完整(虽然代码可能很简单)的应用程序来做这件事。现在有了 sysfs 文件系统,一个很简单的 shell 命令也许就可以完成前面所说的工作。
  对于用户进程中的文件系统来说,sysfs 的标准挂载点是 /sys 目录,将 sysfs 文件系统挂载到用户进程的 /sys 目录的命令为 mount -t sysfs sysfs /sys。如此,所有内核层面的对 sysfs 文件树的操作,都将一成不变地显示在用户空间的 /sys 目录下。

目录

  sysfs 文件系统与其它文件系统一样,由目录、文件、链接组成。sysfs 文件系统只存在于内存中,动态的表示着内核的数据结构。
  sysfs 文件系统挂接了一些子目录,这些目录代表了注册在 sysfs 中主要的子系统。

# ls /sys/
block  bus  class  dev  devices  firmware  fs  kernel  module  power

block

block 目录包含了在系统中发现的每个块设备,每个块设备对应一个子目录。每个块设备的目录中有各种属性,描述了设备的各种信息。例如设备的名称、大小、设备号等。

# cat /sys/block/mmcblk1/device/name 
8GTF4R
# cat /sys/block/mmcblk0/device/name 
SD8GB

bus

bus 目录包含了在内核中注册而得到支持的每个物理总线的子目录,例如 ide、pci、scsi、usb、i2c、sdio 总线等。

# ls /sys/bus/
clockevents  clocksource  container  cpu  event_source  hid  i2c  mdio_bus  mmc  platform  rpmsg  scsi  sdio  serio  soc  spi  usb  virtio  workqueue

其中每个目录中的结构都大同小异。这里以 usb 目录为例,分析其目录结构关系。

# ls /sys/bus/usb/
devices  drivers  drivers_autoprobe  drivers_probe  uevent

usb 目录中包含了 devices 和 drivers 目录。devices 目录包含了 USB 总线下所有的设备,这些设备实际上是指向 devices 目录中相应设备的符号链接。

# ls /sys/bus/usb/devices/ -l
total 0
lrwxrwxrwx 1 root root 0 Aug 19 19:39 1-0:1.0 -> ../../../devices/platform/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-0:1.0
lrwxrwxrwx 1 root root 0 Aug 19 19:39 1-1 -> ../../../devices/platform/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1
lrwxrwxrwx 1 root root 0 Aug 19 19:39 1-1:1.0 -> ../../../devices/platform/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1:1.0
lrwxrwxrwx 1 root root 0 Aug 19 19:39 usb1 -> ../../../devices/platform/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1

其中 1-0:1.0 和 1-1:1.0 是 USB 设备的名称,这些名称由 USB 协议规范来定义。链接的目的是为了构建 sysfs 文件系统的层次结构。
drivers 目录包含了 USB 总线下注册时所有驱动程序的目录。每个驱动目录中,有允许查看和操作设备参数的属性文件,和指向该设备所绑定的物理设备的符号链接。

# ls /sys/bus/usb/drivers/usb/ -lh
total 0
lrwxrwxrwx 1 root root    0 Aug 19 23:18 1-1 -> ../../../../devices/platform/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1
--w------- 1 root root 4.0K Aug 19 23:18 bind
--w------- 1 root root 4.0K Aug 19 23:18 uevent
--w------- 1 root root 4.0K Aug 19 23:18 unbind
lrwxrwxrwx 1 root root    0 Aug 19 23:18 usb1 -> ../../../../devices/platform/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1

class

class 目录中的子目录表示每一个注册到内核中的设备类。例如固件类(firmware)、混杂设备类(misc)、图形类(graphics)、声音类(sound)、和输入类(input)等。

# ls /sys/class/
ata_device  backlight  dma       gpio      ieee80211  leds      misc      net           ptp  regulator  scsi_device  sound       tty  vc           watchdog
ata_link    bdi        drm       graphics  input      mdio_bus  mmc_host  power_supply  pwm  rfkill     scsi_disk    spi_master  ubi  video4linux
ata_port    block      firmware  i2c-dev   lcd        mem       mtd       pps           rc   rtc        scsi_host    thermal     udc  vtconsole

dev

该目录下有很多以主设备号:次设备号(major:minor)命名的文件,这些文件都链接到 /sys/devices 目录下对应的设备。

# ls /sys/dev/char/
10:130  10:237  10:61  1:11    13:64  1:8    207:16  252:0  254:0  4:10  4:14  4:18  4:21  4:25  4:29  4:32  4:36  4:4   4:43  4:47  4:50  4:54  4:58  4:61  4:8  5:2    7:129  89:0
10:183  10:58   10:62  116:33  13:65  189:0  207:18  252:1  29:0   4:11  4:15  4:19  4:22  4:26  4:3   4:33  4:37  4:40  4:44  4:48  4:51  4:55  4:59  4:62  4:9  7:0    7:130  89:1
10:229  10:59   10:63  1:3     1:5    189:1  226:0   253:0  4:0    4:12  4:16  4:2   4:23  4:27  4:30  4:34  4:38  4:41  4:45  4:49  4:52  4:56  4:6   4:63  5:0  7:1    7:2
10:235  10:60   1:1    13:63   1:7    1:9    251:0   253:1  4:1    4:13  4:17  4:20  4:24  4:28  4:31  4:35  4:39  4:42  4:46  4:5   4:53  4:57  4:60  4:7   5:1  7:128  81:0
# ls /sys/dev/block/
1:0  1:10  1:12  1:14  1:2  1:4  1:6  179:0  179:16  179:18  179:32  179:64  1:9  7:1  7:3  7:5  7:7
1:1  1:11  1:13  1:15  1:3  1:5  1:7  179:1  179:17  179:2   179:48  1:8     7:0  7:2  7:4  7:6

device

这是系统中所有设备存放的目录,也就是系统中所有设备在 sysfs 中的呈现、表达,也是 sysfs 管理设备的最重要的目录结构。

firmware

firmware 目录下有两个文件:devicetree 和 fdt。
fdt 是原始 dtb 文件,可以用 hexdump -C fdt 将其打印出来看,就会发现里面的数据和 dtb 文件时一致的。
devicetree 以目录结构呈现 dtb 文件。根节点对应 base 目录,每一个节点对应一个目录,每一个属性对应一个文件。
/proc/device-tree 指向 /sys/firmware/devicetree/base

fs

用于描述系统中的文件系统

kernel

存放内核所有可调整的参数

module

该目录下有系统中所有的模块信息,不论这些模块是静态编译进内核的还是动态加载到内核的。

power

系统中的电源选项,对正使用的 power 子系统的描述。这个目录下有几个属性文件可以用于控制整个机器的电源状态,如可以向其中写入控制命令让机器关机/重启等等。

以上是关于sysfs 文件系统的主要内容,如果未能解决你的问题,请参考以下文章

sysfs 文件系统

sysfs文件系统的建立

linux sysfs

sysfs和kobject

认识 linux sysfs文件系统

Linux之udev,mdev,devfs,sysfs,uevent之间关系