Linux虚拟文件系统管理技术

Linux虚拟文件系统管理技术

  • 1. 虚拟文件系统的组成
    • 1.1 虚拟文件系统架构
    • 1.3 超级块(super block)
    • 1.4 索引节点(inode)
      • 1.4.1 inode怎样生成的?
      • 1.4.2 inode和文件的关系?
    • 1.5 目录项(dentry)
    • 1.6 文件对象(file)
  • 2. 进程与文件系统的关系
  • 3. 磁盘与文件系统的关系
  • 4. 常见的文件系统目录详解
    • 4.1 /proc目录
      • 4.1.1 /proc/$pid/
        • 4.1.1 cmdline
        • 4.1.2 cwd
        • 4.1.3 environ
        • 4.1.4 exe
        • 4.1.5 fd
        • 4.1.6 limits
        • 4.1.7 maps
        • 4.1.8 mem
        • 4.1.9 root
        • 4.1.10 stat
        • 4.1.11 statm
        • 4.1.12 status
        • 4.1.13 task
      • 4.2.1 /proc/apm
      • 4.2.2 /proc/buddyinfo
      • 4.2.3 /proc/cmdline
      • 4.2.4 /proc/cpuinfo
      • 4.2.5 /proc/crypto
      • 4.2.6 /proc/devices
      • 4.2.7 /proc/diskstats
      • 4.2.8 /proc/dma
      • 4.2.9 /proc/execdomains
      • 4.2.10 /proc/fb
      • 4.2.11 /proc/filesystems
      • 4.2.12 /proc/interrupts
      • 4.2.13 /proc/iomem
      • 4.2.14 /proc/ioports
      • 4.2.15 /proc/kallsyms
      • 4.2.16 /proc/kcore
      • 4.2.17 /proc/kmsg
      • 4.2.18 /proc/loadavg
      • 4.2.19 /proc/locks
      • 4.2.20 /proc/mdstat
      • 4.2.21 /proc/meminfo
      • 4.2.22 /proc/mounts
      • 4.2.23 /proc/modules
      • 4.2.24 /proc/partitions
      • 4.2.25 /proc/pci
      • 4.2.26 /proc/slabinfo
      • 4.2.27 /proc/stat
      • 4.2.28 /proc/swaps
      • 4.2.29 /proc/uptime
      • 4.2.30 /proc/version
      • 4.2.31 /proc/vmstat
      • 4.2.32 /proc/zoneinfo
  • 4. 疑问和思考
    • 4.1 为什么要设计虚拟文件系统?
  • 5. 参考文档

Linux包含一个通用的、强有力的文件处理机制,该机制利用虚拟文件系统(Virtual File System,VFS)来支持大量的文件管理系统和文件结构。VFS向用户进程提供了一个简单的,统一的文件系统接口。VFS定义了一个能代表任何可想到的文件系统的通用特征和行为的通用文件模型。VFS认为文件是计算机大容量存储器上的对象。这些计算机大容量存储器具有共同的特征,这与目标文件系统或底层的处理器硬件无关。


Linux虚拟文件系统(Virtual File System,VFS)是Linux操作系统中用于提供文件系统接口的抽象层。它允许不同的文件系统以统一的方式被应用程序访问。

VFS提供了一组通用的文件系统操作函数,如打开、读取、写入、关闭等。这些函数对于应用程序来说是透明的,不需要关注具体的文件系统类型。通过在VFS层面提供抽象接口,可以方便地支持多种文件系统类型,如ext4、NTFS、FAT等。

VFS通过将不同文件系统的实现包装成相应的VFS模块,实现了文件系统的插拔机制。当用户发起文件系统操作请求时,VFS会根据文件系统类型调用相应的VFS模块来进行处理。这样,用户可以在不同的文件系统之间切换而无需修改应用程序代码。

此外,VFS还提供了虚拟文件系统表(vfs_mount)来管理已挂载的文件系统,以及虚拟文件系统节点(vfs_inode)来描述文件和目录。它还支持访问控制、文件锁定、文件缓存等功能。

总之,Linux虚拟文件系统在Linux操作系统中扮演着重要的角色,它为应用程序提供了统一的文件系统接口,并支持多种文件系统类型的插拔。这使得Linux操作系统具备了良好的可扩展性和灵活性。

1. 虚拟文件系统的组成

1.1 虚拟文件系统架构

在这里插入图片描述
VFS(Virtual Filesystem Switch)称为虚拟文件系统或虚拟文件系统转换,是一个内核软件层,在具体的文件系统之上抽象的一层,用来处理与Posix文件系统相关的所有调用,表现为能够给各种文件系统提供一个通用的接口,使上层的应用程序能够使用通用的接口访问不同文件系统,同时也为不同文件系统的通信提供了媒介。

VFS并不是一种实际的文件系统,它只存在于内存中,不存在任何外存空间,VFS在系统启动时建立,在系统关闭时消亡。

