linux /sys目录下各个子目录的具体说明

本文详细解读了Linux内核中的/sys文件系统下的关键目录及其作用,包括/sys下的子目录、/sys/dev、/sys/class、/sys/block、/sys/bus、/sys/fs、/sys/kernel和/sys/firmware的用途和内容。通过分析这些目录,理解Linux内核如何管理和组织系统中的设备。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/sys下的子目录
内容
 # ls /sys/
block     class     firmware  kernel    power
bus       devices   fs        module
-----------------------------------------------------------------------------------------------------------------------------
1./sys/devices
# ls /sys/devices/
platform  system

# ls /sys/devices/platform/
dm9000.0        s3c2410-rtc     s3c2440-uart.0  s3c24xx_led.2 
power           s3c2410-wdt     s3c2440-uart.1  s3c24xx_led.3
s3c2410-iis     s3c2440-i2c     s3c2440-uart.2  serial8250
s3c2410-lcd     s3c2440-nand    s3c24xx_led.0   serial8250.0
s3c2410-ohci    s3c2440-sdi     s3c24xx_led.1   uevent
# ls /sys/devices/system/
clocksource   s3c2410-core  s3c2440-core  s3c2443-core  timekeeping
cpu           s3c2412-core  s3c2442-core  s3c24xx-dma   timer
该目录下是全局设备结构体系,包含所有被发现的注册在各种总线上的各种物理设备。一般来说,所有的物理设备都按其在总线上的拓扑结构来显示,但有两个例外,即platform devices和system devices。platform devices一般是挂在芯片内部的高速或者低速总线上的各种控制器和外设,它们能被CPU直接寻址;system devices不是外设,而是芯片内部的核心结构,比如CPU,timer等,它们一般没有相关的驱动,但是会有一些体系结构相关的代码来配置它们。
(sys/devices是内核对系统中所有设备的分层次表达模型,也是/sys文件系统管理设备的最重要的目录结构)
 ----------------------------------------------------------------------------------------------------------------------------
2.sys/dev
该目录下维护一个按照字符设备和块设备的主次号码(major:minor)链接到真是设备(/sys/devices)的符号链接文件。
---------------------------------------------------------------------------------------------------------------------------- 
3./sys/class
# ls /sys/class/
graphics      misc          printer       sound         vc
hwmon         mmc_host      rtc           spi_master    vtconsole
i2c-adapter   mtd           scsi_device   tty
input         net           scsi_disk     usb_endpoint
mem           ppdev         scsi_host     usb_host
该目录下包含所有注册在kernel里面的设备类型,这是按照设备功能分类的设备模型,每个设备类型表达具有一种功能的设备。每个设备类型子目录下都是这种设备类型的各种具体设备的符号链接,这些链接指向/sys/devices/name下的具体设备。设备类型和设备并没有一一对应的关系,一个物理设备可能具备多种设备类型;一个设备类型只表达具有一种功能的设备,比如:系统所有输入设备都会出现在/sys/class/input之下,而不论它们是以何种总线连接到系统的。(/sys/class也是构成linux统一设备模型的一部分)
---------------------------------------------------------------------------------------------------------------------------- 
/sys/block
# ls /sys/block/
loop0      loop4      mtdblock0  ram0       ram12      ram2       ram6
loop1      loop5      mtdblock1  ram1       ram13      ram3       ram7
loop2      loop6      mtdblock2  ram10      ram14      ram4       ram8
loop3      loop7      mtdblock3  ram11      ram15      ram5       ram9
该目录下的所有子目录代表着系统中当前被发现的所有块设备。按照功能来说放置在/sys/class下会更合适,但由于历史遗留因素而一直存在于/sys/block,但从linux2.6.22内核开始这部分就已经标记为过去时,只有打开了CONFIG_SYSFS_DEPRECATED配置编译才会有这个目录存在,并且其中的内容在从linux2.6.26版本开始已经正式移到了/sys/class/block,旧的接口/sys/block为了向后兼容而保留存在,但其中的内容已经变为了指向它们在/sys/devices/中真实设备的符号链接文件。
 ----------------------------------------------------------------------------------------------------------------------------
