Linux中的伪文件系统

关于Linux中的伪文件系统的相关笔记

Linux中的伪文件系统

什么是伪文件系统?

伪文件系统是一种特殊的文件系统,它是一种虚拟文件系统,它并不真实存在于硬盘上,而是在内存中。它主要用于实现一些特殊功能,或者说是一些不用于保存文件数据的文件系统。如:

  • /proc文件系统:它是一个伪文件系统,它是Linux系统中一个特殊的目录,它包含了系统的运行信息,如系统的环境变量、进程信息、内存使用情况等。
  • /sys文件系统:它也是一种伪文件系统,它包含了系统的硬件信息,如CPU、内存、磁盘等设备的状态信息。

这些伪文件系统的存在,使得Linux系统可以实现一些特殊的功能,如:

  • 实现系统监控:通过/proc文件系统可以获取系统的运行信息,如CPU使用率、内存使用情况、磁盘使用情况等。
  • 实现设备控制:通过/sys文件系统可以控制系统的硬件设备,如开启或关闭设备、设置设备参数等。

实际上,可以将这些伪文件系统看作是一种接口,可以通过它们来获取系统的相关信息,同时它们并不真实存在于硬盘上,也不占用磁盘空间。所以这些文件系统下的文件的大小一般是 0

通过命令 sudo cat /proc/filesystems | grep nodev 可以知道本系统所支持的伪文件系统,这里应用的实际上是 nodev 表示的是伪文件系统。

常见的伪文件系统如下:

伪文件系统 常用挂载点 描述
procfs /proc 查看和操作进程相关的信息和配置
sysfs /sys 查看和操作系统相关的信息和配置
configfs /sys/kernel/config 创建、管理和删除内核对象
debugfs 用于内核状态调试
cgroupfs 用于管理系统的中 cgroup
hugetlbfs 查看和管理系统中的大页信息
伪文件系统 常用挂载点 描述
procfs /proc 查看和操作进程相关的信息和配置
sysfs /sys 查看和操作系统相关的信息和配置
configfs /sys/kernel/config 创建、管理和删除内核对象
debugfs /sys/kernel/debug 用于内核状态调试
cgroupfs /sys/fs/cgroup 用于管理系统中的 cgroup
hugetlbfs /dev/hugepages 查看和管理系统中的大页信息
devtmpfs /dev 动态管理设备文件
tmpfs /dev/shm, /run, /tmp 基于内存的临时文件存储
securityfs /sys/kernel/security 提供安全模块信息

用户和应用程序可以通过 proc 得到系统的信息(大多数虚拟文件可以使用文件查看命令如cat、more或者less进行查看,有些文件信息表述的内容可以一目了然,但也有文件的信息却不怎么具有可读性。不过,这些可读性较差的文件在使用一些命令如apm、free、lspci或top查看时却可以有着不错的表现),并可以改变内核的某些参数。由于系统的信息,如进程是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。下面列出的这些文件或子文件夹,并不是都是在你的系统中存在,这取决于你的内核配置和装载的模块。另外,在/proc下还有三个很重要的目录:net、scsi和sys。 sys目录是可写的,可以通过它来访问或修改内核的参数,而 net和scsi 则依赖于内核配置。例如:如果系统不支持scsi,则scsi 目录不存在。
c

/proc伪文件系统

这个伪文件系统被挂载在 /proc 目录下,它包含了系统的运行信息,如系统的环境变量、进程信息、内存使用情况等。

/proc下大部分文件是只读的,很多系统工具通过/proc获取信息,比如:

1
2
lsmod等同于cat /proc/modules
lspci等同于cat /proc/pci

部分文件可写,对于这些文件的修改,等同于使用 sysctl 命令重设内核参数。

下面对于 /proc/ 目录下的文件进行一些说明:

下面这些文件主要是对于系统中的硬件信息、运行资源的监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
- /proc/buddyinfo 每个内存区中的每个order有多少块可用,和内存碎片问题有关

- /proc/cmdline 启动时传递给kernel的参数信息

- /proc/cpuinfo cpu的信息

- /proc/crypto 内核使用的所有已安装的加密密码及细节

- /proc/devices 已经加载的设备并分类

- /proc/dma 已注册使用的ISA DMA频道列表

- /proc/execdomains Linux内核当前支持的execution domains

- /proc/fb 帧缓冲设备列表,包括数量和控制它的驱动

- /proc/filesystems 内核当前支持的文件系统类型

- /proc/interrupts x86架构中的每个IRQ中断数

- /proc/iomem 每个物理设备当前在系统内存中的映射

- /proc/ioports 一个设备的输入输出所使用的注册端口范围

- /proc/kcore 代表系统的物理内存,存储为核心文件格式,里边显示的是字节数,等于RAM大小加上4kb

- /proc/kmsg 记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg来处理

- /proc/loadavg 根据过去一段时间内CPU和IO的状态得出的负载状态,与uptime命令有关