VFS由超级块inodedentryvfsmount等结构来组成。

为了对文件系统进行统一的管理与组织,Linux创建了一个公共根目录和全局文件系统树。要访问一个文件系统中的文件,必须先将这个文件系统挂载在全局文件系统树的某个根目录下,这一挂载过程被称作文件系统的挂载,所挂载的目录称为挂载点。
在这里插入图片描述
由上图可知,文件系统的开头通常是由一个磁盘扇区所组成的引导块,该部分的主要目的是用于对操作系统的引导。一般只在启动操作系统时使用。
在这里插入图片描述

1.3 超级块(super block)

超级块:一个超级块对应一个文件系统(已经安装的文件系统类型如ext2,此处是实际的文件系统,不是VFS)。

之前我们已经说了文件系统用于管理这些文件的数据格式和操作之类的,系统文件有系统文件自己的文件系统,同时对于不同的磁盘分区也有可以是不同的文件系统。那么一个超级块对于一个独立的文件系统。保存文件系统的类型、大小、状态等等。

(“文件系统”和“文件系统类型”不一样!一个文件系统类型下可以包括很多文件系统即很多的super_block)

既然我们知道对于不同的文件系统有不同的super_block,那么对于不同的super_block的操作肯定也是不同的,所以我们在下面的super_block结构中可以看到上面说的抽象的struct结构(例如下面的:struct super_operations):

1.4 索引节点(inode)

索引节点inode:保存的其实是实际的数据的一些信息,这些信息称为“元数据”(也就是对文件属性的描述)。

例如:文件大小,设备标识符,用户标识符,用户组标识符,文件模式,扩展属性,文件读取或修改的时间戳,链接数量,指向存储该内容的磁盘区块的指针,文件分类等等。

( 注意数据分成:元数据+数据本身 )

同时注意:inode有两种,一种是VFS的inode,一种是具体文件系统的inode。前者在内存中,后者在磁盘中。所以每次其实是将磁盘中的inode调进填充内存中的inode,这样才是算使用了磁盘文件inode。

1.4.1 inode怎样生成的?

每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定(现代OS可以动态变化),一般每2KB就设置一个inode。

一般文件系统中很少有文件小于2KB的,所以预定按照2KB分,一般inode是用不完的。所以inode在文件系统安装的时候会有一个默认数量,后期会根据实际的需要发生变化。

注意inode号:inode号是唯一的,表示不同的文件。其实在Linux内部的时候,访问文件都是通过inode号来进行的,所谓文件名仅仅是给用户容易使用的。

当我们打开一个文件的时候,首先,系统找到这个文件名对应的inode号;然后,通过inode号,得到inode信息,最后,由inode找到文件数据所在的block,现在可以处理文件数据了。

1.4.2 inode和文件的关系?

当创建一个文件的时候,就给文件分配了一个inode。一个inode只对应一个实际文件,一个文件也会只有一个inode。inodes最大数量就是文件的最大数量。

1.5 目录项(dentry)

目录项是描述文件的逻辑属性,只存在于内存中,并没有实际对应的磁盘上的描述,更确切的说是存在于内存的目录项缓存,为了提高查找性能而设计。

注意不管是文件夹还是最终的文件,都是属于目录项,所有的目录项在一起构成一颗庞大的目录树。

例如:open一个文件/home/xxx/yyy.txt,那么/、home、xxx、yyy.txt都是一个目录项,VFS在查找的时候,根据一层一层的目录项找到对应的每个目录项的inode,那么沿着目录项进行操作就可以找到最终的文件。

在这里插入图片描述

1.6 文件对象(file)

文件对象描述的是进程已经打开的文件。因为一个文件可以被多个进程打开,所以一个文件可以存在多个文件对象。但是由于文件是唯一的,那么inode就是唯一的,目录项也是定的!

进程其实是通过文件描述符来操作文件的,每个文件都有一个32位的数字来表示下一个读写的字节位置,这个数字叫做文件位置。

一般情况下打开文件后,打开位置都是从0开始,除非一些特殊情况。Linux用file结构体来保存打开的文件的位置,所以file称为打开的文件描述。file结构形成一个双链表,称为系统打开文件表。

2. 进程与文件系统的关系

Linux中,常常用文件描述符(file descriptor)来表示一个打开的文件,这个描述符的值往往是一个大于或等于0的整数。而这个整数,其实就是在files_struct中file数组fd的下标。对于所有打开的文件, 这些文件描述符会存储在open_fds的位图中。

在这里插入图片描述

从图中可知:

  • 进程通过task_struct中的一个域files->files_struct 来了解它当前所打开的文件对象;而我们通常所说的文件描述符其实是进程打开的文件对象数组的索引值。
  • 文件对象通过域f_dentry找到它对应的dentry对象,再由dentry对象的域d_inode找到它对应的索引节点(通过索引节点又可以得到超级块的信息,也就可以得到最终操作文件的方法,在open文件的时候就是使用这样一个过程),这样就建立了文件对象与实际的物理文件的关联。
  • 文件对象所对应的文件操作函数列表是通过索引节点的域i_fop得到的,而i_fop最终又是通过struct super_operations *s_op来初始化的。
    VFS文件系统中的inode和dentry与实际文件系统的inode和dentry有一定的关系,但不能等同。

