Linux基础入门--文件系统--debugfs/procfs/sysfs/squashfs

Linux基础入门--文件系统--debugfs/procfs/sysfs/squashfs

1.debugfs

debugfs是一种用于内核调试的虚拟文件系统,内核开发者通过debugfs和用户空间交换数据。类似的虚拟文件系统还有procfs和sysfs等,这几种虚拟文件系统都并不实际存储在硬盘上,而是Linux内核运行起来后才建立起来。
通常情况下,最常用的内核调试手段是printk。但printk并不是所有情况都好用,比如打印的数据可能过多,我们真正关心的数据在大量的输出里不是那么一目了然;或者我们在调试时可能需要修改某些内核变量,这种情况下printk就无能为力,而如果为了修改某个值重新编译内核或者驱动又过于低效,此时就需要一个临时的文件系统可以把我们需要关心的数据映射到用户空间。安装模块需要通过挂载,创建目录,创建文件,不用时需要卸载模块,清除该模块创建的目录或文件。默认情况下,debugfs会被挂载在目录/sys/kernel/debug。

2.procfs

procfs 是进程文件系统 (file system) 的缩写,包含一个伪文件系统(启动时动态生成的文件系统),用于通过内核访问进程信息。这个文件系统通常被挂载到 /proc 目录。由于 /proc 不是一个真正的文件系统,它也就不占用存储空间,只是占用有限的内存。在当今的Linux系统中,大量的系统工具也通过procfs获取内核参数,例如ps,lspci等等,没有procfs它们将可能不能正常工作。在proc文件系统中,主要包含三大类内容,进程相关部分,系统信息部分,以及系统子系统部分。

2.1 进程目录

文件 含义
/proc/PID/cmdline 启动该进程的命令行.
/proc/PID/cwd 当前工作目录的符号链接.
/proc/PID/environ 影响进程的环境变量的名字和值.
/proc/PID/exe 最初的可执行文件的符号链接, 如果它还存在的话
/proc/PID/fd 一个目录,包含每个打开的文件描述符的符号链接
/proc/PID/fdinfo 一个目录,包含每个打开的文件描述符的位置和标记
/proc/PID/maps 一个文本文件包含内存映射文件与块的信息
/proc/PID/mem 一个二进制图像(image)表示进程的虚拟内存, 只能通过ptrace化进程访问
/proc/PID/root 该进程所能看到的根路径的符号链接。如果没有chroot监狱,那么进程的根路径是/
/proc/PID/status 包含了进程的基本信息,包括运行状态、内存使用
/proc/PID/task 一个目录包含了硬链接到该进程启动的任何任务

2.2 非进程目录

文件 含义
/proc/buddyinfo 信息关于伙伴内存分配器用于处理内存碎片
/proc/bus 包含对应于计算机上各种总线的目录, 如input/PCI/USB. 在/sys/bus下包含更丰富的信息
/proc/fb 可利用的帧缓冲的列表
/proc/cmdline 传递给内核的启动选项
/proc/cpuinfo 包含CPU信息, 诸如厂商(vendor),型号 (family, model,model names), 速度, 缓存大小
/proc/crypto 可利用的加密模块列表
/proc/devices 字符设备与块设备列表,按照设备ID排序,但给出了/dev名字的主要部分
/proc/diskstats 给出了每一块逻辑磁盘设备的一些信息
/proc/filesystems 当前时刻内核支持的文件系统的列表
/proc/interrupts,/proc/iomem,/proc/ioports,/proc/irq 设备的一些与中断、内存访问有关的信息
/proc/kmsg 内核输出的一些信息
/proc/meminfo 包含内核管理内存的一些汇总信息
/proc/modules 是/proc最重要的文件之一, 包含了当前加载的内核模块列表
/proc/mounts 包含了当前安装设备及安装点的符号链接
/proc/net/ 一个目录包含了当前网络栈的信息,特别是/proc/net/nf_conntrack列出了存在的网络连接(对跟踪路由特别有用,因为iptables转发被用于重定向网络连接)
/proc/partitions 一个设备号、尺寸与/dev名的列表,内核用于辨别已存在的硬盘分区
/proc/scsi 给出任何通过SCSI或RAID控制器挂接的设备的信息
/proc/self (即/proc/PID/其中进程ID是当前进程的) 为当前进程的符号链接
/proc/slabinfo Linux内核频繁使用的对象的统计信息
/proc/swaps 活动交换分区的信息,如尺寸、优先级等
/proc/sys 动态可配置的内核选项. 其下的目录对应与内核区域,包含了可读与可写的虚拟文件(virtual file).
/proc/sysvipc 包括共享内存与进程间通信(IPC)信息
/proc/tty 包含当前终端信息;/proc/tty/driver是可利用的tty类型列表,其中的每一个是该类型的可用设备列表
/proc/uptime 内核启动后经过的秒数与idle模式的秒数
/proc/version 包含Linux内核版本,发布号(distribution number), 编译内核的gcc版本,其他相关的版本

3.sysfs

sysfs可以把设备(devices)和驱动程序(drivers)的信息从内核输出到用户空间,也可以用来对设备和驱动程序做设置。可以更方便对系统设备进行管理。它可以产生一个包含所有系统硬件层次视图,与提供进程和状态信息的proc文件系统十分类似。sysfs把连接在系统上的设备和总线组织成为一个分级的文件,它们可以由用户空间存取,向用户空间导出内核的数据结构以及它们的属性。sysfs的一个目的就是展示设备驱动模型中各组件的层次关系,其顶级目录包括block,bus,drivers,class,power和firmware等.sysfs 文件系统总是被挂载在 /sys 挂载点上。

4.debugfs/procfs/sysfs区别

不论是procfs或是sysfs,用它们来实现某些debug的需求,似乎偏离了它们创建的本意。比如procfs,其目的是反映进程的状态信息;而sysfs主要用于Linux设备模型。不论是procfs或是sysfs的接口应该保持相对稳定,因为用户态程序很可能会依赖它们。当然,如果我们只是临时借用procfs或者sysfs来作debug之用,在代码发布之前将相关调试代码删除也无不可。但如果相关的调试借口要在相当长的一段时间内存在于内核之中,就不太适合放在procfs和sysfs里了。使用procfs,在/proc创建文件输出调试信息,但是procfs对于大于一个内存页(对于x86是4K)的输出比较麻烦,而且速度慢,有时回出现一些意想不到的问题。使用sysfs(2.6内核引入的新的虚拟文件系统),在很多情况下,调试信息可以存放在那里,但是sysfs主要用于系统管理,它希望每一个文件对应内核的一个变量,如果使用它输出复杂的数据结构或调试信息是非常困难的。debugfs专门用于输出调试信息,该文件系统非常小,很容易使用,可以在配置内核时选择是否构件到内核中,在不选择它的情况下,使用它提供的API的内核部分不需要做任何改动。

5.squashfs

SquashFS是一套基于Linux内核使用的压缩只读文件系统。该文件系统能够压缩系统内的文档,inode以及目录,文件最大支持2^64字节。

温馨提示:
以上文章描述如有不清晰之处,欢迎在评论区评论,如有时间,会第一时间回复,谢谢!

猜你喜欢

转载自blog.csdn.net/qq_20677327/article/details/104519014
今日推荐