`
totoxian
  • 浏览: 1033716 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

Linux文件系统的设计

 
阅读更多

总论:

linux的文件系统设计非常优秀,总的来讲有两大部分,第一部分就是树形的组织结构,第二部分就是vfs,树形的组织结构组织了文件系统的表象,用户很方便的使用,而vfs是文件系统的实现机理,它处于内核态,不但实现了树形结构的mount机制,而且还提供了一个统一的接口用来访问设备。
一、Linux文件系统概述
1、Linux文件系统组织
Linux中使用树来组织文件系统。整个文件系统构成了一颗树,这棵树以/为根。整个系统有且只有这一颗文件树。这棵树描述了文件系统的拓扑结构,没有任何文件系统的类型信息。
2、mount机制
linux使用mount机制扩展文件系统,使不同类型的文件系统可以挂载在系统的文件树的任何位置。mount机制使文件树有了类型属性,支持了不同类型的文件系统的挂载。
如图所示。

可以看到如果不考虑挂载点,整个文件系统就是一棵树,如果考虑了挂载点,这棵树原来是嫁接而成的,可以包含各种不同种类的文件系统。正如桥片扩展了总线一样,挂载点扩展了文件树,和扩展总线不同的是,任意目录都可以是挂载点,但是不是任意芯片都是可以作为桥的。(网桥/交换机扩展以太网也是一样的道理,和mount机制更加类似一些,因为你只需要插入一个多端口网卡就可以作为一个网桥了。)
3、mount机制的好处
mount可以屏蔽文件系统的类型,所有类型的文件系统共享一棵树,但是实现却可以不相同。用户进程可以使用相同的系统调用接口访问所有的文件系统,而不必在意访问的文件是什么类型的。mount机制使一棵文件树得以多样化,然而又可以向用户屏蔽这种多样化。这种多样化是通过vfs实现的。
4、单棵树组织+mount扩展
Linux的文件系统和磁盘并不绑定,文件系统就是一棵树,是一个虚拟的概念,没有介质,没有容量,没有读写规则,只有在挂载(mount)发生的时候,也就是具体的文件系统挂载的时候,某个挂载点才和介质建立联系,然而此时对于文件系统来讲仍然没有容量的概念,容量仅仅是挂载于此目录的磁盘设备的属性,如果磁盘空间满了,仍然可以通过在此磁盘的一个目录上mount一个新的文件系统来解决,而新的文件系统在一块新的磁盘上。
5、和Windows文件系统的对比
Windows显式的分离了各种文件系统,虽然Windows在操作接口上也吸取了Unix中“一切皆文件”的思想。在接口级别,windows也使用相同的API来访问各类文件,比如ReadFile,WriteFile等,然而在操作级别,windows却没有实现一致性,在操作级别,windows的文件系统主要指以磁盘为介质的文件系统,因此windows没有必要用一棵树包含所有的文件,而是区分成了各个盘符,然而这种方式有个弊端,那就是不易扩展,因为单个盘符限制了容量,磁盘直接和文件系统绑定。因此,Windows不以单棵树树来组织文件系统,windows很难用mount来扩展文件系统。
二、VFS概述
1、VFS
虚拟文件系统或者虚拟文件插口,叫做插口更合适,也是官方的叫法,vfs向上和用户进程文件访问系统调用接口,如open,read,write等,向下和具体不同文件系统的实现接口,如read,write的不同实现。如下图所示:


2、VFS的重要性
VFS屏蔽了具体文件的实现细节,向上提供统一的操作接口。通过VFS可以实现任意的文件系统,这些文件系统通过文件访问系统调用都可以访问。在操作系统内核中,vfs是对离用户态最近的一层,因为它的存在,linux的使用才变得方便。实际上,正是vfs实现了树形的文件系统组织,然而vfs的作用还不止这些,设备的文件抽象也是通过vfs来实现的。
3、VFS举例
3.1、procfs
3.2、sysfs
3.3、cpusetfs
3.4、ntfs
3.5、extX
3.6、任意你想实现的。
需要做什么呢?只需要在一大堆switch函数例程中实现你的逻辑即可,就是说实现file_operations函数集合即可。注意,在linux中,文件和存储没有必然关系,实际上没有任何关系,也就是说linux中的文件有的不需要被存储,比如proc目录中的文件,只有在你read它的时候,数据才从内核出来,这个数据是内核逻辑提供的,而是可能实时变化,linux根本没有必要在另一个地方再存储它。
4、一个重要结论
由于linux的树形文件系统是完全抽象的,因此它不和任何介质进行绑定,仅存在于内核当中,内核只要起来,这个虚拟的树就存在了,只是此时只有树根,然而linux此时却可以挂载任意类型的文件系统到这个树根,这样就可以实现很方便的定制,linux可以在initrd中挂载任意文件系统到树根,这是因为内核和文件系统是分离的概念,内核启动并不依赖任何文件系统。

分享到:
评论

相关推荐

    linux文件系统设计

    为linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条); dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件...

    基于NandFlash的嵌入式Linux文件系统设计.pdf

    基于NandFlash的嵌入式Linux文件系统设计.pdf

    操作系统课程设计——Linux二级文件系统设计

    Linux二级文件系统设计 【开发语言及实现平台或实验环境】 C++/VC++ 【设计要求】 理解Linux的文件系统的组织;掌握常用的数据结构;系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件;...

    操作系统课程设计报告Linux二级文件系统设计.doc

    操作系统课程设计报告Linux二级文件系统设计.doc

    C语言模拟实现Linux文件系统

    C语言模拟实现Linux文件系统 1、在内存中开辟一块空间来模拟文件系统的运行,不读写硬盘。 2、面向单用户、单任务,不考虑并发,不考虑文件属主、组等概念。 3、程序开始后,初始化并接收用户输入。若输入”enter”...

    Linux二级文件系统设计

    (1)本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。 (2)结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。 (3)通过分...

    基于Linux的模拟文件系统管理的设计与实现

    基于Linux的模拟文件系统管理的设计与实现 在Linux环境中实现文件系统的功能

    Linux文件加密系统设计.pdf

    Linux文件加密系统设计.pdf

    为linux系统设计一个简单的二级文件系统

    为linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条); login 用户登陆 dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read...

    嵌入式Linux文件系统的设计和实现

    式操作系统中的重要性愈加明显% 论文首先结合具体实验平台的一个嵌入式Linux 操作系统"提出了一种嵌入式Linux文件系统的总体架构%之后"讨论了在这个嵌入式系统下文件系统的移植和实现方法%希望这些实践经验可以为...

    Linux文件系统构建

    包括源程序、主要功能模块、程序流程图、心得、程序调试等等,熟悉在Linux系统下构建文件系统,并利用教材中讲到的chmod命令来设置文件系统的访问权限;通过设置umask参数来设置文件及目录的权限;掌握文件系统的...

    基于Linux的模拟文件系统的设计与实现

    设计一个10个用户的文件系统。每个用户最多可以保存10个文件,一次运行用户可打开多个文件。 程序采用二级文件目录。(即设置主目录(MFD)和用户文件目录(UFD))。另外,可打开文件设置指针。 为了方便实现,对...

    操作系统课程设计 linux文件系统

    设计一个简单的多用户文件系统。即 ①在系统中用一个文件来模拟一个磁盘; ②此系统至少有:Create、delete、open、close、read、write等和部分文件属性的功能。 ③实现这个文件系统。 ④能实际演示这个文件系统。 ...

    LINUX操作系统文件系统设计实验代码

    为LINUX系统设计一个简单的二级文件系统,要求: (1)可以实现以下几条命令 login 用户登录 dir 列文件目录 ...... (2)列文件目录是要列出文件名,物理地址,保护码和文件长度。 (3)源文件可以进行读写保护。

    Linux文件系统实验报告.docx

    。。。

    模拟Linux文件系统的设计与实现.pdf

    模拟Linux文件系统的设计与实现.pdf

    嵌入式Linux文件系统及其存储机制分析

    构建适用于嵌入式系统的Linux文件系统,必然会涉及到两个关键点,一是文件系统类型的选择,它关系到文件系统的读写性能、尺寸大小;另一个就是根文件系统内容的选择,它关系到根文件系统所能提供的功能及尺寸大小。...

    Linux二级文件系统设计 C++

    系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件;使用文件来模拟外存,进行数据结构设计和操作算法的设计,实现一个文件系统并实现基本的文件操作

    基于C语言的Linux文件管理系统源码+详细代码注释(操作系统课程设计).zip

    【资源说明】 基于C语言的Linux文件管理系统源码+详细代码注释(操作...基于C语言的Linux文件管理系统源码+详细代码注释(操作系统课程设计).zip基于C语言的Linux文件管理系统源码+详细代码注释(操作系统课程设计).zip

    为LINUX 设计一个简单的二级文件系统。

    为LINUX 设计一个简单的二级文件系统。

Global site tag (gtag.js) - Google Analytics