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 文件系统的主要内容,如果未能解决你的问题,请参考以下文章