目录
VFS(virtual filesystem,虚拟文件系统)
网络文件系统(Network File System,NFS)
12章 - 虚拟文件系统 - VFS的作用
引入
linux可以支持具有其他操作系统文件格式的磁盘/分区
- 其中是通过某个字段/函数来支持[linux所支持的所有实际文件系统]提供的操作
- 当进行io时,os会自动帮我们替换成对应文件系统的接口
VFS(virtual filesystem,虚拟文件系统)
介绍
也可以叫做虚拟文件系统转换,是一个内核软件层
- 顾名思义,他就是用来帮助我们进行接口转换的
它可以处理unix标准文件系统的所有系统调用,实际的文件操作都由vfs判别和执行
- 充当了硬件与用户之间的抽象层,它隐藏了底层文件系统的细节,使得用户可以通过统一的接口来进行文件操作
- 并在底层进行转发 -- 在vfs中,每个文件系统都有自己的实现,包括各种系统调用的处理函数,当用户进行文件操作时,这些操作会通过vfs的接口被传递到相应的文件系统模块进行处理
示例
比如要执行cp命令:
/floppy
- 是MS-DOS磁盘的一个安装点
/tmp
- 标准的第二扩展文件系统(ext2)的目录
虽然这个文件操作需要跨越两种文件系统,但cp并不关心这个
- 因为与它直接交互的是vfs
cp的执行代码
可以看到,cp的工作就是调用系统调用,而负责转发给底层的文件系统模块的是vfs
仅在软件层操作
如果需要访问特定磁盘,就需要调用具体文件系统的函数
但有些文件系统相关的操作不一定直接涉及到磁盘上的文件,而是与文件对象在内存中的表示相关
- eg:lseek()可以修改文件的读写位置(文件指针)
- 文件指针只是一个文件与进程交互时涉及的属性,只需要修改对象中的数据即可
vfs支持的文件系统
磁盘文件系统
通常被存放在硬件块设备中
其中,unix的文件目录是以/为根目录的一棵树,根目录被包含在根文件系统里
- 在linux里,这个根文件系统一般是ex2 / ex3类型
挂载文件系统
其他类型的文件系统可以被安装在根文件系统的子目录下
- 而又因为linux可以支持虚拟块设备,这种设备可以用来安装普通文件所在的文件系统
- 进而就可以把虚拟块设备挂载到linux的根目录下
- 所以,os就可以同时支持多种文件系统,每个文件系统可以安装在不同的虚拟块设备上,并挂载到根文件系统的不同子目录下
安装文件系统到某个目录下,该目录下的内容就会被隐藏,直到卸载该文件系统:
虚拟块设备
用于在内存中创建虚拟的块设备,而不涉及实际的物理存储介质
用途
/dev/loop0
是 Linux 系统中用于循环设备(loop device)的设备文件之一
- 循环设备是一种特殊的虚拟块设备,它允许将文件当作块设备来访问(使用类似于物理磁盘的方式来操作这个文件)
- 它允许用户将文件系统映射到一个文件上,从而在文件系统和文件之间建立一种逻辑关联,使得该文件能够像块设备一样进行读写操作
网络文件系统(Network File System,NFS)
它允许一个计算机(称为NFS服务器)共享其文件系统并允许其他计算机(称为NFS客户端)通过网络访问这些共享文件
特殊文件系统
具有特殊用途或特定功能的文件系统
- 这些文件系统通常不是传统的磁盘文件系统,而是用于提供特定类型的访问、控制或信息获取的接口
- 比如 /proc -- 提供了关于当前正在运行的系统进程和内核状态的信息
vfs蕴含的主要思想就是引入了一个通用的文件模型
通用文件模型
介绍
它提供了一个通用的框架来理解文件系统中的文件和目录结构、文件访问权限、文件属性等概念
- 对于每个具体的文件系统,需要将其物理组织结构转换为符合通用文件模型的结构
- 比如:
也正因为如此,linux内核里不能写死文件操作,而是要根据[要操作的文件]对应的文件系统类型,来决定调用什么方法
类比
可以把VFS看作是通用文件模型的实现
- 通用文件模型提供了一种抽象的框架来理解文件系统中的文件、目录、权限等概念,它是一种概念上的设计
- 而VFS是在os中实际实现了这一概念的软件模块
- 类似于面向对象的语言中,类和对象的关系
组成
- 超级块对象(super block)
- 索引节点对象(inode)
- 文件对象
- 目录项对象
其实早在linux进程那块,我们就已经介绍了超级块,块组,inode等知识 -- 启动块,块组介绍,超级块,inode表,inode,数据块(块大小,文件和数据块的对应),文件名存放位置(如何写入/读取目录,如何查找文件),块位图,inode位图,块组描述符表,文件系统的格式化_group descriptor table-CSDN博客
进程与文件的交互
每个进程打开文件时,都会为他们分配一个文件对象
- 这个文件对象可以指向相同的目录项对象(如果硬链接相同的话,硬链接其实是一个文件的入口)
- 然后这个目录项对象里,会存放对应inode对象的指针
- 根据inode,我们可以拿到超级块对象以及文件属性/数据信息(超级块是用来管理整个文件系统的,它存储了文件系统的元信息)
- 最后,根据块组中记录的信息,我们可以为文件分配空间/修改数据
VFS除了能为所有类型的文件系统提供统一的接口外,也可以提高系统性能
磁盘高速缓存
介绍
类型
目录项高速缓存
- 当操作系统需要查找某个文件或目录时,会先检查目录项缓存,如果目标文件或目录的目录项已经被缓存,则可以直接从缓存中获取相应的信息,而不必进行磁盘访问
索引节点高速缓存
- 操作系统需要对文件进行操作时,会先检查索引节点缓存,如果目标文件的索引节点已经被缓存,则可以直接从缓存中获取文件的元数据信息,而不必进行磁盘访问
页高速缓存
- 缓存从磁盘读取的页面,当操作系统需要读取文件系统中的数据或索引节点时,会先检查页高速缓存,如果相应的页面已经被缓存,则可以直接从缓存中获取,而不必进行磁盘访问
其中目录项/索引节点高速缓存,会在另一篇介绍
与硬件/内存高速缓存的区分
磁盘高速缓存设计出来主要就是针对磁盘io操作
- 用于缓存磁盘上的数据块和元数据,以减少对磁盘的访问次数,提高磁盘I/O性能
而硬件高速缓存主要针对CPU和内存之间的数据交换
- 位于CPU与主存之间的芯片上
- 通过在CPU与主存之间加入一层高速缓存来存储最常用的数据和指令,以提高CPU对数据的访问速度,减少对主存的访问次数,从而提高整个系统的运行速度
- 一般分为三级缓存
内存高速缓存主要针对主存(内存)中的数据和指令
- 位于内存控制器或内存模块上
- 通过在内存控制器或内存模块上加入一层高速缓存来存储最常用的数据块,以提高CPU对内存的访问速度,减少对内存的访问延迟