系统分类信息 /sys

/sys/ 是由 sysfs 文件系统产生的 , 原本 sysfs 称为 ddfs (device driver file system) , 主要是为了将 kernel 的对象 (kernel object) 供一般的用户使用而做的桥梁 . 这里所谓的 kernel 对象 , 包含 kernel 对象 , 对象属性以及实体的关系 , 但这些都是 kernel 内部的信息 , 所以通过 sysfs 就可以呈现在用户面前 . sysfs 是因旧有的 procfs 文件系统产生的 , 2.6 kernel 之前的版本是看不到的 . /sys/ 完全是以分类的方式存放系统的信息的 .
当然作为虚拟文件系统 , 可以像下面这样挂载 :

# mount -t sysfs /mnt /mnt

/sys/block/

该目录以块设备分类 , 什么是块设备 ? 就是以 block (存放大小固定) 读写数据的设备 , 例如常用的硬盘 . 到目前为止未找到官方文件 , 以下列出的仅供参考
dev : 该设备文件的 Major 和 Minor Number , 可以参考 /dev/* 下的对应文件
removable : 设备是否可以移除 , 可移除标为 1 , 不可移除为 0
subsystem : 让用户可以通过此目录回到硬件的分类
size , range , stat , uevent : 看不出什么规则

/sys/bus/

该目录用主板上的总线类别作为所有的硬件的分类方式 . 比如 , 要找到系统上的光驱信息 , 因为它是 block 的方式 , 可以在上述的 /sys/block/ 下找到 , 也可以通过光驱总线种类找到一样的信息 :

# pwd
/sys/bus
# cat scsi/drivers/sr/1\:0\:0\:0/model
CD-ROM          
# cat /sys/block/sr0/device/model
CD-ROM          

在每一个 bus/ 下都会有两个子目录 : devices/ , drivers/ . 前者是基于该分类模式列出其上可找到的硬件设备清单 ; 后者则是存放在该分类模式下曾是用到的模块信息 . 但是在该目录下 , 还有一个方式将所有的设备做了进一步的关联 , 就是 "Symbolic Link" , bus/ 目录下将所有的设备以其总线模式分类 , 建立适当的 Symbolic Link 以转接到相关联的 /sys/ 目录下 (像 /sys/class/ , /sys/device/ ) .

/sys/class/

class 的分类方式使用 "功能名称" 来分类的 , 如 fireware , net , printer 等 . 因为 class 代表的是 kernel 中功能对象的分类 , 除了有些须供检查外 , 还可以通过里面的文件做出调整 , 比如网络接口 MTU 的大小 :

# pwd
/sys/class/net/eth0
# cat mtu
1500

/sys/devices/

该目录将所有在系统中被 kernel 在主板接口找到的硬件 , 以层级的架构一并展开 , 所以每一个硬件接口的目录下层 , 实际都是接在其接口上的硬件 , 如下 ,

# pwd
/sys/devices/pci0000:00
# cd 0000\:00\:03.0/
# l
broken_parity_status  device   local_cpus  power/     resource2         uevent
bus@                  driver@  modalias    resource   subsystem@        vendor
class                 enable   msi_bus     resource0  subsystem_device
config                irq      net:eth0@   resource1  subsystem_vendor

此系统的网络接口是接在 pci0000:00 下面的 0000:00:03:0 下的 , 因此可以在该目录下找到 net:eth0 的文件 , 而该接口也可以通过 lspci 取得 :

# lspci | grep net
00:03.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 40)

但是在该目录下也有例外的就是 paltform/ 和 system/ . 前者列举的是一些外围的设备如蓝牙 , 电源 , 扬声器等 ;而后者则是将非外围设备的硬件功能列出像 CPU , ACPI 等 .

/sys/fireware/

这里的 fireware 并非真的指存放硬件 fireware 的地方 , 而是 kernel 中的 driver 信息 , 也就是说 kernel 默认支持的 driver 可在此目录中查询 , 诸如网卡 , 硬盘 , ACPI 等 . 不过在该目录下值 , 很多是参考 BIOS 中的 ACPI DSDT table , 其实也是在参考 /proc/acpi/dsdt/ 文件中数据 , 读取该文件需要特殊的工具才可将该文件转换成可读的格式 .

/sys/fs/

空目录 . 有点像 /proc/fs/

/sys/kernel/

该目录存放的是一些和 kernel 使用上直接相关的文件 , 用到的机会比较少 , 因为大部分跟 kernel 的开发人员相关 .
kexec_crash_loaded : 是否开启 "当 kernel crash 时将 kernel 的实时状态写入存储设备中" 的功能 , 0 为关闭 .
uevent_seqnum : 该文件是 udev 所产生的 event 数目或序号  , 在系统加载某硬件或者模块时 , 若符合 udev 的规则而触发某 event , 该文件的值就要增加 .

/sys/module/

该目录是所有 kernel 内部或是被系统所加载的模块信息存放的地方 , 因为里面包含所有 kernel 都会使用到的模块 , 所以一定会涵盖到 /sys/firmware/ 所介绍的部分 . 不过在此目录下的对象并不是每一个都已经加载 , 如果已经被加载的模块 , 其对象下一定会有固定的两个文件 , sections/ 和 refcnt 文件 :
sections/ : 里面的文件代表该模块内存段 (sections) 的地址
refcnt : 全名位 reference count , 就是该模块被系统其他模块引用的次数 , 该次数其实跟 lsmod 中的次数代表的是同一个值

# cat refcnt
4
# lsmod | grep scsi
scsi_mod              137549  4 sr_mod,sg,libata,sd_mod

/sys/power/

该目录存放和电源模式相关的文件 , 更准确的说是只存放电源管理机制的文件 .

disk : 当用户在做休眠模式 S4 的 STD ( suspend to disk , 或称 Hibernate ) 时 , 要将系统的状态写入硬盘中 , 因此 , 是在定义当状态写入硬盘后 , 系统该如何运行 . 目前 2.6 的内核支持以下 5 中模式 :
platform : 不知其运行方式 , 但只有该平台支持时才可使用 .
shutdown : 进入休眠时进入关机状态 .
reboot : 进入休眠时进入重启状态 .
restproc : testproc 于下一个 test 两者的模式比较特别 , 都属于实时测试休眠功能所可以使用的状态 , 也就是让用户进入仿真的休眠模式 , 再自动回复到原本的系统状态 , 所以一直都在原来的使用状态下 .
test : 和 testproc 不同 , 是在测试时更完整 , 连内存和硬件设备的部分都加入模拟阶段 .
这 5 种模式最常用的就是 shutdown .
image_size : 目前系统可接受的最大 image , 默认是 512 M.
pm_trace : 这是一个控制开关 , 可以决定是否要记录在多次重启后 , 最后一次存在 RTC 中的事件点 , 默认是 0 , 代表不记录 .
resume : 它是当系统进入 S4 (Suspend to disk) 时 , 要将系统状态写入的位置 , 所以该属性其实代表的是某一个分区的 major 及 minor ID (一般在 swap 区) , 若须使用 resume 分区 , 就必须在启动时先在 grub 的开机参数中 , 加入 resume=/dev/XXX 的参数 , 才可以让系统知道该分区作为写入的分区 . resume 的值之所以是 0:0 , 是因为主机中没有设定该参数 .
state : 目前系统可支持的休眠模式 , 一般支持以下 3 种 :

standby : 就是所谓的 S1 , 它是休眠状态中最耗电的一种 , CPU 中的 cache 持续供电 , 但停止执行命令 , 在 CPU 及内存的部分都有电力供应 , 其他的装置没有硬性规定 .
mem
: 就是 S3 ( Suspend to ram ) , 只有主存储器有接受供电的权利 , 虽然大部分的数据会回写到内存 , 但硬盘本身的 buffer 有可能来不及写回到硬盘 , 这样会造成损失 .
disk : 就是 S4 (suspend to disk) 俗称休眠状态 (Hibernet) , 其技术称 suspend to disk , STD , 这一阶段会将所有执行中的数据全部写入到硬盘中 , 之所以要写入到硬盘中 , 就是因为要全部断电 , 也因此要比 S3 花费更长的时间恢复到原来的状态 .
简单的说 , 如果将 state 文件以 disk 写入 , 等于切换 state 开关至 disk 选项 , 因此 , 系统就会直接进入休眠 .

参考自 : 邱世华 Linux 系统架构与目录解析

  • http://www.alexgao.com Alex Gao

    很高心看到你在我网站上的留言,是的,我也是NUPTer,刚毕业不久,甚怀念大学四年,甚怀念NUPT SAST,甚怀念在科协通宵捣腾Linux的日子

    • http://jaseywang.info jaseywang

      学长好 :-),现在工作了?

      • http://www.alexgao.com Alex Gao

        恩 是的 也没工作多久~

  • adam

    嗯,udev就是根据sysfs的来确定装载的内核模块的。
    sysfs主要还是看其中的ATTR来进行udev规则匹配的。