linux 里面当我们执行 ls -li 命令 的时候会发现,很多文件类型。例如:

– 普通文件

d 目录文件

s socket 文件

b 块设备文件 比如说磁盘

l  连接文件

p 管道文件

他们虽然类型不同,但是linux 对其提供的却是同一套操作接口。这套接口就是VFS(Virtual File System 简称VFS).

VFS  它是 Linux 内核中的一个软件层,用于给用户空间的程序提供文件系统接口;同时,它也提供了内核中的一个 抽象功能,允许不同的文件系统共存。系统中所有的文件系统不但依赖 VFS 共存,而且也依靠 VFS 协同工作。

linux 文件系统架构图

通过这张图可以看出linux支持各种文件系统

第一类是基于磁盘的文件系统,也就是把数据直接存储在计算机本地挂载的磁盘中。常见的 Ext4、XFS、OverlayFS 等,都是这类文件系统。

第二类是基于内存的文件系统,这类文件系统,不需要任何磁盘分配存储空间,但会占用内存。我们经常用到的 /proc 文件系统,其实就是一种最常见的虚拟文件系统。此外,/sys 文件系统也属于这一类,主要向用户空间导出层次化的内核对象。

第三类是网络文件系统,也就是用来访问其他计算机数据的文件系统,比如 NFS、SMB、iSCSI 等。

为了方便管理,Linux文件系统为每个文件都分配了两个数据结构,索引节点,和目录项。

索引节点:用于存储文件的元数据的一个数据结构。文件的元数据,也就是文件的相关信息,和文件本身是两个不同 的概念。它包含的是诸如文件的大小、拥有者、创建时间、磁盘位置,文件权限等和文件相关的信息。索引节点跟文件一一对应,持久化在磁盘里面。索引节点同样占磁盘空间。

索引节点是每个文件的唯一标识。通过ll -i 可以看到第一列就是。

目录项:directory dentry 目录项,简称为 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的关联关系。多个关联的目录项,就构成了文件系统的目录结构。不过,不同于索引节点,目录项是由内核维护的一个内存数据结构,所以通常也被叫做目录项缓存。是不是很难理解? 嘎嘎 那就说的简单点:

在一个文件路径中,路径中的每一部分都被称为目录项;如路径/home/source/helloworld.c中,目录 /, home, source和文件 helloworld.c都是一个目录项。VFS在查找的时候,根据一层一层的目录项找到对应的每个目录项的inode,那么沿着目录项进行操作就可以找到最终的文件。

换句话说,索引节点是每个文件的唯一标志,而目录项维护的正是文件系统的树状结构。目录项和索引节点的关系是多对一,你可以简单理解为,一个文件可以有多个别名。举个例子,通过硬链接为文件创建的别名,就会对应不同的目录项,不过这些目录项本质上还是链接同一个文件,所以,它们的索引节点相同。

超级块 用于存储文件系统的控制信息的数据结构。描述文件系统的状态、文件系统类型、大小、区块数、索引节点数等,存放于磁盘的特定扇区中。

超级块 存储一个已安装的文件系统的控制信息,代表一个已安装的文件系统;每次一个实际的文件系统被安装时, 内核会从磁盘的特定位置读取一些控制信息来填充内存中的超级块对象。一个安装实例和一个超级块对象一一对应

索引节点和目录项纪录了文件的元数据,以及文件间的目录关系,那么具体来说,文件数据到底是怎么存储的呢?是不是直接写到磁盘中就好了呢?

实际上,磁盘读写的最小单位是扇区,然而扇区只有 512B 大小,如果每次都读写这么小的单位,效率一定很低。所以,文件系统又把连续的扇区组成了逻辑块,然后每次都以逻辑块为最小单元,来管理数据。常见的逻辑块大小为 4KB,也就是由连续的 8 个扇区组成。

磁盘在执行文件系统格式化时,会被分成三个存储区域,超级块、索引节点区和数据块区。其中,

超级块,存储整个文件系统的状态。

索引节点区,用来存储索引节点。

数据块区,则用来存储文件数据。也就是逻辑块所在的地方

那一个进程打开文件的时候流程是怎么样的呢?

进程通过task_struct(每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体.)

中的一个域files,files_struct(文件结构体)来了解它当前所打开的文件对象;

而我们通常所说的文件描述符(fd)其实是进程打开的文件对象数组的索引值。

文件对象通过域f_dentry找到它对应的dentry对象,再由dentry对象的域d_inode找到它对应的索引结点,这样就建立了文件对象与实际的物理文件的关联。

最后,还有一点很重要的是, 文件对象所对应的文件操作函数列表是通过索引结点的域i_fop得到的.

总结: 1 linux把各种设备也称之为文件

2 为了管理不同文件系统,linux抽象出一个VFS

3 文件系统是特殊的数据分层存储结构,它包含文件、目录和相关的控制信息

4 为了描述这个结构,引入了目录项,索引节点,超级块

5 超级块可以理解为一个已安装文件系统(例如EXT4,XFS)

6 索引节点存储一个实际的物理文件的大小,权限,创建时间,属主等信息

7 目录项 存储在内存里,用以保存文件系统的目录结构,同时还可以用以保存文件名,索引节点指针。

