sysfs和/sys
sysfs文件系统始终挂载在/sys挂载点上。 在以前的2.6内核系统中,没有规定sysfs的标准装载位置,可以在任何位置装载sysfs,但最近的2.6内核修改了此规则,使sysfs始终装载在/sys目录中如果以前的sysfs装载位置不固定或未按标准装载,一些程序会从/proc/mounts分析是否装载了sysfs以及特定的装载点。 现在不需要这个步骤。 请参阅附录中列出的指向sysfs-rules.txt文件的链接。
sysfs和proc
sysfs与proc相比有很多优点,但最重要的不是设计上的清晰度。 proc虚拟文件可能具有内部格式,如/proc/scsi/scsi。 这是可写的。 (文件权限被错误标记为0444。这是内核错误),读写格式不同,表示不同的操作。 如果在APP应用程序中读取了此文件的内容,则通常还需要字符串分析,但在写入时必须以字符串格式指定的格式写入字符串,然后进行操作。 相反,sysfs的设计原则是一个属性文件只有一件事,sysfs属性文件通常只有一个值,直接读取或写入。 整个/proc/scsi目录在2.6内核中标记为过时(LEGACY ),其功能将完全替换为相应的/sys属性文件。 新的内核机制旨在尽可能使用sysfs机制,并将proc保留在纯“流程文件系统”中。
初识/sys
清单/与sys文件系统的交互(在系统上执行这些命令的结果可能与此不同,具体取决于内核版本号和外部设备) ) )。
$ ls -F /sys
block/bus/class/dev /设备/firmware/fs/kernel/module/power /
$ ls-f/sys/devices/PCI 0000336000/00033600033600336001.0/0000336001.0 /
broken _ parity _ statusenablemodaliasresource0romu event
classirqmsi _ bus resource0_ WC subsystem @ vendor
config local _ cpulistpower/resource1subsystem _ device
设备本地_ cpusresourceresource2subsystem _ vendor
这是Fedora 10中2.6.27.5-117.fc10.i686的内核,在/sys目录中包含block、bus、class、dev、devices、firmware、fs、kernel
第二个ls命令指示pci设备目录下的文件。 “ls”命令中的“-F”命令使用后缀显示列出的每个文件的文件类型。 后缀“/”表示目录,后缀“@”表示符号链接文件。 请注意,第二个目录包含“常规文件”(regular file )和“符号链接文件”(symbolic link file )。 以该具体设备为例,还介绍了每个常规文件的用途。
/sys文件系统的目录结构
/sys下的目录结构经过精心设计。 在/sys/devices下,对于所有设备的实际对象,包括显卡和以太网卡等实际设备、ACPI等不那么明显的实际设备以及tty、bonding等纯虚拟设备在其他目录(如class、bus等)中,一个符号链接文件,其分类的目录包含对设备中实际对象的许多引用; 清单1中/sys根目录下的顶层目录的含义如下:
表1. /sys中的目录结构
/sys下的子目录
包含的内容
/sys/devices
这是内核分层表示系统中所有设备的模型,也是/sys文件系统管理设备最重要的目录结构。 以下,进一步分析其内部结构;
/sys/dev
此目录下包含链接到字符设备和块设备主编号(major:minor,实际设备)/sys/devices下)的符号链接文件。 这是内核2.6.26中首次引入。
/sys/bus
这是一个目录结构,其中内核设备按总线类型分层排列,devices中的所有设备都连接在一条总线下。 这里的每条特定总线下都有一个指向每个特定设备的符号链接,也是Linux集成设备型号的组成部分。
/sys/class
这是按设备功能划分的设备型号,无论连接到系统的总线如何,系统中的所有输入设备都显示在/sys/class/input下。 也是构成Linux集成设备型号的一部分;
/sys/blo
ck这里是系统中当前所有的块设备所在,按照功能来说放置在 /sys/class 之下会更合适,但只是由于历史遗留因素而一直存在于 /sys/block, 但从 2.6.22 开始就已标记为过时,只有在打开了 CONFIG_SYSFS_DEPRECATED 配置下编译才会有这个目录的存在,并且在 2.6.26 内核中已正式移到 /sys/class/block, 旧的接口 /sys/block 为了向后兼容保留存在,但其中的内容已经变为指向它们在 /sys/devices/ 中真实设备的符号链接文件;
/sys/firmware
这里是系统加载固件机制的对用户空间的接口,关于固件有专用于固件加载的一套API,在附录 LDD3 一书中有关于内核支持固件加载机制的更详细的介绍;
/sys/fs
这里按照设计是用于描述系统中所有文件系统,包括文件系统本身和按文件系统分类存放的已挂载点,但目前只有 fuse,gfs2 等少数文件系统支持 sysfs 接口,一些传统的虚拟文件系统(VFS)层次控制参数仍然在 sysctl (/proc/sys/fs) 接口中中;
/sys/kernel
这里是内核所有可调整参数的位置,目前只有 uevent_helper, kexec_loaded, mm, 和新式的 slab 分配器等几项较新的设计在使用它,其它内核可调整参数仍然位于 sysctl (/proc/sys/kernel) 接口中 ;
/sys/module
这里有系统中所有模块的信息,不论这些模块是以内联(inlined)方式编译到内核映像文件(vmlinuz)中还是编译为外部模块(ko文件),都可能会出现在 /sys/module 中:
编译为外部模块(ko文件)在加载后会出现对应的 /sys/module//, 并且在这个目录下会出现一些属性文件和属性目录来表示此外部模块的一些信息,如版本号、加载状态、所提供的驱动程序等;
编译为内联方式的模块则只在当它有非0属性的模块参数时会出现对应的 /sys/module/, 这些模块的可用参数会出现在 /sys/modules//parameters/ 中,
如 /sys/module/printk/parameters/time 这个可读写参数控制着内联模块 printk 在打印内核消息时是否加上时间前缀;
所有内联模块的参数也可以由 ".=" 的形式写在内核启动参数上,如启动内核时加上参数 "printk.time=1" 与 向 "/sys/module/printk/parameters/time" 写入1的效果相同;
没有非0属性参数的内联模块不会出现于此。
/sys/power
这里是系统中电源选项,这个目录下有几个属性文件可以用于控制整个机器的电源状态,如可以向其中写入控制命令让机器关机、重启等。
/sys/slab (对应 2.6.23 内核,在 2.6.24 以后移至 /sys/kernel/slab)
从2.6.23 开始可以选择 SLAB 内存分配器的实现,并且新的 SLUB(Unqueued Slab Allocator)被设置为缺省值;如果编译了此选项,在 /sys 下就会出现 /sys/slab ,里面有每一个 kmem_cache 结构体的可调整参数。对应于旧的 SLAB 内存分配器下的 /proc/slabinfo 动态调整接口,新式的 /sys/kernel/slab/ 接口中的各项信息和可调整项显得更为清晰。
接下来对 /sys/devices/ 下的目录结构作进一步探讨:
本文来源:ibm