文件系统的初步了解
匿名2023/07/31 19:49:23提问
    lecture21student
342

上周课上,向勇老师让我们去了解ZFS等文件系统。我想到了一个问题:一个文件系统与另一个文件系统,主要区别在哪些方面呢?

为此我看了一些资料,整理如下。

1、文件系统之间的不同,主要体现在三个方面:

  • Limits
  • Features
  • Allocation and layout policies

2、Limits

Limits与metadata的有关,metadata某些字段的长度是固定的,从而对某些属性有限制。

文件系统与此有关的特点:

  • 文件名长度限制(filename length)。例如我们常见的文件系统一般限制为255字节。
  • 单个文件大小限制(file size)
  • 文件数限制(numbers of files)

3、Features

这部分主要是文件系统的功能特点,不同文件系统可能有其中的某些功能。这些功能不包括文件系统的分配管理。常见的特点简单介绍如下:

  1. Symbolic links, Hard links 软链接、硬链接
    • 你应该懂的
  2. filesystem-level encryption 文件系统级加密
    • 对用户透明
  3. case-sensitive, case-preserving 大小写敏感
    • 有两部分:文件名大小写敏感、文件名大小写保留。case-preserving是指文件名在系统中保存时,是否保留大小写;case-sensitive是指文件调用的时候,是否对文件名大小写敏感。
    • 文件名保留大小写,但仍然可以大小写不敏感,例如在mac(HFS+)下执行以下命令,Temp和temp都能访问,但如果已有Temp再创建temp,则报错已存在。
    • $ mkdir Temp
      $ file temp
      temp: directory
      $ mkdir temp
      mkdir: temp: File exists
  4. file change log 文件更改记录
    • 记录创建、链接、重命名等数据的改变。(不同于journal)
    • log记录的是某个文件的某些属性的改变
    • journal记录的是文件系统操作,关心事务的提交、完成
  5. block journaling, metadata-only journaling 日志
    • 拥有该特性的系统,一般被称为日志文件系统(journaling file system)
    • 有日志与没有日志有什么不同呢?有日志是为了解决文件系统恢复的问题。例如delete file操作,在unix系统下分为三步:
    • removing its directory entry
      releasing the inode to the pool of free inodes
      returning all used disk blocks to the pool of free disk blocks
    • 如果完成第一步后突然掉电,那么inode和disk blocks 就没有正常释放,造成存储泄漏。
    • 日志文件系统则会这么做:例如给一个文件追加一部分内容,步骤如下:
    • 1、拷贝所有内容块到文件系统某个位置
      2、再这些内容追加到该文件的末尾
    • 如果中间发生意外,如发生在步骤一,则操作未发生,可根据日志重新执行;如发生在步骤二,则根据日志从文件系统某处重新拷贝可恢复。缺点是拷贝2次。其它操作也是如此,通过日志的方式分步骤,确保操作安全、可恢复。
  6. copy-on-write file system COW
    • 基于日志文件系统,进一步优化,既可实现日志功能,又避免拷贝2次。
    • 例如修改一个block:正在使用的block不会覆盖,而是分配一个新的block,内容写到新的block中,然后修改metadata指向新的block。
    • ZFS的特点之一
  7. snapshot 快照
    • COW恰恰可以用作快照。旧的数据可以被保留,分配一个版本号。
  8. excute in place XIP
    • 直接在存储器上运行程序,而不用把程序拷贝到RAM。
    • 为什么要这么做呢?大概是跟BIOS、嵌入式有关吧~不太理解
  9. data deduplication 数据去重

4、Allocation and layout policies

文件系统为文件的data分配空间,用一些策略来提高性能或利用率。

  1. Tail packing 末尾合并
    • 按块分配的空间分配造成内部碎片(internal fragment),每个文件最后的用那个block有浪费。
    • Tail packing就是让若干文件的尾巴部分共享使用一个block。
  2. Transparent compression 透明压缩
    • 对用户透明。
    • 每次读写要解压和压缩消耗CPU,但减小了对外设的操作数据量,性能反而可以提高,因为外设的访问更费时
  3. Block suballocation 块的子划分
    • 也是用于解决最后那个block。
    • 对最后的block单独用更小单位划分,充分利用空间。
  4. Allocate-on-flush 延后分配
    • delayed allocation,flush时才allocate
    • 例如HFS+支持该功能,mac下(生成1G文件)
    • FILE *file = fopen("temp.txt","w");
      fseek(file,1024*1024*1024,SEEK_CUR);
      fputc('0',file);
      fclose(file);
    • 停在fclose好几秒,说明flush时才allocate。
  5. Extents
    • 用一定范围变动的簇大小,而不是唯一的簇大小。(不太懂)
  6. Variable file block size
    • 单文件可被分配不同大小的簇。
    • 区别于固定大小块的文件系统:例如簇为4KB、8KB的文件系统,可分配的簇是固定的。该特点是指可分配的簇大小可以变
  7. Sparse files 稀疏文件
    • 如前面生成1G文件的操作,中间有大片空白,支持稀疏的文件系统操作更快更省空间。
    • 缺点是可能造成更多文件碎片。

5、小结

对于一个文件系统,我们要看到一些数字,例如单文件最大长度、目录最大层级数,等等,这是我们容易注意到的。同时也要看到文件系统的特点,例如ZFS的日志、COW、快照等等,但特点可能会牺牲时间、空间,不一定越强大越好,简单的U盘可能FAT就够了。写程序的时候,可以根据文件系统的特点做优化。

课上向勇老师还提出,希望我们能进一步了解这些文件系统的某些细节。我们是否可以了解一下ZFS的zpools更具体的内容、这些文件系统的inode长什么样、这些文件系统的空间如何partition,等等。大家感兴趣可以进一步了解。

6、参考资料

主要就是把wiki上看到整理了一下。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa380375(v=vs.85).aspx

https://en.wikipedia.org/wiki/Design_of_the_FAT_file_system

https://en.wikipedia.org/wiki/Comparison_of_file_systems

https://en.wikipedia.org/wiki/Journaling_file_system

可能有理解不正确的地方,欢迎大家批评指正~

回答(2
    推荐问答
      Simple Empty
      暂无数据