/sys/bus
# ls /sys/bus/
i2c       mmc       platform  scsi      serio     spi       usb
该目录下的每个子目录都是kernel支持并且已经注册了的总线类型。这是内核设备按照总线类型分层放置的目录结构,/sys/devices中的所有设备都是连接于某种总线之下的,bus子目录下的每种具体总线之下可以找到每个具体设备的符号链接,一般来说每个子目录(总线类型)下包含两个子目录,一个是devices,另一个是drivers;其中devices下是这个总线类型下的所有设备,这些设备都是符号链接,它们分别指向真正的设备(/sys/devices/name/下);而drivers下是所有注册在这个总线上的驱动,每个driver子目录下 是一些可以观察和修改的driver参数。
(它也是构成linux统一设备模型的一部分)
-----------------------------------------------------------------------------------------------------------------------------
/sys/fs
【空】
按照设计,该目录使用来描述系统中所有的文件系统,包括文件系统本身和按照文件系统分类存放的已挂载点。
-----------------------------------------------------------------------------------------------------------------------------
/sys/kernel
# ls /sys/kernel/
uevent_helper  uevent_seqnum
这个目录下存放的是内核中所有可调整的参数
-----------------------------------------------------------------------------------------------------------------------------
/sys/firmware
【空】
该目录下包含对固件对象(firmware object)和属性进行操作和观察的接口,即这里是系统加载固件机制的对用户空间的接口.(关于固件有专用于固件加载的一套API)
-----------------------------------------------------------------------------------------------------------------------------
/sys/hypervisor【X】
该目录是与虚拟化Xen相关的装置。(Xen是一个开放源代码的虚拟机监视器)
-----------------------------------------------------------------------------------------------------------------------------
/sys/module
# ls /sys/module/
8250          loop          rcupdate      snd_pcm       usb_storage
atkbd         lp            rd            snd_soc_core  usbcore
dm9dev9000c   mousedev      s3c2410_wdt   snd_timer     usbhid
hid           nfs           s3c_ts        sunrpc        vt
keyboard      ohci_hcd      scsi_mod      tcp_cubic     yaffs
lockd         printk        snd           tsdev
该目录下有系统中所有的模块信息,不论这些模块是以内联(inlined)方式编译到内核映像文件中还是编译为外模块(.ko文件),都可能出现在/sys/module中。即module目录下包含了所有的被载入kernel的模块。
---------------------------------------------------------------------------------------------------------------------------- 
/sys/power
\# ls /sys/power/
state

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


from:http://tscsh.blog.163.com/blog/static/20032010320131051738843/