真实磁盘文件的inode和dentry是存在于物理外存上的,但VFS中的inode和dentry是存在于内存中的,系统读取外存中的inode和dentry信息进行一定加工后,生成内存中的inode和dentry。

虚拟的文件系统也具有inode和dentry结构,只是这是系统根据相应的规则生成的,不存在于实际外存中。

3. 磁盘与文件系统的关系

假设一块磁盘被分为好几个分区,每个分区都是不同的文件系统。
在这里插入图片描述

4. 常见的文件系统目录详解

一个完整的linux文件系统目录情况如下,针对一些重点目录进行进行分析和整理
在这里插入图片描述

4.1 /proc目录

Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。

用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。下面列出的这些文件或子文件夹,并不是都是在你的系统中存在,这取决于你的内核配置和装载的模块。另外,在/proc下还有三个很重要的目录:net,scsi和sys。 Sys目录是可写的,可以通过它来访问或修改内核的参数,而net和scsi则依赖于内核配置。例如,如果系统不支持scsi,则scsi 目录不存在。

除了以上介绍的这些,还有的是一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口,该目录随着对应进程的消失而删除。而self目录则是读取进程本身的信息接口,是一个link。

[root@rhel5 ~]# ll /proc
total 0
dr-xr-xr-x  5 root      root              0 Feb  8 17:08 1
dr-xr-xr-x  5 root      root              0 Feb  8 17:08 10
dr-xr-xr-x  5 root      root              0 Feb  8 17:08 11
dr-xr-xr-x  5 root      root              0 Feb  8 17:08 1156
dr-xr-xr-x  5 root      root              0 Feb  8 17:08 139
dr-xr-xr-x  5 root      root              0 Feb  8 17:08 140
dr-xr-xr-x  5 root      root              0 Feb  8 17:08 141
dr-xr-xr-x  5 root      root              0 Feb  8 17:09 1417
dr-xr-xr-x  5 root      root              0 Feb  8 17:09 1418

上面列出的是/proc目录中一些进程相关的目录,每个目录中是当程本身相关信息的文件。下面是作者系统(RHEL5.3)上运行的一个PID为2674的进程saslauthd的相关文件,其中有些文件是每个进程都会具有的,后文会对这些常见文件做出说明。

4.1.1 /proc/$pid/

上面列出的是/proc目录中一些进程相关的目录,每个目录中是当程本身相关信息的文件。下面是作者系统(RHEL5.3)上运行的一个PID为2674的进程saslauthd的相关文件,其中有些文件是每个进程都会具有的,后文会对这些常见文件做出说明。

[root@rhel5 ~]# ll /proc/2674
total 0
dr-xr-xr-x 2 root root 0 Feb  8 17:15 attr
-r-------- 1 root root 0 Feb  8 17:14 auxv
-r--r--r-- 1 root root 0 Feb  8 17:09 cmdline
-rw-r--r-- 1 root root 0 Feb  8 17:14 coredump_filter
-r--r--r-- 1 root root 0 Feb  8 17:14 cpuset
lrwxrwxrwx 1 root root 0 Feb  8 17:14 cwd -> /var/run/saslauthd
-r-------- 1 root root 0 Feb  8 17:14 environ
lrwxrwxrwx 1 root root 0 Feb  8 17:09 exe -> /usr/sbin/saslauthd
dr-x------ 2 root root 0 Feb  8 17:15 fd
-r-------- 1 root root 0 Feb  8 17:14 limits
-rw-r--r-- 1 root root 0 Feb  8 17:14 loginuid
-r--r--r-- 1 root root 0 Feb  8 17:14 maps
-rw------- 1 root root 0 Feb  8 17:14 mem
-r--r--r-- 1 root root 0 Feb  8 17:14 mounts
-r-------- 1 root root 0 Feb  8 17:14 mountstats
-rw-r--r-- 1 root root 0 Feb  8 17:14 oom_adj
-r--r--r-- 1 root root 0 Feb  8 17:14 oom_score
lrwxrwxrwx 1 root root 0 Feb  8 17:14 root -> /
-r--r--r-- 1 root root 0 Feb  8 17:14 schedstat
-r-------- 1 root root 0 Feb  8 17:14 smaps
-r--r--r-- 1 root root 0 Feb  8 17:09 stat
-r--r--r-- 1 root root 0 Feb  8 17:14 statm
-r--r--r-- 1 root root 0 Feb  8 17:10 status
dr-xr-xr-x 3 root root 0 Feb  8 17:15 task
-r--r--r-- 1 root root 0 Feb  8 17:14 wchan
4.1.1 cmdline

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

