linux的文件系统是由若干个树形以及链表的结构组成的,其中众所周知,所有的目录和文件组成了视觉上“一棵”树,在这“一棵”树背后有一条挂载链表,如果说每一个文件系统都是一棵树的话(实际上就是如此),这个链表将很多棵树链接成了那“一棵”树,因此,linux的文件系统是由很多棵树组成的,这些树通过挂载链表联系在了一起,比如/tmp/my是一个目录,下面有文件file1,而我们可以将一个磁盘分区D挂载在这个目录下,此时/tmp下面的文件就是磁盘分区D下面的文件了,不仅仅如此,通过这个模型还可以实现非存储性质的文件系统甚至任意的文件系统,比如procfs,sysfs,tmpfs等等,在已挂载的文件系统的任意目录挂载任意的文件系统,这些文件系统可以在磁盘上,可以在网络上,可以在内存中,也可以在你心里,由此看来,这种文件系统实际上是可以无限扩展的。
     在最底层,linux维护了一个磁盘inode的概念,它代表了一个实际文件,然后在上一层,linux维护了内存inode,它使得操作系统可以提供用户接口来操作磁盘inode,内存inode和磁盘inode是对应的,vfs层将不同文件系统的不同格式的磁盘inode统一成了一致的内存inode,如此一来向上提供的接口将统一,在接口统一之前,数据结构首先要统一。和内存inode相关的是目录项dentry的概念,它绑定一个且只绑定一个内存inode,但是却允许多个dentry绑定同一个内存inode,实际上它就是我们在使用操作系统时看到的每一个文件的内核实体,既然允许dentry和inode的多对一的关系,操作系统很简单地就可以实现诸如链接这样的概念,这个意义上dentry并不是和内存inode处于同一个层次,inode表示文件的本质,而dentry表示操作系统意义上文件的接口。
     unix最先实现了vfs,在unix中内存inode成为vnode,这个名称可能更好听些。这个vfs在linux中的实现要更复杂一些,其本质就是这个内存inode数据结构,进而在该数据结构的基础上提供file_operations操作函数集,这些数据结构是怎样组合起来的呢?它们是在什么时候组合在一起的呢?任何事情如果想搞透它就要从起源开始研究,于是sys_open系统调用中必然将这一切联系在了一个,如果说sys_open还不够的话,那么sys_mount作为一个文件系统的开始一定确定了该文件系统的基本模板,比如super_block结构之类的,由于sys_mount还是要使用sys_open,那么sys_open当然是重中之重了。open的轮廓为两层循环,外部的循环解析路径,内层的循环在特定的路径寻找待open路径中下一个元素,路径元素由'/'分割。在进一步处理下一个路径元素之前,必须将当前的dentry设置到当前目录的最顶一层挂载的文件系统的根目录,这个在linux中由follow_mount来实现,这样所有被mount的目录下的原始内容就被隐藏了,原先的树依然存在,只是在这个节点上又长出一个新的根,然后这个新根又扩展成一棵树,任意的树节点上都可以生长出新根,然后递归地长出新树。
     系统中每一个被挂载的文件系统都有一个超级块,超级块是该文件系统的元数据 ,所有的同类文件系统的超级块链接成一个链表,在超级块回调函数的指导之下,系统模块可以支持各种各样的文件系统。系统中还有一张挂载表,实际上是挂载树,很多内核实体都是同时连入不同的数据结构,这样就方便在不同场合使用不同的数据结构,比如vm_area_struct既连入链表,又连入红黒树中。这个挂载表的每一项表示一次挂载,包含一个挂载文件系统的超级块信息,被挂载点的inode对应的dentry,挂载文件系统根的inode对应的dentry以及设备号。
     每个挂载的文件系统都有一个根,即“/”,它是一个特殊的目录,一般每一类文件系统都会为这个根分配一个固定的内存inode号,然后为后续此挂载文件系统分配挂载范围内唯一的inode号,因此不同挂载点的文件系统中的文件的内存inode号会相同,注意,一般不要提及磁盘inode号是否唯一的问题和概念,因为并不是每一种文件系统都有磁盘inode概念的,unix/linux只是为了实现vfs才将很多的文件系统统一“适配”到内存inode(vnode),比如ntfs就没有inode的概念,当在linux上挂载ntfs分区的时候,内核的ntfs模块会将ntfs文件的元数据装载到内存inode中,这就是适配器模式在linux内核的应用。

转载于:https://blog.51cto.com/dog250/1271765

