下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

Linux文件系统的实现

作者:课课家教育     来源: http://www.kokojia.com点击数:704发布时间: 2017-05-20 10:03:06

标签: 数据库LinuxLinux文件系统

  Linux文件管理从用户的层面介绍了Linux管理文件的方式。Linux有一个树状结构来组织文件。树的顶端为根目录(/),节点为目录,而末端的叶子为包含数据的文件。当我们给出一个文件的完整路径时,我们从根目录出发,经过沿途各个目录,最终到达文件。

  我们可以对文件进行许多操作,比如打开和读写。在Linux文件管理相关命令中,我们看到许多对文件进行操作的命令。它们大都基于对文件的打开和读写操作。比如cat可以打开文件,读取数据,最后在终端显示:

  $cattest.txt

  对于Linux下的程序员来说,了解文件系统的底层组织方式,是深入进行系统编程所必备的。即使是普通的Linux用户,也可以根据相关的内容,设计出更好的系统维护方案。

  存储设备分区

  文件系统的最终目的是把大量数据有组织的放入持久性(persistant)的存储设备中,比如硬盘和磁盘。这些存储设备与内存不同。它们的存储能力具有持久性,不会因为断电而消失;存储量大,但读取速度慢。

  观察常见存储设备。最开始的区域是MBR,用于Linux开机启动(参考Linux开机启动)。剩余的空间可能分成数个分区(partition)。每个分区有一个相关的分区表(Partitiontable),记录分区的相关信息。这个分区表是储存在分区之外的。分区表说明了对应分区的起始位置和分区的大小。

  我们在Windows系统常常看到C分区、D分区等。Linux系统下也可以有多个分区,但都被挂载在同一个文件系统树上。

  数据被存入到某个分区中。一个典型的Linux分区(partition)包含有下面各个部分:

 我们在Windows系统常常看到C分区、D分区等。Linux系统下也可以有多个分区,但都被挂载在同一个文件系统树上。    数据被存入到某个分区中。一个典型的Linux分区(partition)包含有下面各个部分:

  分区的第一个部分是启动区(Bootblock),它主要是为计算机开机服务的。Linux开机启动后,会首先载入MBR,随后MBR从某个硬盘的启动区加载程序。该程序负责进一步的操作系统的加载和启动。为了方便管理,即使某个分区中没有安装操作系统,Linux也会在该分区预留启动区。

  启动区之后的是超级区(Superblock)。它存储有文件系统的相关信息,包括文件系统的类型,inode的数目,数据块的数目。

  随后是多个inodes,它们是实现文件存储的关键。在Linux系统中,一个文件可以分成几个数据块存储,就好像是分散在各地的龙珠一样。为了顺利的收集齐龙珠,我们需要一个“雷达”的指引:该文件对应的inode。每个文件对应一个inode。这个inode中包含多个指针,指向属于该文件各个数据块。当操作系统需要读取文件时,只需要对应inode的"地图",收集起分散的数据块,就可以收获我们的文件了。

 启动区之后的是超级区(Superblock)。它存储有文件系统的相关信息,包括文件系统的类型,inode的数目,数据块的数目。    随后是多个inodes,它们是实现文件存储的关键。在Linux系统中,一个文件可以分成几个数据块存储,就好像是分散在各地的龙珠一样。为了顺利的收集齐龙珠,我们需要一个“雷达”的指引:该文件对应的inode。每个文件对应一个inode。这个inode中包含多个指针,指向属于该文件各个数据块。当操作系统需要读取文件时,只需要对应inode的"地图",收集起分散的数据块,就可以收获我们的文件了。

  最后一部分,就是真正储存数据的数据块们(datablocks)了。

  inode简介

  上面我们看到了存储设备的宏观结构。我们要深入到分区的结构,特别是文件在分区中的存储方式。

  文件是文件系统对数据的分割单元。文件系统用目录来组织文件,赋予文件以上下分级的结构。在硬盘上实现这一分级结构的关键,是使用inode来虚拟普通文件和目录文件对象。

  在Linux文件管理中,我们知道,一个文件除了自身的数据之外,还有一个附属信息,即文件的元数据(metadata)。这个元数据用于记录文件的许多信息,比如文件大小,拥有人,所属的组,修改日期等等。元数据并不包含在文件的数据中,而是由操作系统维护的。事实上,这个所谓的元数据就包含在inode中。我们可以用$ls-lfilename来查看这些元数据。正如我们上面看到的,inode所占据的区域与数据块的区域不同。每个inode有一个唯一的整数编号(inodenumber)表示。

  在保存元数据,inode是“文件”从抽象到具体的关键。正如上一节中提到的,inode储存由一些指针,这些指针指向存储设备中的一些数据块,文件的内容就储存在这些数据块中。当Linux想要打开一个文件时,只需要找到文件对应的inode,然后沿着指针,将所有的数据块收集起来,就可以在内存中组成一个文件的数据了。

 在保存元数据,inode是“文件”从抽象到具体的关键。正如上一节中提到的,inode储存由一些指针,这些指针指向存储设备中的一些数据块,文件的内容就储存在这些数据块中。当Linux想要打开一个文件时,只需要找到文件对应的inode,然后沿着指针,将所有的数据块收集起来,就可以在内存中组成一个文件的数据了。

  数据块在1,32,0,...

  inode并不是组织文件的唯一方式。最简单的组织文件的方法,是把文件依次顺序的放入存储设备,DVD就采取了类似的方式。但如果有删除操作,删除造成的空余空间夹杂在正常文件之间,很难利用和管理。

  复杂的方式可以使用链表,每个数据块都有一个指针,指向属于同一文件的下一个数据块。这样的好处是可以利用零散的空余空间,坏处是对文件的操作必须按照线性方式进行。如果想随机存取,那么必须遍历链表,直到目标位置。由于这一遍历不是在内存进行,所以速度很慢。

  FAT系统是将上面链表的指针取出,放入到内存的一个数组中。这样,FAT可以根据内存的索引,迅速的找到一个文件。这样做的主要问题是,索引数组的大小与数据块的总数相同。因此,存储设备很大的话,这个索引数组会比较大。

  inode既可以充分利用空间,在内存占据空间不与存储设备相关,解决了上面的问题。但inode也有自己的问题。每个inode能够存储的数据块指针总数是固定的。如果一个文件需要的数据块超过这一总数,inode需要额外的空间来存储多出来的指针。

  inode示例

  在Linux中,我们通过解析路径,根据沿途的目录文件来找到某个文件。目录中的条目除了所包含的文件名,还有对应的inode编号。当我们输入$cat/var/test.txt时,Linux将在根目录文件中找到var这个目录文件的inode编号,然后根据inode合成var的数据。随后,根据var中的记录,找到text.txt的inode编号,沿着inode中的指针,收集数据块,合成text.txt的数据。整个过程中,我们参考了三个inode:根目录文件,var目录文件,text.txt文件的inodes。

  在Linux下,可以使用$statfilename,来查询某个文件对应的inode编号。