[root@rhel5 ~]# more /proc/2674/cmdline 
/usr/sbin/saslauthd
4.1.2 cwd

cwd : 指向当前进程运行目录的一个符号链接;

4.1.3 environ

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

[root@rhel5 ~]# more /proc/2674/environ 
TERM=linuxauthd
4.1.4 exe

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

4.1.5 fd

fd: 这是个目录,包含当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接;

[root@rhel5 ~]# ll /proc/2674/fd
total 0
lrwx------ 1 root root 64 Feb  8 17:17 0 -> /dev/null
lrwx------ 1 root root 64 Feb  8 17:17 1 -> /dev/null
lrwx------ 1 root root 64 Feb  8 17:17 2 -> /dev/null
lrwx------ 1 root root 64 Feb  8 17:17 3 -> socket:[7990]
lrwx------ 1 root root 64 Feb  8 17:17 4 -> /var/run/saslauthd/saslauthd.pid
lrwx------ 1 root root 64 Feb  8 17:17 5 -> socket:[7991]
lrwx------ 1 root root 64 Feb  8 17:17 6 -> /var/run/saslauthd/mux.accept
4.1.6 limits

limits: 当前进程所使用的每一个受限资源的软限制、硬限制和管理单元;此文件仅可由实际启动当前进程的UID用户读取;(2.6.24以后的内核版本支持此功能);

4.1.7 maps

maps: 当前进程关联到的每个可执行文件和库文件在内存中的映射区域及其访问权限所组成的列表;

[root@rhel5 ~]# cat /proc/2674/maps 
00110000-00239000 r-xp 00000000 08:02 130647     /lib/libcrypto.so.0.9.8e
00239000-0024c000 rwxp 00129000 08:02 130647     /lib/libcrypto.so.0.9.8e
0024c000-00250000 rwxp 0024c000 00:00 0 
00250000-00252000 r-xp 00000000 08:02 130462     /lib/libdl-2.5.so
00252000-00253000 r-xp 00001000 08:02 130462     /lib/libdl-2.5.so
4.1.8 mem

mem: 当前进程所占用的内存空间,由open、read和lseek等系统调用使用,不能被用户读取;

4.1.9 root

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

4.1.10 stat

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

4.1.11 statm

statm: 当前进程占用内存的状态信息,通常以“页面”(page)表示;

4.1.12 status

status: 与stat所提供信息类似,但可读性较好,如下所示,每行表示一个属性信息;其详细介绍请参见 proc的man手册页;

[root@rhel5 ~]# more /proc/2674/status
Name:   saslauthd
State:  S (sleeping)
SleepAVG:       0%
Tgid:   2674
Pid:    2674
PPid:   1
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 32
Groups:
VmPeak:     5576 kB
VmSize:     5572 kB
VmLck:         0 kB
VmHWM:       696 kB
VmRSS:       696 kB
…………
4.1.13 task

task: 目录文件,包含由当前进程所运行的每一个线程的相关信息,每个线程的相关信息文件均保存在一个由线程号(tid)命名的目录中,这类似于其内容类似于每个进程目录中的内容;(内核2.6版本以后支持此功能)

4.2.1 /proc/apm

高级电源管理(APM)版本信息及电池相关状态信息,通常由apm命令使用;

4.2.2 /proc/buddyinfo

用于诊断内存碎片问题的相关信息文件;

4.2.3 /proc/cmdline

在启动时传递至内核的相关参数信息,这些信息通常由lilo或grub等启动管理工具进行传递;

[root@rhel5 ~]# more /proc/cmdline
ro root=/dev/VolGroup00/LogVol00 rhgb quiet

4.2.4 /proc/cpuinfo

处理器的相关信息的文件;
在这里插入图片描述

4.2.5 /proc/crypto

系统上已安装的内核使用的密码算法及每个算法的详细信息列表;

[root@rhel5 ~]# more /proc/crypto
name         : crc32c
driver       : crc32c-generic
module       : kernel
priority     : 0
type         : digest
blocksize    : 32
digestsize   : 4
…………

4.2.6 /proc/devices

系统已经加载的所有块设备和字符设备的信息,包含主设备号和设备组(与主设备号对应的设备类型)名;

[root@rhel5 ~]# more /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS

Block devices:
1 ramdisk
2 fd
8 sd
…………

4.2.7 /proc/diskstats

每块磁盘设备的磁盘I/O统计信息列表;(内核2.5.69以后的版本支持此功能)

4.2.8 /proc/dma

每个正在使用且注册的ISA DMA通道的信息列表;

[root@rhel5 ~]# more /proc/dma
2: floppy
4: cascade

4.2.9 /proc/execdomains

内核当前支持的执行域(每种操作系统独特“个性”)信息列表;

[root@rhel5 ~]# more /proc/execdomains
0-0     Linux                   [kernel]

4.2.10 /proc/fb

