热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

理解linux虚拟文件系统VFS概述

当前,除了Linux标准的文件系统Ext2Ext3Ext4外,还有很多种文件系统,比如reiserfs,xfs,Windows的vfatN

当前,除了Linux标准的文件系统Ext2/Ext3/Ext4外,还有很多种文件系统,比如reiserfs, xfs, Windows的vfat NTFS,网络文件系统nfs 以及flash 文件系统jffs2, yaffs/yaffs2 ubifs。linux通过叫做VFS的中间层对这些文件系统提供了完美的支持。

对于用户来说,这些文件系统几乎是透明的,在大部分情况下,用户通过libc和kernel的VFS交互,不需要关心底层文件系统的具体实现,但是有时应用程序也需要考虑底层文件系统限制(比如fat vfat不支持链接,比如各个文件系统支持最大文件限制不同)。


VFS存在的意义

1. 向上,对应用层提供一个标准的文件操作接口;

2. 对下,对文件系统提供一个标准的接口,以便其他操作系统的文件系统可以方便的移植到Linux上;

3. VFS内部则通过一系列高效的管理机制,比如inode cache, dentry cache 以及文件系统的预读等技术,使得底层文件系统不需沉溺到复杂的内核操作,即可获得高性能;

4. 此外VFS把一些复杂的操作尽量抽象到VFS内部,使得底层文件系统实现更简单。



VFS架构图




文件系统分类

文件系统一般可以分为以下几类

1. 磁盘文件系统

这类文件系统数目最多,最常见:ext2/ext3/ext4文件系统;resierfs文件系统 SGI的XFS文件系统;jffs2 yaffs ubifs等flash文件系统;crasmfs squashfs等只读文件系统;fat vfa ntfs等windows文件系统;

这类文件系统大部分都是基于块设备的文件系统,文件系统的数据和元数据都保存在块设备上;flash文件系统略有差别,flash文件系统是位于MTD之上的,

flash文件系统需要处理坏快,垃圾收集,磨损平衡等复杂的功能。f随着SD/MMC卡的普及,以及flash文件系统在可扩展性,启动速度上的先天不足。flash文件系统已经慢慢退出了嵌入式舞台。

cramfs squashfs存在的意义在于简单,高效,稳定(简单的东西自然稳定),在文件系统只读的场景,仍然会被用到。二者的共同特点就是只读,压缩。我们要有这样一个概念,文件系统的复杂来源于写数据,删除,truncate操作,目录添加删除等,因此一个只读文件系统远比可读写文件系统简单。最直观的方法就是查看cramfs文件系统实现代码行数,只有区区两个小文件。

Reiserfs 提出了很多文件系统的新概念,对小文件的读写操作做了很大的优化,当然新概念过多,也是导致可读性可理解性差的原因。此外由于reiserfs的作者Hans reiserfs因为杀妻罪名成立,所以reiserfs的开发也受到了影响。

XFS相当的复杂,后面我会单独开一篇分析

2. 特别的文件系统

此类文件系统也很常用,他们不是提供常规文件的存储和访问,文件系统建立在内存之上,提供特殊的文件系统功能。如proc文件系统,pipe文件系统,以及tmpfs

3. 网络文件系统

包括NFS CODA AFS等网络文件系统



通用文件模型

VFS为底层文件系统提供了抽象,有两种策略提供这种抽象。

1. 提供一个最小的通用模型,使得这个模型支持的功能是所有文件系统的最小交集

2. 提供一个尽量大的通用模型,使得这个模型包含所有文件系统功能的合集。

Linux采用第二种策略来实现VFS,因此VFS封装了底层文件系统的所有功能和抽象,VFS负责把应用层的请求转发给特定的文件系统。


