Linux 虚拟文件系统

虚拟文件系统介绍

Linux使用了虚拟文件系统(VFS,Virtual Filesystem,下文统称“虚拟文件系统”),它不是磁盘文件的组织格式,而是抽象出来的文件树的集合,它通过标准接口动态的向其中增加或移除对应的目录。虚拟文件系统支持以下归类的三种类型的文件系统:

  • 磁盘文件系统,存储在本地磁盘、U盘、CDROM等的文件系统,它包含各种不同的文件系统格式,比如Windows NTFS、VFAT,BSD的UFS,CD的CD-ROM等
  • 网络文件系统,它们存储在网络中的其他主机上,通过网络进行访问,例如 NFS
  • 特殊文件系统,内存的映射、例如/proc

案例如以下截图,Linux上的进程通过Sytem Calls(系统调用)将数据经过VFS最终的转写入不同的文件系统,再通过文件系统的驱动最终写入硬件设备。这里的Sytem Calls就包含read()、write()和lseek()等。

虚拟文件系统对象类型

虚拟文件系统,有四个主要对象类型:

  • Superblock 表示特定加载的文件系统
  • Inode 表示特定的文件
  • Dentry 表示一个目录项,路径的一个组成部分
  • File 表示进程打开的一个文件

Superblock

超级块(spuerblock)对象由各自的文件系统实现,用来存储文件系统的信息。这个对象对应为文件系统超级块或者文件系统控制块,它存储在磁盘特定的扇区上。不是基于磁盘的文件系统临时生成超级块,并保存在内存中。

Inode

索引节点对象包含了内核在操作文件或目录时需要的全部信息。对于Unix文件系统来 说,这些信息可以从磁盘索引节点直接读入。如果一个文件系统没有索引节点,那么,不管这些相关信息在磁盘上是怎么存放的,文件系统都必须从中提取这些信息。

Dentry

为了方便查找,虚拟文件系统引入目录项的概念。每个Dentry代表路径中一个特定部分。对于“/bin/ls”、“/”、“bin”和“ls”都是目录项对象。前面是两个目录,最后一个是普通文件。在路径中, 包括普通文件在内,每一个部分都是目录项对象。

File

虚拟文件系统最后一个主要对象是文件对象,文件对象表示进程已打开的文件。如果我们站在用户空间的角度考虑虚拟文件系统

,文件对象会首先进入我们的视野。进程直接处理的是文件而不是超级块、索引节点或目录。文件对象包含我们非常熟悉的信息(如访问模式、当前偏移等), 文件操作和我们非常熟悉的系统调用read()和write()等也很类似。文件对象是已打开的文件在内存中的表示。该对象(不是物理文件)由相应的open()系统调用创建,由close()系统调用销毁,所有这些文件相关的调用实际上都是文件操作 表中定义的方法。

文件名与路径

文件名则被指定,由文件系统的根目录开始到指定的文件位置的完整路径( /etc/sysconfig/network )称为“绝对路径”,此外表示路径的方法还有“相对路径”。在使用路径时有两种符号:

  • “.” 表示当前目录
  • “..” 表示上一级目录

另外 Linux 有很多不同于其他操作的特征:

  • 把所有的外部设备看作是文件(即一切揭“文件”),为了保证输入输出操作的一致性 Linux把所有的对外部设备的操作都设计成为等同于操作文件,因此无论什么外部设备的特征,都被文件系统隐藏了。
  • 文件的用有者可以指定其他的组或用户读,写和执行文件的权限,从而起到提高文件的安全性。

参考文章

http://www.ilinuxkernel.com/files/Linux.Virtual.Filesystem.pdf

https://zhuanlan.zhihu.com/p/34875559

https://wushifublog.com/2020/05/22/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Linux%E5%86%85%E6%A0%B8%E2%80%94%E2%80%94VFS/

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...