帧缓冲设备列表文件,包含帧缓冲设备的设备号和相关驱动信息;

4.2.11 /proc/filesystems

当前被内核支持的文件系统类型列表文件,被标示为nodev的文件系统表示不需要块设备的支持;通常mount一个设备时,如果没有指定文件系统类型将通过此文件来决定其所需文件系统的类型;

[root@rhel5 ~]# more /proc/filesystems
nodev   sysfs
nodev   rootfs
nodev   proc
iso9660
ext3
…………

4.2.12 /proc/interrupts

X86或X86_64体系架构系统上每个IRQ相关的中断号列表;多路处理器平台上每个CPU对于每个I/O设备均有自己的中断号;

[root@rhel5 ~]# more /proc/interrupts
CPU0       
0:    1305421    IO-APIC-edge  timer
1:         61    IO-APIC-edge  i8042
185:       1068   IO-APIC-level  eth0
…………

4.2.13 /proc/iomem

每个物理设备上的记忆体(RAM或者ROM)在系统内存中的映射信息;

[root@rhel5 ~]# more /proc/iomem
00000000-0009f7ff : System RAM
0009f800-0009ffff : reserved
000a0000-000bffff : Video RAM area
000c0000-000c7fff : Video ROM
…………

4.2.14 /proc/ioports

当前正在使用且已经注册过的与物理设备进行通讯的输入-输出端口范围信息列表;如下面所示,第一列表示注册的I/O端口范围,其后表示相关的设备;

[root@rhel5 ~]# less /proc/ioports
0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0060-006f : keyboard
…………

4.2.15 /proc/kallsyms

模块管理工具用来动态链接或绑定可装载模块的符号定义,由内核输出;(内核2.5.71以后的版本支持此功能);通常这个文件中的信息量相当大;

[root@rhel5 ~]# more /proc/kallsyms
c04011f0 T _stext
c04011f0 t run_init_process
c04011f0 T stext
…………

4.2.16 /proc/kcore

系统使用的物理内存,以ELF核心文件(core file)格式存储,其文件大小为已使用的物理内存(RAM)加上4KB;这个文件用来检查内核数据结构的当前状态,因此,通常由GBD通常调试工具使用,但不能使用文件查看命令打开此文件;

4.2.17 /proc/kmsg

此文件用来保存由内核输出的信息,通常由/sbin/klogd或/bin/dmsg等程序使用,不要试图使用查看命令打开此文件;

4.2.18 /proc/loadavg

保存关于CPU和磁盘I/O的负载平均值,其前三列分别表示每1秒钟、每5秒钟及每15秒的负载平均值,类似于uptime命令输出的相关信息;第四列是由斜线隔开的两个数值,前者表示当前正由内核调度的实体(进程和线程)的数目,后者表示系统当前存活的内核调度实体的数目;第五列表示此文件被查看前最近一个由内核创建的进程的PID;

[root@rhel5 ~]# more /proc/loadavg
0.45 0.12 0.04 4/125 5549

[root@rhel5 ~]# uptime
06:00:54 up  1:06,  3 users,  load average: 0.45, 0.12, 0.04

4.2.19 /proc/locks

保存当前由内核锁定的文件的相关信息,包含内核内部的调试数据;每个锁定占据一行,且具有一个惟一的编号;如下输出信息中每行的第二列表示当前锁定使用的锁定类别,POSIX表示目前较新类型的文件锁,由lockf系统调用产生,FLOCK是传统的UNIX文件锁,由flock系统调用产生;第三列也通常由两种类型,ADVISORY表示不允许其他用户锁定此文件,但允许读取,MANDATORY表示此文件锁定期间不允许其他用户任何形式的访问;

[root@rhel5 ~]# more /proc/locks
1: POSIX  ADVISORY  WRITE 4904 fd:00:4325393 0 EOF
2: POSIX  ADVISORY  WRITE 4550 fd:00:2066539 0 EOF
3: FLOCK  ADVISORY  WRITE 4497 fd:00:2066533 0 EOF

4.2.20 /proc/mdstat

保存RAID相关的多块磁盘的当前状态信息,在没有使用RAID机器上,其显示为如下状态:

[root@rhel5 ~]# less /proc/mdstat
Personalities :
unused devices: <none>

4.2.21 /proc/meminfo

系统中关于当前内存的利用状况等的信息,常由free命令使用;可以使用文件查看命令直接读取此文件,其内容显示为两列,前者为统计属性,后者为对应的值;

[root@rhel5 ~]# less /proc/meminfo
MemTotal:       515492 kB
MemFree:          8452 kB
Buffers:         19724 kB
Cached:         376400 kB
SwapCached:          4 kB
…………

4.2.22 /proc/mounts

在内核2.4.29版本以前,此文件的内容为系统当前挂载的所有文件系统,在2.4.19以后的内核中引进了每个进程使用独立挂载名称空间的方式,此文件则随之变成了指向/proc/self/mounts(每个进程自身挂载名称空间中的所有挂载点列表)文件的符号链接;/proc/self是一个独特的目录,后文中会对此目录进行介绍;