- /proc/locks 内核锁住的文件列表

- /proc/mdstat 多硬盘,RAID配置信息(md=multiple disks)

- /proc/meminfo RAM使用的相关信息

- /proc/misc 其他的主要设备(设备号为10)上注册的驱动

- /proc/modules 所有加载到内核的模块列表

- /proc/mounts 系统中使用的所有挂载

- /proc/mtrr 系统使用的Memory Type Range Registers (MTRRs)

- /proc/partitions 分区中的块分配信息

- /proc/pci 系统中的PCI设备列表

- /proc/slabinfo 系统中所有活动的 slab 缓存信息

- /proc/stat 所有的CPU活动信息

- /proc/sysrq-trigger 使用echo命令来写这个文件的时候,远程root用户可以执行大多数的系统请求关键命令,就好像在本地终端执行一样。要写入这个文件,需要把/proc/sys/kernel/sysrq不能设置为0。这个文件对root也是不可读的

- /proc/uptime 系统已经运行了多久

- /proc/swaps 交换空间的使用情况

- /proc/version Linux内核版本和gcc版本

- /proc/bus 系统总线(Bus)信息,例如pci/usb等

- /proc/driver 驱动信息

- /proc/fs 文件系统信息

- /proc/ide ide设备信息

- /proc/irq 中断请求设备信息

- /proc/net 网卡设备信息

- /proc/scsi scsi设备信息

- /proc/tty tty设备信息

- /proc/net/dev 显示网络适配器及统计信息

- /proc/vmstat 虚拟内存统计信息

- /proc/vmcore 内核panic时的内存映像

- /proc/diskstats 取得磁盘信息

- /proc/schedstat kernel调度器的统计信息

- /proc/zoneinfo 显示内存空间的统计信息,对分析虚拟内存行为很有用c

下面这些文件主要关于每一个进程的运行状态;其中 X 表示进程号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/proc/X pid为X的进程信息

/proc/X/cmdline 进程启动命令,启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息

/proc/X/cwd 链接到进程当前工作目录,指向当前进程运行目录的一个符号链接

/proc/X/environ 进程环境变量列表,当前进程的环境变量列表,彼此间用空字符(NULL)隔开;变量用大写字母表示,其值用小写字母表示

/proc/X/exe 链接到进程的执行命令文件,指向启动当前进程的可执行文件(完整路径)的符号链接,通过/proc/N/exe可以启动当前进程的一个拷贝

/proc/X/fd 包含进程相关的所有的文件描述符,这是个目录,包含当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接

/proc/X/maps 与进程相关的内存映射信息,当前进程关联到的每个可执行文件和库文件在内存中的映射区域及其访问权限所组成的列表

/proc/X/mem 指代进程持有的内存,不可读,当前进程所占用的内存空间,由open、read和lseek等系统调用使用,不能被用户读取

/proc/X/root 链接到进程的根目录,指向当前进程运行根目录的符号链接;在Unix和Linux系统上,通常采用chroot命令使每个进程运行于独立的根目录

/proc/X/stat 进程的状态,当前进程的状态信息,包含一系统格式化后的数据列,可读性差,通常由ps命令使用

/proc/X/statm 进程使用的内存的状态

/proc/X/status 进程状态信息,比stat/statm更具可读性

/proc/self 链接到当前正在运行的进程


伪文件系统——参考资料

/sys伪文件系统

Linux 2.6以后的内核引入了sysfs文件系统,sysfs被看成是与proc、devfs和devpty同类别的文件系统,该文件系统是一个虚拟的文件系统,它可以产生一个包括所有系统硬件的层级视图,与提供进程和状态信息的proc文件系统十分类似。

sysfs把连接在系统上的设备和总线组织成为一个分级的文件,它们可以由用户空间存取,向用户空间导出内核数据结构以及它们的属性。

sysfs的一个目的就是展示设备驱动模型中各组件的层次关系。

其顶级目录包括block、bus、dev、devices、class、fs、kernel、power和firmware等。

  • block目录包含所有的块设备;
  • devices目录包含系统所有的设备,并根据设备挂接的总线类型组织成层次结构;
  • bus目录包含系统中所有的总线类型;
  • class目录包含系统中的设备类型(如网卡设备、声卡设备、输入设备等)。

主要的目录结构:

  • /sys/class/:
    包含系统中各类设备的分类,如 block(块设备)、net(网络设备)等。
  • /sys/devices/:
    按照设备的物理连接层次结构展示设备信息。
  • /sys/bus/:
    按照总线类型分类设备信息,如 pci、usb 等。
  • /sys/module/:
    包含已加载的内核模块的信息及其参数。

使用sysfs

sysfs 作为一个伪文件系统,就是用来告诉计算机的使用者计算机的相关信息的。


Linux中的伪文件系统
https://ysc2.github.io/ysc2.github.io/2024/06/21/Linux中的伪文件系统/
作者
Ysc
发布于
2024年6月21日
许可协议