linux文件系统

1、什么是文件系统
      Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。

     Linux 最早的文件系统是Minix,但是专门为Linux 设计的文件系统――扩展文件系统第二版或EXT2被设计出来并添加到Linux中,这对Linux产生了重大影响。EXT2文件系统功能强大、易扩充、性能上进行了全面优化,也是所有Linux发布和安装的标准文件系统类型。

    每个实际文件系统从操作系统和系统服务中分离出来,它们之间通过一个接口层:虚拟文件系统或VFS来通讯。VFS使得Linux可以支持多个不同的文件系统,每个表示一个VFS 的通用接口。由于软件将Linux 文件系统的所有细节进行了转换,所以Linux核心的其它部分及系统中运行的程序将看到统一的文件系统。Linux 的虚拟文件系统允许用户同时能透明地安装许多不同的文件系统。

   在Linux文件系统中,作为一种特殊类型/proc文件系统只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。/proc文件系统是一个伪文件系统,用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。


  在Linux中普通文件和目录文件保存在称为块物理设备的磁盘或者磁带上。一套Linux系统支持若干物理盘,每个物理盘可定义一个或者多个文件系统。(类比于微机磁盘分区)。每个文件系统由逻辑块的序列组成,一个逻辑盘空间一般划分为几个用途各不相同的部分,即引导块、超级块、inode区以及数据区等。
  引导块:在文件系统的开头,通常为一个扇区,其中存放引导程序,用于读入并启动操作系统;
  超级块:用于记录文件系统的管理信息。特定的文件系统定义了特定的超级块;
  inode区(索引节点)一个文件或目录占据一个索引节点。第一个索引节点是该文件系统的根节点。利用根节点,可以把一个文件系统挂在另一个文件系统的非叶节点上;
  数据区:用于存放文件数据或者管理数据

下面简单介绍一下EXT2、EXT3、EXT4


2、EXT2
    The Second Extended File System(ext2)文件系统Linux系统中的标准文件系统,是通过对Minix的文件系统进行扩展而得到的,其存取文件的性能极好。
   在ext2文件系统中,文件由inode(包含有文件的所有信息)进行唯一标识。一个文件可能对应多个文件名,只有在所有文件名都被删除后,该文件才会被删除此外,同一文件在磁盘中存放和被打开时所对应的inode是不同的,并由内核负责同步。

   ext2文件系统采用三级间接块来存储数据块指针并以块(block,默认为1KB)为单位分配空间。其磁盘分配策略是尽可能将逻辑相邻的文件分配到磁盘上物理相邻的块中,并尽可能将碎片分配给尽量少的文件,以从全局上提高性能。ext2文件系统将同一目录下的文件(包括目录)尽可能的放在同一个块组中,但目录则分布在各个块组中以实现负载均衡。在扩展文件时,会尽量一次性扩展8个连续块给文件(以预留空间的形式实现)。
ext2系统中,所有元数据结构的大小均基于“块”,而不是“扇区”。块的大小随文件系统的大小而有所不同。而一定数量的块又组成一个块组,每个块组的起始部分有多种多样的描述该块组各种属性的元数据结构ext2系统中对各个结构的定义都包含在原始码的include/linux/ext2_fs.h文件中。
(1)超级块
   每个ext2文件系统都必须包含一个超级块,其中存储了该文件系统的大量基本信息,包括块的大小、每块组中包含的块数等。同时,系统会对超级块进进行备份,备份被存放在块组的第一个块中。超级块的起始位置为其所在分区的第1024个字节,占用1KB的空间,
(2)块组描述符
   一个块组描述符用以描述一个块组的属性。块组描述符组由若干块组描述符组成,描述了文件系统中所有块组的属性,存放于超级块所在块的下一个块中。
(3)块位图inode位图
块位图和inode位图的每一位分别指出块组中对应的那个块或inode是否被使用。
(4)inode
inode表用于跟踪定位每个文件,包括位置、大小等(但不包括文件名),一个块组织只有一个inode表。
(5)数据块
  数据块中存放文件的内容,包括目录表、扩展属性、符号链接等。

一个目录结构

  在ext2文件系统中,目录是作为文件存储的。根目录总是在inode表的第二项,而其子目录则在根目录文件的内容中定义。
文件扩展属性
  文件的属性大多数是位于该文件的inode结构中的标准属性,也还包含其他一些扩展属性(于系统中所有的inode相关,通常用于增加额外的功能)

3、EXT3
  Ext3是一中日志式文件系统,是对ext2系统的扩展,它兼容ext2。日志式文件系统的优越性在于:由于文件系统都有快取层参与运作,如不使用时必须将文件系统卸下,以便将快取层的资料写回磁盘中。因此每当系统要关机时,必须将其所有的文件系统全部shutdown后才能进行关机。
  如果在文件系统尚未shutdown前就关机如(停电)时,下次重开机后会造成文件系统的资料不一致,故这时必须做文件系统的重整工作,将不一致与错误的地方修复。然而,此一重整的工作是相当耗时的,特别是容量大的文件系统,而且也不能百分之百保证所有的资料都不会流失。
  为了克服此问题,出现了日志式文件系统 。此类文件系统最大的特色是,它会将整个磁盘的写入动作完整记录在磁盘的某个区域上,以便有需要时可以回溯追踪。
  由于资料的写入动作包含许多的细节,像是改变文件标头资料、搜寻磁盘可写入空间、一个个写入资料区段等等,每一个细节进行到一半若被中断,就会造成文件系统的不一致,因而需要重整。
  然而,在日志式文件系统中,由于详细纪录了每个细节,故当在某个过程中被中断时,系统可以根据这些记录直接回溯并重整被中断的部分,而不必花时间去检查其他的部分,故重整的工作速度相当快,几乎不需要花时间。