[root@rhel5 ~]# ll /proc |grep mounts
lrwxrwxrwx  1 root      root             11 Feb  8 06:43 mounts -> self/mounts

如下所示,其中第一列表示挂载的设备,第二列表示在当前目录树中的挂载点,第三点表示当前文件系统的类型,第四列表示挂载属性(ro或者rw),第五列和第六列用来匹配/etc/mtab文件中的转储(dump)属性;

[root@rhel5 ~]# more /proc/mounts
rootfs / rootfs rw 0 0
/dev/root / ext3 rw,data=ordered 0 0
/dev /dev tmpfs rw 0 0
/proc /proc proc rw 0 0
/sys /sys sysfs rw 0 0
/proc/bus/usb /proc/bus/usb usbfs rw 0 0
…………

4.2.23 /proc/modules

当前装入内核的所有模块名称列表,可以由lsmod命令使用,也可以直接查看;如下所示,其中第一列表示模块名,第二列表示此模块占用内存空间大小,第三列表示此模块有多少实例被装入,第四列表示此模块依赖于其它哪些模块,第五列表示此模块的装载状态(Live:已经装入;Loading:正在装入;Unloading:正在卸载),第六列表示此模块在内核内存(kernel memory)中的偏移量;

[root@rhel5 ~]# more /proc/modules
autofs4 24517 2 - Live 0xe09f7000
hidp 23105 2 - Live 0xe0a06000
rfcomm 42457 0 - Live 0xe0ab3000
l2cap 29505 10 hidp,rfcomm, Live 0xe0aaa000
…………

4.2.24 /proc/partitions

块设备每个分区的主设备号(major)和次设备号(minor)等信息,同时包括每个分区所包含的块(block)数目(如下面输出中第三列所示);

[root@rhel5 ~]# more /proc/partitions
major minor  #blocks  name

8     0   20971520 sda
8     1     104391 sda1
8     2    6907950 sda2
8     3    5630782 sda3
8     4          1 sda4
8     5    3582463 sda5

4.2.25 /proc/pci

内核初始化时发现的所有PCI设备及其配置信息列表,其配置信息多为某PCI设备相关IRQ信息,可读性不高,可以用“/sbin/lspci –vb”命令获得较易理解的相关信息;在2.6内核以后,此文件已为/proc/bus/pci目录及其下的文件代替;

4.2.26 /proc/slabinfo

在内核中频繁使用的对象(如inode、dentry等)都有自己的cache,即slab pool,而/proc/slabinfo文件列出了这些对象相关slap的信息;详情可以参见内核文档中slapinfo的手册页;

[root@rhel5 ~]# more /proc/slabinfo
slabinfo - version: 2.1
# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <ac
tive_slabs> <num_slabs> <sharedavail>
rpc_buffers            8      8   2048    2    1 : tunables   24   12    8 : slabdata      4      4      0
rpc_tasks              8     20    192   20    1 : tunables  120   60    8 : slabdata      1      1      0
rpc_inode_cache        6      9    448    9    1 : tunables   54   27    8 : slabdata      1      1      0
…………
…………
…………

4.2.27 /proc/stat

实时追踪自系统上次启动以来的多种统计信息;如下所示,其中,
“cpu”行后的八个值分别表示以1/100(jiffies)秒为单位的统计值(包括系统运行于用户模式、低优先级用户模式,运系统模式、空闲模式、I/O等待模式的时间等);
“intr”行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数;
“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。
“btime”给出了从系统启动到现在为止的时间,单位为秒;
“processes (total_forks) 自系统启动以来所创建的任务的个数目;
“procs_running”:当前运行队列的任务的数目;
“procs_blocked”:当前被阻塞的任务的数目;

[root@rhel5 ~]# more /proc/stat
cpu  2751 26 5771 266413 2555 99 411 0
cpu0 2751 26 5771 266413 2555 99 411 0
intr 2810179 2780489 67 0 3 3 0 5 0 1 0 0 0 1707 0 0 9620 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12781 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 427300
btime 1234084100
processes 3491
procs_running 1
procs_blocked 0

4.2.28 /proc/swaps

当前系统上的交换分区及其空间利用信息,如果有多个交换分区的话,则会每个交换分区的信息分别存储于/proc/swap目录中的单独文件中,而其优先级数字越低,被使用到的可能性越大;下面是作者系统中只有一个交换分区时的输出信息;

[root@rhel5 ~]# more /proc/swaps
Filename                                Type            Size    Used    Priority
/dev/sda8                               partition       642560  0       -1

4.2.29 /proc/uptime

系统上次启动以来的运行时间,如下所示,其第一个数字表示系统运行时间,第二个数字表示系统空闲时间,单位是秒;

[root@rhel5 ~]# more /proc/uptime
3809.86 3714.13

4.2.30 /proc/version