8 逻辑块 为了提高读写效率,把8个相邻的扇区组合成一个4K的逻辑块。

9 进程通过打开的文件对象,找到目录项,然后通过里面的索引节点指针找到索引节点,这样就能找到物理文件了。

https://blog.csdn.net/heikefangxian23/article/details/51579971  这篇很屌,建议阅读。从头读到尾,代码看不懂没关系 看懂图就行了。

https://blog.csdn.net/kickxxx/article/details/9468761 理解linux虚拟文件系统VFS – 概述

linux 文件系统 vfs,Linux 万物皆文件—VFS文件系统相关推荐

  1. 深入解析Linux系统中的“一切皆文件“

    一切皆文件 0 实现 MiniShell 1 C文件IO 2 文件相关系统调用接口 2.1 open 接口介绍 3 文件描述符 3.1 什么是文件描述符 3.2 文件描述符的分配规则 3 你是怎么理解 ...

  2. Linux操作系统使用基础06:文件与文件系统的压缩与打包

    目录 1. Linux系统常见压缩命令 1.1 压缩文件管用后缀名 1.2 gzip命令 1.3 bzip2命令 1.4 tar命令 1.1.4 打包与压缩 1.4.2 解包解压缩 1.4.3 查看文 ...

  3. 【Linux基础篇三】为什么说在Linux世界里,一切皆文件?

  4. JavaIO流,万物皆文件

    引入IO的原因 基本概念: 数据源和流的概念 IO流的概念细分 IO流的体系 IO流在Java中的流对象:inputStream .... Java对象的序列化和反序列化: 1 为什么需要序列化和反序 ...

  5. 走进Linux(一切皆文件)

    文章目录 悄悄来到Linux 进入Linux(已配置完毕) 一切皆文件 常用的命令 根据实例来升级 文件 用户 进程(process) 磁盘分区(disk) 端口号 其他 悄悄来到Linux 在我们熟 ...

  6. 【已阅】Linux下一切皆文件与指令的本质(可执行程序),which指令等

    Linux下一切皆文件 在Linux下的话,一切皆文件.主要是看待诸如软硬件设备与磁盘文件的看法:一切皆文件,比如说显示器它也是文件,键盘也是文件,普通文件肯定是文件. 首先就是显示器这个东西,它其实 ...

  7. linux 权限属性,linux 文件或目录的权限和属性

    1.windows 和linux文件类型的区别 windows 里是通过扩展名来区分文件类型的:linux里文件扩展名和文件类型没有关系,为了容易区分和箭筒用户使用的windows的习惯,我们也会用扩 ...

  8. 嵌入式Linux视频笔记----Linux基础入门

    https://www.bilibili.com/video/BV1JK4y1t7io/?spm_id_from=333.788.videocard.2 运行于ARM-A7的嵌入式Linux系统基础知 ...

  9. 嵌入式 详解制作根文件系统以及文件系统中init以及其他文件详解

    一.FHS(Filesystem Hierarchy Standard)标准介绍 当我们在linux下输入ls  / 的时候,见到的目录结构以及这些目录下的内容都大同小异,这是因为所有的linux发行 ...

最新文章

  1. DL之决策树(Decision tree)
  2. 设置程序默认打开方式
  3. iOS 获取当前月份的天数(转)
  4. Codeforces Round #701 (Div. 2) E. Move and Swap 思维 + dp
  5. Linux的网络协议族是什么,Linux 网络协议的概述
  6. 酷狗笔试题:补齐左括号(栈)
  7. 分布式系统认证方案_分布式系统介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记134
  8. Lua基础篇-1 :什么是 Lua 语言?
  9. FPGA(FIR)数字信号处理
  10. STM32F 驱动WS2812B (3) SPI+DMA
  11. 布鲁特-福斯算法(字符串匹配)
  12. 树莓派x86Android,3种创客开发板走向专业-浅谈X86树莓派板型的UP系列
  13. matlab匿名函数如何写,matlab的匿名函数
  14. E4A(易安卓)学习——第一个APP
  15. java 查找 替换_Java 查找替换Excel数据
  16. oracle时间查询语句
  17. EMQX Windows部署 MQTT服务器 EMQX安装
  18. 微信小程序项目源码网上商城|电商+后台管理系统含论文+PPT+源码
  19. Scratch绘制蜘蛛网1
  20. jsp 模板引擎。无需 tomcat,只需一个 jar 包直接根据 jsp 源文件渲染得到 html 页面

热门文章

  1. 量子计算机与拓扑计算机区别,量子计算机:下一轮工业革命的引擎
  2. 第三篇:工具篇之DDD(二) 领域驱动实战
  3. vue项目 IE浏览器打开报错:strict 模式下不允许一个属性有多个定义
  4. 洛谷 2969 音符
  5. Unet++论文解读
  6. 北京程序员平均月薪超1.2万,又拖后腿了
  7. Linux cpuidle framework(2)_cpuidle core
  8. 退订招商银行广告邮件那些事
  9. simplify3d 打印参数设置笔记
  10. 2023深圳杯(东三省)数学建模A题思路 - 影响城市居民身体健康的因素分析