Linux实现的ext3文件系统,包括3个级别的日志:
日记
(慢,但风险小)元数据和文件内容都在提交到主文件系统前写入。这样将提高稳定性但性能上有所损失,因为所有的数据都要写入2次。如果没有在/etc/fstab 中加上这个选项,修改中的档案遇上kernel panic 或突然断电的时候就可能发生损毁的情况。
顺序
(中速,中等风险)顺序和写回类似,但在对应的元数据标记为提交前,强制写入文件内容。这是很多Linux发行版默认的方式。
回写
(快,但风险最大;在某种感觉上和ext2相当): 这边会写入日志的只有 metadata 而已,档案的内容并不会跟著写入日志里面。这样的作法让整个效率变快了不少,不过也同样造成了档案写入时不按顺序的结果。举例来说,档案在附加变大的同时发生了 crash 的情况,就可能造成下次挂载时档案后面就附加一堆垃圾数据的情况。

ext3 的不足之处
(1)ext3的设计目标就是提供对于ext3的高度相容,很多磁盘上的结构和都和ext2很相似。也因为这样,ext3缺乏很多最新设计中的功能,如不能动态分配inode和可变块大小(frags或tails)。
(2) ext3文件系统在被挂载为写入的时候,是不能进行fsck(检查和维护不一致的文件系统)的。 ext3档案系统的倾倒作业在这个档案系统还是挂载中的时候执行可能会造成资料的损坏。
(3) ext3不支持在其他文件系统上已经支持(例如:ext4)的扩展
(4)在文件系统级别上,没有在线的ext3磁盘碎片整理工具
(5) 和ext2不同,ext3会在删除文件时把文件的节点(inode)中的块指标清除。这样做可以在unclean载入文件系统后,重放日志时,可以减少对文件系统的访问。但也同样也增加了文件在反删除上面的困难。用户唯一的补救是在硬盘中捞取数据,并且要知道文件的起始到结束的块指标。尽管提供了比 ext2在删除文件上稍微高一些的安全性,却也无可避免的带来了不便之处。
(6)Ext3不支持透明压缩Ext2以非官方补丁支持)。
(7)ext3有一个相对较小的对于单个文件和整个文件系统的最大尺寸。这些限制依赖于文件系统的块大小
(8)Ext3在写入日志时,并不做检验和。如果barrier=1没有作为加载参数(在文件/etc/fstab),并且如果硬件在无次序的写入缓存,在崩溃时会严重损坏文件系统(该选项在大多数流行的Linux发行版中都没有被启用,所以大多数发行版的处境都很危险。)

4、EXT4
  ext4文件系统(第四扩展文件系统)是linux系统下的日志文件系统,是ext3文件系统的后继版本。
  ext4原始的开发目标是一系列的向下兼容ext3、移除其64位限制与提升其性能的延伸包。然而,某些linux开发者因稳定性原因而拒绝将这些延伸包应用在ext3上,并要求其作为ext3的分支,改名为ext4并另行开发,以免影响到目前的ext3用户。

EXT4特点
(1)大型文件系统
 ext4文件系统可支持最高1E的分区与最大16T的文件。
(2)Extents
ext4引进了extent文件存储方式,以取代ext2/3使用的blocking map方式。Extent指的是一连串的连续实体block,这种方式可以增加大型文件的效率并减少分裂文件。ext4支持的单一Extent,在单一block为4KB的系统中最高可达128MB。单一inode中可存储4笔Extent;超过四笔的Extent会以Htree方式被索引。
(3)向下兼容
 ext4向下兼容于ext2和ext3,因此可以将ext3和ext2的文件系统挂载为ext4分区。由于某些ext4的新功能可以直接运用在ext3和ext2上,直接挂载即可提升少许性能。
 ext3文件系统可以部分向上兼容于ext4(也就是说ext4文件系统可以被挂载为ext3分区)。然而若是使用到Extent技术的ext4将无法被挂载为ext3。
(4)预留空间
 ext4允许对一文件预先保留磁盘空间。目前大多数文件系统做到这点的方式是直接产生一个填满0的文件;ext4和XFS可以使用Linux核心中的一个新的系统调用“fallocate()”取得足够的预留空间。
(5)延迟取得空间
 ext4使用一种称为allocate-on-flush方式,可以在数据将被写入磁盘(sync)前才开始取得空间;大多数文件系统会在之前便取得需要的空间。这种方式可以增加性能并减少文件分散程度。
(6)突破32000子目录限制
ext3的一个目录下最多只能有32000个子目录。ext4的子目录最高可达64000,使用“dir_nlink”功能后可以达到更高(虽然父目录的link count会停止增加)。为了避免性能受到大量目录的影响,ext4默认打开Htree(一种特殊的B树)索引功能。该功能已经实现于Linux核心2.6.23版。
(7)日志校验和
 Ext4使用校验和特性来提高文件系统可靠性,因为日志是磁盘上被读取最频繁的部分之一。这个特性还有一个好处就是可以安全地避免日志处理时磁盘I/O的等待,而稍微提高一些性能。
(8)在线磁盘整理
 对于在线磁盘整理工具有许多草案,但是这些草案都没有被包含在主流的内核当中。即使Ext4包含有许多避免磁盘碎片的技术,但是磁盘碎片还是难免会在一个长时间使用过的文件系统中中存在。Ext4将会有一个具有磁盘整理功能的工具。
(9)快速文件系统检查
 Ext4将未使用的区块标记在inode当中,这样可以使诸如e2fsck之类的工具在磁盘检查时将这些区块完全跳过,而节约大量的文件系统检查的时间。这个特性已经在2.6.24版本的linux内核中实现。


你可能感兴趣的:(linux,文件系统)