在处理文件时,应用空间和内核空间使用的对象是不同的。对应用程序来说,文件描述符用来表示一个文件,这个文件描述符是打开文件时内核分配给这个文件的一个整数,注意,这个文件描述符只在本进程内有效;而对于内核来说,则使用一个inode来表示一个文件,这个inode可能对应着应用层多个进程内的多个文件描述符。


inode

内核中的每一个文件或者目录都有一个inode,inode由两个主要部分组成:

1. 描述文件状态的元数据,文件元数据包括文件大小,权限,类型,时间;

2. 文件数据描述,则用来定义文件数据在磁盘上的存放位置。

inode仅仅是文件在内核内存中的表现形式,虽然每个文件都有inode,但是并不是每个文件在磁盘上都有对应磁盘inode,实际上有些文件系统并没有磁盘inode,inode的生成有时要借助文件系统扫描。


链接

链接是unix特有的概念,又分为软链接和硬链接

软链接又称为符号链接,软链接文件内容指向一个文件路径,也就是文件真实位置,软链接指向的文件也可以是软链接

硬链接是两个文件共享同一个inode,

并不是所有的文件系统都支持符号链接和硬链接,比如fat, yaffs等文件系统并不支持符号链接。一般来说,没有磁盘目录结构的文件系统肯定不支持硬链接,而没有磁盘inode的肯定不支持链接。

软硬链接虽然为linux/unix操作管理带来了很多便利,但是在很多软件实现上,往往引入很大的复杂性。


VFS 对象类型

VFS通用模型包含以下类型对象:

1. super block

存储文件系统相关的信息,对于磁盘文件系统来说,这个对象通常对应磁盘上的一个文件系统控制块(磁盘super block)

2. inode

存储一个文件相关的信息,对于磁盘文件系统,这个对象通常对应磁盘上的一个文件控制块(磁盘inode)。每一个inode都对应一个编号,可以在文件系统内唯一标识这个文件。

3. file

file是和进程相关的,file代表一个打开的文件,file和inode之间是多对一的关系,因为多个进程可以打开同一个文件,系统会为每一次打开都创建一个file结构。

4. dentry

底层文件系统的许多操作严重依赖文件的inode,在进行文件操作前,我们需要根据路径名找到文件对应的inode。我们知道文件系统是树状结构的,因此需要从根目录通过目录树找到要操作的文件或目录,这个遍历过程涉及到磁盘操作,非常耗时。根据局部性原理,很有必要把这个查找过程cache起来,dentry就是为了加快目录遍历操作引入的数据结构。

每一个基于磁盘的文件系统,都有特定的方法用来构建目录树。一般来说有两种方式:

1. 磁盘上保存着目录项

2. 通过磁盘文件的父子关系重建目录项