当前系统运行的内核版本号,在作者的RHEL5.3上还会显示系统安装的gcc版本,如下所示;

[root@rhel5 ~]# more /proc/version
Linux version 2.6.18-128.el5 (mockbuild@hs20-bc1-5.build.redhat.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)) #1 SMP Wed Dec 17 11:42:39 EST 2008

4.2.31 /proc/vmstat

当前系统虚拟内存的多种统计数据,信息量可能会比较大,这因系统而有所不同,可读性较好;下面为作者机器上输出信息的一个片段;(2.6以后的内核支持此文件)

[root@rhel5 ~]# more /proc/vmstat
nr_anon_pages 22270
nr_mapped 8542
nr_file_pages 47706
nr_slab 4720
nr_page_table_pages 897
nr_dirty 21
nr_writeback 0
…………

4.2.32 /proc/zoneinfo

内存区域(zone)的详细信息列表,信息量较大,下面列出的是一个输出片段:

[root@rhel5 ~]# more /proc/zoneinfo
Node 0, zone      DMA
pages free     1208
min      28
low      35
high     42
active   439
inactive 1139
scanned  0 (a: 7 i: 30)
spanned  4096
present  4096
nr_anon_pages 192
nr_mapped    141
nr_file_pages 1385
nr_slab      253
nr_page_table_pages 2
nr_dirty     523
nr_writeback 0
nr_unstable  0
nr_bounce    0
protection: (0, 0, 296, 296)
pagesets
all_unreclaimable: 0
prev_priority:     12
start_pfn:         0
…………

4. 疑问和思考

4.1 为什么要设计虚拟文件系统?

虚拟文件系统(VFS)能够提供一套完整的、通用的文件系统管理模型和相关接口,能够使得应用程序在面临不同操作系统、不同硬件情况下,保持统一的开发和访问规范,规避了不同的应用程序需要大量适配底层硬件和操作系统的差异。

试想一下,如果没有linux系统不在物理硬件和应用程序之间设计虚拟文件系统,则应用程序面临不同的硬件(xfs、ext3、ext4等),需要做不同类型的适配,这是极其痛苦等。

虚拟文件系统可以提供统一的文件访问接口,支持不同文件系统的管理和挂载,使得用户和应用程序可以方便地进行文件操作。

5. 参考文档

  • Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/424785.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+vue的图书管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

测试面试精选题:可用性测试主要测试哪些方面,举例说明

1.界面设计&#xff1a; 评估软件的用户界面设计是否直观、美观、易于理解和操作。 测试用例&#xff1a;打开软件&#xff0c;查看界面布局是否合理&#xff0c;各个功能是否容易找到&#xff0c;是否符合用户习惯。 2.导航和布局&#xff1a; 评估用户在软件中导航和查找…

录制用户操作实现自动化任务

先上视频&#xff01;&#xff01; 流程自动化工具-录制操作绘制流程 这个想法之前就有了&#xff0c;趁着周末时间给它撸出来。 实现思路 从之前的文章自动化桌面未来展望中已经验证了录制绘制流程图的可行性。基于DOM录制页面操作轨迹的思路监听页面点击、输入事件即可&…

搭建 LNMP 架构

一 理论知识 &#xff08;一&#xff09;架构图 &#xff08;二&#xff09;CGI 由来 最早的Web服务器只能简单她响应浏览器发来的HTTP请求&#xff0c;并将存储在服务器上的HTML文件返回给浏览器&#xff0c;也就是静态html文件&#xff0c;但是后期随着网站功能增多网站开…

MATLAB基于隐马尔可夫模型-高斯混合模型-期望最大化的MR图像分割

隐马尔可夫模型是一种统计模型&#xff0c;它描述了马尔可夫过程&#xff0c;隐马尔可夫过程中包含隐变量&#xff0c;语音识别和词性自动标注等一些领域常常使用隐马尔可夫模型方法来处理。马尔可夫过程是一类随机过程&#xff0c;马尔可夫链是它的原始模型&#xff0c;马尔可…

Vue开发实例(一)Vue环境搭建第一个项目

Vue环境搭建&第一个项目 一、环境搭建二、安装Vue脚手架三、创建Vue项目 一、环境搭建 下载方式从官网下载&#xff1a;http://nodejs.cn/download/ 建议下载v12.16.0版本以上的&#xff0c;因为版本低无法创建Vue的脚手架 检验是否安装成功 配置环境变量 新增NODE_HOME&…

2024最新算法:冠豪猪优化算法(Crested Porcupine Optimizer,CPO)求解23个基准函数(提供MATLAB代码)

