当前,除了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. 通过磁盘文件的父子关系重建目录项

理解Linux虚拟文件系统VFS的更多相关文章

  1. Linux虚拟文件系统VFS解决

    参考<Linux内核设计与实现> 虚拟文件系统(VFS)它是linux核心和详细I/O一个普通的访问接口之间的包装设备,通过这层界面,linux内核能够以同一的方式訪问各种I/O设备. 虚 ...

  2. linux虚拟文件系统vfs

    linux可以挂载不同的文件系统(EXT2,FAT,NTFS),用同一的样式呈现给用户,读写操作用起来都一样,这是怎样做到的呢? linux内核在各种不同的文件系统格式上做了一个抽象层,使得文件.目录 ...

  3. Linux虚拟文件系统–VFS简介

    http://www.embeddedlinux.org.cn/emb-linux/file-system/201712/20-7907.html 导读 Linux中可以支持多种文件系统,而且支持各种 ...

  4. Linux虚拟文件系统(VFS)学习

    虚拟文件系统(Virtual Filesystem)也可称之为虚拟文件系统转换(Virtual Filesystem Switch),是一个内核软件层,用来处理与Unix标准文件系统相关的全部系统调用 ...

  5. 使用 /proc 文件系统来访问 linux操作系统 内核的内容 && 虚拟文件系统vfs及proc详解

    http://blog.163.com/he_junwei/blog/static/19793764620152743325659/ http://www.01yun.com/other/201304 ...

  6. Linux虚拟文件系统

    从文件 I/O 看 Linux 的虚拟文件系统 1 引言 Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等.通过使用同一套文件 I/O 系统 调用即可对 Linux ...

  7. 虚拟文件系统(VFS)

    原文链接:http://www.orlion.ga/1008/ linux在不同的文件系统之上做了一个抽象层,使得文件.目录.读写访问等概念都成为抽象层概念,这个抽象层被称为虚拟文件系统(VFS). ...

  8. 虚拟文件系统VFS

    Linux的文件系统是由虚拟文件系统作为媒介搭建起来的,虚拟文件系统VFS(Virtual File System)是Linux内核层实现的一种架构,为用户空间提供统一的文件操作接口.它在内核内部为不 ...

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

    更多嵌入式原创文章,请关注公众号:一口Linux 一:文件系统 1. 什么是文件系统? 操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统. 通常文件系统是用于存储和组织文件的一 ...

随机推荐

  1. GreenDao 数据库升级 连接多个DB文件 或者指定不同的model&dao目录

    相信很多人都用过greenDao 今天 我抽空总结下使用的时候一些小东西吧 废话不多说 下边就GreenDao 的使用遇到的问题以及解决方案记录一下吧. 1.greendao 指定不同的生成目录: S ...

  2. iOS Automated Tests with UIAutomation

    参照:http://blog.manbolo.com/2012/04/08/ios-automated-tests-with-uiautomation#1 UI Automation JavaScri ...

  3. 2012-2013 ACM-ICPC, NEERC, Central Subregional Contest H Milestones1 (暴力)

    预处理+暴力,每个颜色都是独立的,求个前缀和,减一减判断一个在区间内颜色是否存在. 算了算复杂度好像有点勉强,但是还是过了,学了主席树以后用主席树在做一下 #include<bits/stdc+ ...

  4. KMP算法入门讲解

    字符串匹配问题.假设文本是一个长度为$n$的字符串$T$,模板是一个长度为$m$的字符串$P$,且$m\leq n$.需要求出模板在文本中的所有匹配点$i$,即满足$T[i]=P[0],T[I+1]= ...

  5. 解决sublime text 2总是在新窗口中打开文件(标签中打开)

    在mac下不是很喜欢sublime text 2 总是在新窗口中打开文件,很麻烦,文件打多了,就会出现N多窗口,虽然可以直接打开当前目录可以解决,但有时候查看其它项目中的单个文件,就比较麻烦.百度一直 ...

  6. Dojo的ready函数:dojo.ready(以前的dojo.addOnLoad)

    dojo的dojo/domReady!插件和dojo/ready的区别:     In simple cases,dojo/domReady! should be used. If an app us ...

  7. Bootstrap标签页(Tab)插件

    标签页(Tab)在Bootstrap导航元素一章中简介过,通过结合一些data属性,您可以轻松地创建一些标签页界面.通过这个插件您可以把内容放置在标签页或胶囊式标签页甚至是下拉菜单标签页中. 用法 您 ...

  8. Oracle 闪回 找回数据的实现方法

    Oracle 闪回 找回数据的实现方法 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复.这篇文章主要介绍了Oracle 闪回 找回 ...

  9. iOS JS 交互之利用系统JSContext实现 JS调用oc方法

    ios js 交互分为两块: 1.oc调用js 这一块实现起来比较简单, 我的项目中加载的是本地的html,js,css,需要注意的是当你向工程中拖入这些文件时,选择如下操作,(拖入的文件夹是蓝色的, ...

  10. 2d游戏中的射线与矩形检测碰撞

    cc.exports.LineCollideRect(startLine,endLine,rect)--向量与矩形检测碰撞 --获取矩形的四个顶点位置 local p = {cc.p(rect.x,r ...