推荐阅读
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • Python学习:环境配置与安装指南
    Python作为一种跨平台的编程语言,适用于Windows、Linux和macOS等多种操作系统。为了确保本地已成功安装Python,用户可以通过终端或命令行界面输入`python`或`python3`命令进行验证。此外,建议使用虚拟环境管理工具如`venv`或`conda`,以便更好地隔离不同项目依赖,提高开发效率。 ... [详细]
  • 全面解析:Hadoop技术栈中的Linux操作系统概览
    全面解析:Hadoop技术栈中的Linux操作系统概览 ... [详细]
  • 深入解析OSI七层架构与TCP/IP协议体系
    本文详细探讨了OSI七层模型(Open System Interconnection,开放系统互连)及其与TCP/IP协议体系的关系。OSI模型将网络通信过程划分为七个层次,每个层次负责不同的功能,从物理层到应用层逐步实现数据传输和处理。通过对比分析,本文揭示了OSI模型与TCP/IP协议在结构和功能上的异同,为理解现代网络通信提供了全面的视角。 ... [详细]
  • 在 Linux 系统中,`/proc` 目录实现了一种特殊的文件系统,称为 proc 文件系统。与传统的文件系统不同,proc 文件系统主要用于提供内核和进程信息的动态视图,通过文件和目录的形式呈现。这些信息包括系统状态、进程细节以及各种内核参数,为系统管理员和开发者提供了强大的诊断和调试工具。此外,proc 文件系统还支持实时读取和修改某些内核参数,增强了系统的灵活性和可配置性。 ... [详细]
  • 优化后的标题:PHP分布式高并发秒杀系统设计与实现
    PHPSeckill是一个基于PHP、Lua和Redis构建的高效分布式秒杀系统。该项目利用php_apcu扩展优化性能,实现了高并发环境下的秒杀功能。系统设计充分考虑了分布式架构的可扩展性和稳定性,适用于大规模用户同时访问的场景。项目代码已开源,可在Gitee平台上获取。 ... [详细]
  • 本文深入探讨了IO复用技术的原理与实现,重点分析了其在解决C10K问题中的关键作用。IO复用技术允许单个进程同时管理多个IO对象,如文件、套接字和管道等,通过系统调用如`select`、`poll`和`epoll`,高效地处理大量并发连接。文章详细介绍了这些技术的工作机制,并结合实际案例,展示了它们在高并发场景下的应用效果。 ... [详细]
  • 掌握DSP必备的56个核心问题,我已经将其收藏以备不时之需! ... [详细]
  • 深入解析 Unity URP/SRP 渲染管线:匠心打造的全面指南
    本文深入探讨了Unity中的URP、SRP和HDRP渲染管线,详细解析了它们之间的关系及各自的特点。首先介绍了SRP的基本概念及其在Unity渲染架构中的作用,随后重点阐述了URP和HDRP的设计理念与应用场景。文章还分析了SRP诞生的背景,解释了为何Unity需要引入这一灵活的渲染框架,以满足不同项目的需求。通过对比URP和HDRP,读者可以更好地理解如何选择合适的渲染管线,以优化项目的性能和视觉效果。 ... [详细]
  • 从无到有,构建个人专属的操作系统解决方案
    操作系统(OS)被誉为程序员的三大浪漫之一,常被比喻为计算机的灵魂、大脑、内核和基石,其重要性不言而喻。本文将详细介绍如何从零开始构建个人专属的操作系统解决方案,涵盖从需求分析到系统设计、开发与测试的全过程,帮助读者深入理解操作系统的本质与实现方法。 ... [详细]
  • 在Linux系统中,目录结构遵循文件系统层次标准(FHS),确保了系统的组织性和可维护性。其中,`/bin`目录是FHS要求必须存在的目录之一,主要存放了在单用户维护模式下仍可执行的基本命令和工具。这些命令不仅对root用户可用,普通用户也能使用,以确保系统在最小化运行状态下仍能进行基本的操作和管理。 ... [详细]
  • 深入解析 C 语言与 C++ 之间的差异及关联
    深入解析 C 语言与 C++ 之间的差异及关联 ... [详细]
  • 个人学习进阶:深入解析Tomcat架构体系(第一部分)
    大家好,欢迎来到X的技术分享。近期我一直在深入研究Tomcat的架构体系,收获颇丰。作为一款广泛使用的应用服务器,Tomcat的架构设计非常精妙,对理解和优化Web应用具有重要意义。在本系列的第一部分中,我将详细解析Tomcat的核心组件及其工作原理,帮助读者建立坚实的基础。希望这些内容能为大家的学习和实践带来启发。 ... [详细]
  • MacOS双系统安装指南:十分钟速成,轻松省下数百元! ... [详细]
  • NanoPi2 使用体验深入解析(续篇)
    随着Raspberry Pi的问世,开源硬件领域迎来了前所未有的发展,激发了全球范围内的创新热潮。在中国,这一趋势同样催生了一系列类似的开发板,例如NanoPi 2。本文作为前篇的延续,将深入探讨NanoPi 2的实际使用体验,从性能、兼容性到应用场景,进行全面分析。 ... [详细]
author-avatar
mindylee
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有