passpark
作者passpark·2021-07-26 09:19
系统工程师·浪潮商用机器有限公司

使用/sys 文件系统进行设备管理

字数 2854阅读 1198评论 0赞 0

sysfs是一个虚拟文件系统,提供了访问Linux内核的一种途径。

sysfs与/sys

sysfs文件系统总是挂载在/sys挂载点上,随Linux启动而自动加载的。


可以看到/sys目录下有blcok,bus,class,dev,devices,firmware,fs,hypervisor,kernel,module,power这些子目录(根据平台及kernel版本不同,目录结构有所差异)。

第二个输出里,是一个具体的设备的信息,后缀/ 列出的是目录,@是符号链接。

下面介绍一下/sys文件系统下的目录结构

/sys 文件系统下的目录结构

/sys 下的目录结构是经过精心设计的:在 /sys/devices 下是所有设备的真实对象,包括如视频卡和以太网卡等真实的设备,也包括 ACPI 等不那么显而易见的真实设备、还有 tty, bonding 等纯粹虚拟的设备;在其它目录如 class, bus 等中则在分类的目录中含有大量对 devices 中真实对象引用的符号链接文件

/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/block这里是系统中当前所有的块设备所在,按照功能来说放置在 /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 文件系统查看物理设备信息及硬件扫描

以scsi_host 为例,如何查看scsi 磁盘的信息,并且重新扫描新增加的磁盘设备。


可以看到,实际上host0,host1,host2是符号链接,实际上是链接到PCI总线。进入到其中一个目录,如host0,在目录下有各种文件,代表了设备的属性。

其中的 scan 属性文件在调试一些 SCSI 硬件驱动时很有用,它是只写的,可以写入三个至四个以空格分开的整数,用于分别指定对应的 host, channel, id, lun 进行重新搜索。且这个 scan 属性支持以"-"作为通配符,如以下命令可以执行让整个 scsi_host 进行重新搜索,这个功能用于调试某些对热挺拔实现不完善的 SCSI 驱动程序很有用:

以VMware workstation GuestOS新增加一块SCSI磁盘为例:

  1. 在Vmware workstation虚拟机新增加一块10GB SCSI磁盘。
  2. 扫描新磁盘
  3. 确认新增加磁盘已经被系统识别发现
    dmesg输出确认(截取部分输出)

由此,新增加的10GB SCSI硬盘已被成功识别。

对于系统有HBA卡的,同样可以通过上述的方法扫描总线,来识别外部存储分配的LUN,而不用重启操作系统。注意HBA卡对应的目录是/sys/class/fc_host

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广