<think>我们正在处理用户的问题:如果/dev下没有i2c总线文件 根据之前的回答,我们已经给出了详细的排查步骤。现在用户提供了新的引用信息,并提到“我想用户意图是查找在Linux系统下与sys/class相关的信息,可能是在继续之前的问题,试图寻找与设备文件、i2c总线相关的系统接口或解决方案。” 同时用户直接的问题是:“请问Linux sys/class device i2c bus file not found” 注意:用户引用了一些系统输出,例如在/sys/bus/i2c/devices下存在i2c-0, i2c-1等,但用户的问题是关于/dev下没有i2c设备文件,以及现在又提到了sys/class。 我们需要理解sys/class和/dev的关系: - /sys/class 是sysfs虚拟文件系统的一部分,它按设备类别提供设备的统一视图,每个设备在该目录下有一个子目录,其中包含设备的属性。 - /dev 是devtmpfs文件系统,包含设备节点(设备文件),用户程序通过这些设备节点与设备交互。 对于I2C,通常: - 在/sys/bus/i2c/devices/ 下会有以i2c总线编号命名的目录(如i2c-0, i2c-1)以及连接到这些总线上的设备(如0-005d, 1-0018)。 - 在/dev 下应该有i2c设备节点(如/dev/i2c-0, /dev/i2c-1),这些节点是由i2c-dev模块创建的。 用户现在提到“sys/class device i2c bus file not found”,可能是指他在/sys/class下没有找到期望的i2c相关内容?但注意,在sysfs中,I2C设备通常出现在/sys/bus/i2c/下,而不是/sys/class/下。不过,/sys/class/下会有一个指向bus/i2c/devices的符号链接目录,名为i2c-dev(如果i2c-dev模块加载的话)? 实际上,当我们加载了i2c-dev模块后,会在/sys/class/下创建一个i2c-dev的类,然后每个i2c总线设备会在/sys/class/i2c-dev/下生成一个设备目录(如i2c-0,i2c-1等),这些目录中的dev文件包含了设备的主次设备号,而udev会利用这些信息在/dev下创建设备节点。 所以,如果用户没有在/sys/class/i2c-dev/下看到设备,那可能意味着i2c-dev模块没有加载,或者没有成功创建设备。 因此,我们可以这样回答: 1. 首先,检查i2c-dev模块是否加载,因为该模块负责在/sys/class/i2c-dev/下创建设备目录,并在/dev下创建设备节点。 2. 如果模块没有加载,则加载它:`sudo modprobe i2c-dev` 3. 然后检查/sys/class/i2c-dev/目录是否存在,以及下面是否有对应的i2c设备目录(如i2c-0, i2c-1等)。 4. 如果/sys/class/i2c-dev/下没有,则可能是I2C总线本身没有被系统识别(即没有i2c总线设备),需要检查I2C控制器驱动是否加载。 另外,用户之前已经提供了引用[1]中的内容,显示在/sys/bus/i2c/devices/下存在i2c-0, i2c-1等,说明I2C总线已经被系统识别(因为i2c总线设备已经注册)。那么为什么没有在/sys/class/i2c-dev/下出现?原因就是缺少i2c-dev模块。 所以,步骤应该是: - 加载i2c-dev模块:`sudo modprobe i2c-dev` - 然后检查/sys/class/i2c-dev/目录,应该会出现i2c-0, i2c-1等目录。 - 同时,/dev下应该会出现对应的设备节点。 如果加载了i2c-dev模块后,/sys/class/i2c-dev/下出现了设备目录,但/dev下没有设备节点,那么可能是udev规则的问题,可以尝试手动创建设备节点(使用mknod)或者检查udev规则。 但是,根据引用[4],在/proc/devices中已经显示了i2c设备(主设备号89): Character devices: ... 89 i2c ... 所以,我们可以手动创建: sudo mknod /dev/i2c-0 c 89 0 sudo mknod /dev/i2c-1 c 89 1 ... 以此类推 但更建议通过加载i2c-dev模块让系统自动创建。 另外,引用[5]是关于I2C驱动probe函数的代码,与当前问题关系不大。 因此,针对用户的问题“Linux sys/class device i2c bus file not found”,我们可以这样回答:</think>### 解决 `/sys/class` 下缺少 I2C 设备文件的问题 当在 `/sys/class` 目录下找不到 I2C 总线相关文件时(如 `/sys/class/i2c-dev`),通常表明内核 I2C 子系统未完全初始化或设备未正确注册。以下是系统化解决方案: #### 1. **验证 I2C 核心支持** ```bash # 检查 I2C 核心模块是否加载 lsmod | grep i2c_core # 若未加载则手动加载 sudo modprobe i2c_core ``` I2C 核心模块 (`i2c_core`) 是 I2C 子系统的基础[^2]。 #### 2. **加载 I2C 控制器驱动** ```bash # 根据硬件平台加载对应控制器驱动 sudo modprobe i2c_designware # Intel/AMD 平台 sudo modprobe i2c_bcm2835 # 树莓派 sudo modprobe i2c_imx # NXP i.MX # 检查驱动加载状态 dmesg | grep -i i2c ``` 驱动加载成功后内核日志会显示控制器初始化信息。 #### 3. **检查 I2C 总线注册状态** ```bash # 查看 /sys/bus/i2c 目录结构 ls /sys/bus/i2c/devices # 典型输出(引用用户示例[^1]): # 0-005d 1-0018 i2c-0 i2c-1 i2c-2 ``` 若存在 `i2c-0`、`i2c-1` 等目录说明总线已注册,但需要进一步激活用户接口。 #### 4. **加载 i2c-dev 模块** ```bash # 创建用户态接口 sudo modprobe i2c-dev # 验证接口创建 ls /sys/class/i2c-dev ``` 加载后应在 `/sys/class` 下生成 `i2c-dev` 目录,包含各总线设备(如 `i2c-0`)[^4]。 #### 5. **检查设备树配置(嵌入式系统)** 在设备树源文件(`.dts`)中确保包含: ```dts &i2c1 { compatible = "vendor,i2c-controller"; status = "okay"; // 示例:挂载设备 eeprom@50 { compatible = "at24,24c02"; reg = <0x50>; }; }; ``` 重新编译并加载设备树: ```bash sudo make dtbs sudo cp new.dtb /boot/ ``` #### 6. **手动触发设备探测** ```bash # 强制重新探测总线 echo 1 > /sys/bus/i2c/rescan # 检查设备绑定状态 ls /sys/bus/i2c/drivers ``` 此操作会触发内核的 `i2c_device_probe()` 流程[^5]。 #### 7. **验证修复结果** ```bash # 确认 sysfs 接口存在 ls /sys/class/i2c-dev/ # 应显示: i2c-0 i2c-1 ... # 检查设备节点 ls /dev/i2c-* ``` > **根本原因总结**: > - `/sys/class` 下缺少 I2C 设备文件通常表明: > 1. I2C 控制器驱动未加载或初始化失败 > 2. `i2c-dev` 模块未加载(负责创建用户接口) > 3. 设备树配置错误(嵌入式平台) > - 通过加载驱动模块和验证 sysfs 层次结构可解决多数问题[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值