在Linux中,我们通过解析路径,根据沿途的目录文件来找到某个文件。目录中的条目除了所包含的文件名,还有对应的inode编号。当我们输入$cat/var/test.txt时,Linux将在根目录文件中找到var这个目录文件的inode编号,然后根据inode合成var的数据。随后,根据var中的记录,找到text.txt的inode编号,沿着inode中的指针,收集数据块,合成text.txt的数据。整个过程中,我们参考了三个inode:根目录文件,var目录文件,text.txt文件的inodes。    在Linux下,可以使用$statfilename,来查询某个文件对应的inode编号。

  在存储设备中实际上存储为:

  在存储设备中实际上存储为:

  当我们读取一个文件时,实际上是在目录中找到了这个文件的inode编号,然后根据inode的指针,把数据块组合起来,放入内存供进一步的处理。当我们写入一个文件时,是分配一个空白inode给该文件,将其inode编号记入该文件所属的目录,然后选取空白的数据块,让inode的指针指像这些数据块,并放入内存中的数据。

  文件共享

  在Linux的进程中,当我们打开一个文件时,返回的是一个文件描述符。这个文件描述符是一个数组的下标,对应数组元素为一个指针。有趣的是,这个指针并没有直接指向文件的inode,而是指向了一个文件表格,再通过该表格,指向加载到内存中的目标文件的inode。如下图,一个进程打开了两个文件。

 文件共享    在Linux的进程中,当我们打开一个文件时,返回的是一个文件描述符。这个文件描述符是一个数组的下标,对应数组元素为一个指针。有趣的是,这个指针并没有直接指向文件的inode,而是指向了一个文件表格,再通过该表格,指向加载到内存中的目标文件的inode。如下图,一个进程打开了两个文件。

  可以看到,每个文件表格中记录了文件打开的状态(statusflags),比如只读,写入等,还记录了每个文件的当前读写位置(offset)。当有两个进程打开同一个文件时,可以有两个文件表格,每个文件表格对应的打开状态和当前位置不同,从而支持一些文件共享的操作,比如同时读取。

  要注意的是进程fork之后的情况,子进程将只复制文件描述符的数组,而和父进程共享内核维护的文件表格和inode。此时要特别小心程序的编写。

  看完Linux文件系统的实现原理,下面我们来看哪个文件系统最适合你的Linux系统~

  Linux上有许多可用的文件系统。每个文件系统都有其特定的用途,以便于特定用户解决不同的问题。本文的焦点集中在Linux平台上文件系统的主流选择。毫无疑问,其它的场景下还有一些别的选择。

 看完Linux文件系统的实现原理,下面我们来看哪个文件系统最适合你的Linux系统~    Linux上有许多可用的文件系统。每个文件系统都有其特定的用途,以便于特定用户解决不同的问题。本文的焦点集中在Linux平台上文件系统的主流选择。毫无疑问,其它的场景下还有一些别的选择。

  文件系统:它们不是世界上最激动人心的技术,但是仍然很重要。本文我们将细数那些流行的Linux文件系统-它们是什么,它们能够做什么,以及它们的目标用户。

  1.Ext4

   如果你曾经安装过Linux,你可能在安装过程中看到过“Ext4”字样。用它有一个不错的理由:它是当前每个可用的Linux发行版所选择的文件系统。当然,还有其他的一些选择,但是不可否认的是,Ext4(Extended4)几乎是所有Linux用户都会选择的文件系统。

  如果你曾经安装过Linux,你可能在安装过程中看到过“Ext4”字样。用它有一个不错的理由:它是当前每个可用的Linux发行版所选择的文件系统。当然,还有其他的一些选择,但是不可否认的是,Ext4(Extended4)几乎是所有Linux用户都会选择的文件系统。

  它能做什么?

  Ext4拥有之前的文件系统(Ext2/Ext3)中你所期待的所有优点,同时还带来了一些改进。还有很多内容可以发掘,这里列举出了Ext4为你带来的最好的部分:

  ◆日志型文件系统

  ◆日志校验

  ◆多重块文件分配

  ◆向后兼容Ext2&&Ext3

  ◆持续的空闲空间预分配

  ◆改进的文件系统校验(相比于之前的版本)

  ◆当然,同时支持更大的文件

  目标用户

  Ext4针对那些寻找超级可靠的基础环境或者那些只需要能工作就行的用户。这个文件系统不会对你的系统做快照;它甚至没有最好的SSD支持,但是如果你不是太挑剔的话,你会觉得它也还不错。

  2.BtrFS

  B树(B-tree)文件系统(也被当做是butterFS,黄油文件系统)是oracle为Linux研发的一款文件系统。它是一个全新的文件系统,而且正处于主要开发阶段。Linux社区认为其有时候使用上还有些不稳定。BtrFS的核心原则是围绕着写时复制(copy-on-write)原则展开的。写时复制基本上意味着在写入数据完成前,这份数据的每一比特都有单独的一份副本。当数据写入完毕后,相当于它做了一份副本。

  B树(B-tree)文件系统(也被当做是butterFS,黄油文件系统)是Oracle为Linux研发的一款文件系统。它是一个全新的文件系统,而且正处于主要开发阶段。Linux社区认为其有时候使用上还有些不稳定。BtrFS的核心原则是围绕着写时复制(copy-on-write)原则展开的。写时复制基本上意味着在写入数据完成前,这份数据的每一比特都有单独的一份副本。当数据写入完毕后,相当于它做了一份副本。

  它能做什么

  除了支持写时复制之外,BtrFS也能够胜任许多其他的事务-事实上,它可以不断列出各种特性。这里列举最值得一提的特性:支持只读快照、文件克隆、子卷、透明压缩、离线文件系统校验、从ext3&4原地转换到BtrFS、在线碎片整理,还支持RAID0,RAID1,RAID5,RAID6和RAID10。

  目标用户

  BtrFS的开发者们许诺过,该文件系统是当前其他文件系统的新一代替代者。非常正确,虽然目前其处于开发中。它有很多面向高级用户的杀手级特性,对于基本用户也是这样(包括SSD上面的更佳性能)。这个文件系统针对那些想要从文件系统中获取更多(特性),以及那些想尝试用写时复制机制做一些事情的用户。

  3.XFS

  由SiliconGraphics公司创造开发,XFS是一个高端文件系统,定位于速度和性能方面。处于对性能方面的专注,使得在并行IO方面,XFS表现的尤其出色。XFS文件系统能够处理数量庞大的数据,事实上某些XFS用户的数据接近300TB以上。

  由SiliconGraphics公司创造开发,XFS是一个高端文件系统,定位于速度和性能方面。处于对性能方面的专注,使得在并行IO方面,XFS表现的尤其出色。XFS文件系统能够处理数量庞大的数据,事实上某些XFS用户的数据接近300TB以上。

  它能做什么

  XFS是一个经历良好测试的数据存储文件系统,它是为了高性能操作而诞生的。其特性包括:

  ◆RAID阵列的条带化分配

  ◆日志型文件系统

  ◆块大小可变

  ◆直接I/O

  ◆指定速率(guaranteed-rate)I/O

  ◆快照

  ◆在线碎片整理

  ◆在线调整文件系统大小

  目标用户

  XFS针对那些想要一个坚如磐石的文件系统方案的用户。它始于1993年,并且随着时间的变迁它变得越来越好。如果你有一台家庭服务器,而且你苦恼于如何部署存储环境,那么可以考虑下XFS。它拥有的众多特性(比如快照)能够有助于你的文件存储系统。尽管如此,它不局限于服务器端。如果你是一个相对高级一点的用户或者你对BtrFS所承诺的很多特性感兴趣的话,尝试一下XFS。它实现了很多与BtrFS相似的特性,并且没有稳定性方面的问题。

  4.Reiser4

  Reiser4是ReiserFS的继任者,由Namesys公司创造研发。它的诞生可以追溯到Linspire项目和DARPA。它与众不同的地方在于众多的事务模式。并不止于单一的一种写入数据的方式;取而代之的是,有很多方式(来写入)。

  Reiser4是ReiserFS的继任者,由Namesys公司创造研发。它的诞生可以追溯到Linspire项目和DARPA。它与众不同的地方在于众多的事务模式。并不止于单一的一种写入数据的方式;取而代之的是,有很多方式(来写入)。

  它能做什么

  Reiser4拥有着使用多种不同事务模式的独特能力。它能够使用写时复制模式(像BtrFS),任意位置写入(write-anywhere),日志,以及混合事务模式。它在ReiserFS的基础上做了许多的改进,包括更好的基于漫游日志的文件系统日志,对较小文件的支持更好,以及更快速的目录处理。Reiser4提供了许多功能特性。还有更多的特性可以探讨,不过简单来讲,相比于ReiserFS它不但做了非常大的改进,而且增加了众多特性。

  目标用户

  Resier4适合那些想要将一个文件系统应用到多种场景下的用户。可能你想在一台机器上使用写时复制机制,在另一台机器上使用任意位置写入机制,还会在另一台机器上使用混合事务,而你又不希望使用多种不同类型的文件系统来完成这项任务。Reiser4是适合这种情况的完美方案。

  小编结语:

  更多内容尽在课课家教育!

  

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程