linux的文件系统架构相关推荐

  1. 查看linux文件系统结构,linux的文件系统架构

    linux的文件系统是由若干个树形以及链表的结构组成的,其中众所周知,所有的目录和文件组成了视觉上"一棵"树,在这"一棵"树背后有一条挂载链表,如果说每一个文件 ...

  2. Linux文件系统架构

    文章目录 一.Linux 介绍 二.Linux 的文件系统(File System) 2.1 Linux 的文件系统架构 2.2 /bin 和 /sbin 2.3 /boot 2.4 /dev 2.5 ...

  3. 从单片机步入Linux之文件系统的构建

    大家好,我是情报小哥! 本文为[从单片机步入嵌入式Linux]系列文章的第四篇文章,前面三篇大家有时间也可以回头阅读一下,本系列文章的很多知识我都会从裸机开发和理解的角度来分析,帮助大家迅速理解Lin ...

  4. Linux内核系统架构介绍

    28年前(1991年8月26日)Linus公开Linux的代码,开启了一个伟大的时代.这篇文章从进程调度,内存管理,设备驱动,文件系统,网络等方面讲解Linux内核系统架构.Linux的系统架构是一个 ...

  5. Linux 内核系统架构

    描述Linux内核的文章已经有上亿字了 但是对于初学者,还是应该多学习多看,毕竟上亿字不能一下子就明白的. 即使看了所有的Linux 内核文章,估计也还不是很明白,这时候,还是需要fucking th ...

  6. Linux根文件组织架构

    Linux根文件组织架构 bin : 二进制可执行命令 boot : 引导文件 cdrom : dev : 设备特殊文件 etc : 系统管理和配置文件profile : 配置环境变量,对所有用户有效 ...

  7. Linux源代码组织架构

    Linux源代码组织架构 arch : 架构相关代码 block : 块存储设备代码,实际上也就是调度算法. crypto : 加密算法 Documentation : 文本文档 drivers : ...

  8. linux系统文件系统个目录介绍,关于linux的文件系统目录详细介绍

    首先我们回答一下最为宽泛的问题,什么是文件系统? 文件系统是对一个存储设备上的数据和元数据进行组织的机制.liuux的文件系统体系结构是一个对复杂系统进行抽象化的有趣例子,通过使用一组通用的API函数 ...

  9. HDFS分布式文件系统架构

    文章目录 HDFS分布式文件系统架构 1.HDFS概论与基础框架结构 HDFS基础介绍 HDFS设计架构 HDFS设计结构-NameNode HDFS设计结构-DataNode HDFS设计结构-Cl ...

最新文章

  1. 有效的rtsp流媒体测试地址汇总
  2. 导入python库linux_Linux下Python安装PyMySQL成功,但无法导入的问题
  3. 自定义ViewGroup实现ViewPager的滑动效果
  4. Linux/Unix系统编程手册 第三章:系统编程概念
  5. OAauth2.0包括以下角
  6. DRBD编译安装中出现的问题及解决小结
  7. [css] 你是如何压缩字体的?
  8. leetcode48. 旋转图像
  9. 第二阶段冲刺10天 第六天
  10. 设置开机ceph自动map rbd块设备
  11. 30.Qt的内存管理
  12. 在微软5年,我学到的几个小技能
  13. Docker学习笔记 - Docker容器的日志
  14. ES6新特性 - const let var
  15. Log4j2 高危漏洞分析
  16. 【JAVA秒会技术之ActiveMQ】ActiveMQ的快速入门
  17. Python批量爬取堆糖网图片
  18. spring quartz 实现全局任务
  19. 【视频编码压制】关于近两年的视频压制学习总结种种
  20. 多种开关电源MOS管驱动电路详细解析

热门文章

  1. 字符串匹配:字符串中查找某子串
  2. 项目部署—连接不上远程redis服务怎么办?
  3. Github客户端使用教程
  4. Linux下 查看网络连接状态的命令是,查看Linux操作系统下的网络连接状态命令
  5. mysql 时间函数大全_mysql常用的日期函数汇总
  6. 原生ajax通过post或者get下载文件,或处理IE浏览器因为后缀不能显示图片
  7. TCP/IP中的传输层协议TCP、UDP
  8. 路由总结之静态、RIP、OSPF、IS-IS、BGP和策略路由
  9. 收到朋友寄来的煎饼了
  10. Android之使用HttpURLConnection类查看网络图片以及网络源码