一、冠豪猪优化算法 冠豪猪优化算法(Crested Porcupine Optimizer&#xff0c;CPO)由Mohamed Abdel-Basset等人于2024年提出&#xff0c;该算法模拟冠豪猪的四种不同保护机制&#xff1a;视觉、听觉、气味和物理攻击。第一和第二防御技术&#xff08;视觉和听觉&#xff09;反…

论文阅读-CheckFreq:频繁、精细的DNN检查点操作。

论文名称&#xff1a;CheckFreq: Frequent, Fine-Grained DNN Checkpointing. 摘要 训练深度神经网络(DNNs)是一项资源密集且耗时的任务。在训练过程中&#xff0c;模型在GPU上进行计算&#xff0c;重复地学习权重&#xff0c;持续多个epoch。学习到的权重存在GPU内存中&…

地图资源工具新增 GEDI 2A 数据下载

GEDI 2A 是指"Global Ecosystem Dynamics Investigation 2A"&#xff0c;这是一项由美国宇航局 (NASA) 所发起的卫星任务。GEDI 2A 任务的目标是通过激光雷达技术来监测和理解全球生态系统的动态变化。该技术可以提供高精度的地形和植被结构数据&#xff0c;对于研究…

云上攻防-云原生篇Docker安全系统内核版本漏洞CDK自动利用容器逃逸

知识点 1、云原生-Docker安全-容器逃逸&内核漏洞 2、云原生-Docker安全-容器逃逸&版本漏洞 3、云原生-Docker安全-容器逃逸&CDK自动化 章节点&#xff1a; 云场景攻防&#xff1a;公有云&#xff0c;私有云&#xff0c;混合云&#xff0c;虚拟化集群&#xff0c…

CSM是什么意思?

CSM(Customer Service Management)是企业客户服务管理的信息化&#xff08;IT&#xff09;解决方案架构。本着以客户为中心的管理理念&#xff0c;搭建企业客户服务管理平台&#xff0c;实现企业以客户为中心的管理时代的竞争战略。 CSM的核心是以客户为中心&#xff0c;实现对…

【Pytorch、torchvision、CUDA 各个版本对应关系以及安装指令】

Pytorch、torchvision、CUDA 各个版本对应关系以及安装指令 1、名词解释 1.1 CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由NVIDIA开发的用于并行计算的平台和编程模型。CUDA旨在利用NVIDIA GPU&#xff08;图形处理单元&#xff09;的强大计算…

Python3零基础教程之数学运算专题进阶

大家好,我是千与编程,今天已经进入我们Python3的零基础教程的第十节之数学运算专题进阶。上一次的数学运算中我们介绍了简单的基础四则运算,加减乘除运算。当涉及到数学运算的 Python 3 刷题使用时,进阶课程包含了许多重要的概念和技巧。下面是一个简单的教程,涵盖了一些常…

Http协议综述

目录 一.B/S架构 二.Http协议 1.概述 2.特点 3.请求数据格式 &#xff08;1&#xff09;请求头 &#xff08;2&#xff09;请求行 &#xff08;3&#xff09;请求体 4.相应数据格式 &#xff08;1&#xff09;相应行 &#xff08;2&#xff09;相应头 &#xff08;…

Beans模块之工厂模块BeanClassLoaderAware

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

【HTML】HTML基础5(特殊字符)

目录 特殊字符的作用 常用的特殊字符 使用效果 特殊字符的作用 例如 当我在两个文字间打出空格时 <p>“银河护卫队”系列 在漫威电影宇宙中一直是异数般的存在&#xff0c;不仅因为影片主角是一群反英雄&#xff0c;<strong>与超级英雄相比显得格格不入<…

【软考】数据库的三级模式

目录 一、概念1.1 说明1.2 数据库系统体系结构图 二、外模式三、概念模式四、内模式 一、概念 1.1 说明 1.数据的存储结构各不相同&#xff0c;但体系结构基本上具有相同的特征&#xff0c;采用三级模式和两级镜像 2.数据库系统设计员可以在视图层、逻辑层和物理层对数据进行抽…

从零开始:开发家政预约APP的技术指南

当下&#xff0c;家政预约APP成为了人们解决家务需求的便捷工具。本文将为您提供一份从零开始的技术指南&#xff0c;帮助您了解开发家政预约APP所需的关键技术和步骤。 一、确定功能需求 -用户注册与登录 -家政服务分类与浏览 -预约服务与支付 -评价与反馈 -定位与导航 …

Unity - 相机画面为黑白效果

一、 在Hierarchy中创建一个Global Volume,并设置它为局部作用 二、 将场景出现的作用域范围缩小至相机所在位置&#xff0c;将相机包含即可。 三、添加覆盖组件Color Adjustments,并将Saturation直接拉为-100 。 此时&#xff0c;相机拍摄画面为黑白&#xff0c;场景视图中…

Python中调试 requests模块时出现的大坑(2)

为防止迷路: 学习机械相关,请关注公众号:南大盛联 学习软件,硬件,请关注公众号:一训微课 文件名命名不当导致的坑,是不是太坑人了,是的! 刚开始怀疑软件,怀疑平台,怀疑自己的代码 平台:pychar 运行结果: 很奇怪! 没有删除上面文件的情况下 新建re1.py