learningOS开源操作系统社区
  • 首页
  • 训练营
  • 明星学员
  • 共建单位
  • 项目实习
  • 问答论坛
登录
    Copyright © 2024 opencamp.ai All rights reserved.
    文件系统的初步了解
    匿名2023/07/31 19:49:23提问
      lecture21student
    397

    上周课上,向勇老师让我们去了解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
        暂无数据