Linux sys 子系统

在 Linux 系统中,“sys 子系统” 通常指以 sysfs 虚拟文件系统 为核心的一套内核子系统。

它是 Linux 设备模型的用户空间接口,主要用于 暴露内核对象(如设备、驱动、内核组件等)的信息、属性及层次关系,并提供用户空间与内核对象的交互通道。

sysfs 最早在 Linux 2.6 内核中引入,如今已成为 Linux 设备管理、内核状态监控的核心组件之一。

1.1 sys 子系统的核心:sysfs 虚拟文件系统

sysfs 的本质是一个 内核态与用户态之间的 “桥梁”,它通过虚拟文件的形式将内核中的对象(如设备、驱动、总线等)及其属性映射到用户空间(挂载点通常为 /sys)。

用户可通过读写 /sys 下的文件,直接获取内核对象信息或修改其配置(需权限)。

与 proc 文件系统(/proc)不同,sysfs 更强调 “层次化结构” 和 “对象属性”

  • proc 侧重进程状态、系统全局信息(如 /proc/cpuinfo);
  • sysfs 则聚焦于设备、驱动等内核对象的 “结构化信息”(如设备的厂商、状态、配置参数),且数据格式更规范(多为键值对或简单数值)。

1.2 sysfs 的目录结构(/sys 下的核心目录)

/sys 的目录结构严格对应内核设备模型的层次关系,核心目录如下:

目录路径 作用说明
/sys/devices 最核心目录,存放所有内核识别的 “物理 / 虚拟设备” 的实际对象,按设备拓扑结构(如 PCI 总线、USB 总线)层级组织。
/sys/class 按 “设备功能类型” 分类的设备链接(软链接),如 /sys/class/net(网络设备)、/sys/class/block(块设备)、/sys/class/leds(LED 设备)等,不依赖物理总线,方便用户按功能查找设备。
/sys/bus 按 “总线类型” 分类的设备与驱动(如 /sys/bus/pci/sys/bus/usb),包含 devices(该总线上的设备)和 drivers(该总线的驱动)子目录,体现 “总线 - 设备 - 驱动” 的绑定关系。
/sys/drivers 所有内核驱动程序的目录,每个驱动对应一个子目录,包含其绑定的设备(bind/unbind文件用于手动绑定 / 解绑设备)。
/sys/fs 内核支持的文件系统相关信息(如 /sys/fs/ext4 存放 ext4 文件系统的配置)。
/sys/kernel 内核核心功能的配置与状态(如 /sys/kernel/debug 用于调试,/sys/kernel/mm 内存管理相关)。
/sys/module 已加载内核模块的信息,每个模块对应一个子目录,包含模块参数、依赖等(如 /sys/module/usbcore 是 USB 核心模块)。
/sys/power 系统电源管理相关配置(如休眠状态、电源模式)。

shell 控制 led

示例程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

# 关闭led的闪烁
echo none > /sys/class/leds/work-led/trigger

# 判断参数是1还是0,并控制led的亮和灭
if [ "$1" == "1" ]; then
echo 1 > /sys/class/leds/work-led/brightness
elif [ "$1" == "0" ]; then
echo 0 > /sys/class/leds/work-led/brightness
fi


系统程序控制 led

示例程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <fcntl.h> // open
#include <unistd.h> // close/read/close/lseek

int main(int argc, char *argv[])
{
int fd;
fd = open("/sys/class/leds/work-led/trigger", O_WRONLY);
if (fd < 0)
{
perror("open led trigger file fail");
return -1;
}

if (write(fd, "none", 5) < 0)
{
perror("close led trigger fail");
return -1;
}

close(fd);


fd = open("/sys/class/leds/work-led/brightness", O_WRONLY);
if (fd < 0)
{
perror("open led brightness file fail");
return -1;
}

if (write(fd, argv[1], 2) < 0)
{
perror("set led brightness fail");
return -1;
}

close(fd);

return 0;
}