0%

linux文件系统-硬盘文件系统设计

2020年5月9日 下午10:30

linux中inode结构设计

  1. inode版本1:
  2. inode版本2:Extents
    1. 实例:
      1. 除了根节点,其他的节点都保存在一个块 4k 里面,4k 扣除 ext4_extent_header 的 12 个 byte,剩下的能够放 340 项,每个 extent 最大能表示 128MB 的数据,340 个 extent 会使你表示的文件达到 42.5GB。
    2. 注意:
      1. Extend本质是一个指针(不是真正的保存数据),只不过他能指向128M的内存连续内存空间,而不是仅仅一个4k的Block

Linux下对硬盘的划分设计方法:

  1. 版本1:组块 Block Group
    1. 理解超级块和块描述符的定义是关键:
      1. 超级块和块组描述符表都是全局信息,也就是整个硬盘的信息,而且这些数据很重要。如果这些数据丢失了,整个文件系统都打不开了,这比一个文件的一个块损坏更严重。所以,这两部分我们都需要备份,但是采取不同的策略。
      2. 块组描述符表我以前错误的理解为描述一个文件用多个块组的信息,没想到描述的是所有文件各自使用多个块组的信息,也就是整个硬盘的信息,这样就非常大了!
    2. 文件大小的计算:
      1. 一个数据块的位图可以表示的最大数据是128M
        1. 数据块的位图是放在一个块里面的,共 4k。每位表示一个数据块,共可以表示 4 * 1024 * 8 = 2^{15} 个数据块。如果每个数据块也是按默认的 4K,最大可以表示空间为 2^{15} * 4 * 1024 = 2^{27} 个 byte,也就是 128M。
      2. 块组描述符的引出,是用来表示大于128M文件的基础:
        1. 如果采用“一个块的位图 + 一系列的块”,外加“一个块的 inode 的位图 + 一系列的 inode 的结构”,最多能够表示 128M。是不是太小了?现在很多文件都比这个大。我们先把这个结构称为一个块组。有 N 多的块组,就能够表示 N 大的文件。
    3. 需要改进的原因:
      1. 对于超级块来讲,由于超级块不是很大,所以就算我们备份多了也没有太多问题。
      2. 但是,对于块组描述符表来讲,如果每个块组里面都保存一份完整的块组描述符表,一方面很浪费空间;另一个方面,由于一个块组最大 128M,而块组描述符表里面有多少项,这就限制了有多少个块组,128M * 块组的总数目是整个文件系统的大小,就被限制住了。
  2. 版本2:Meta Block Group
    1. 核心思想:化零为整(多个Block - > 一个Meta Block Group)
    2. 一个元块组包含 64 个块组,这样一个元块组中的块组描述符表最多 64 项
    3. 根据图中,每一个元块组包含 64 个块组,块组描述符表也是 64 项,备份三份,在元块组的第一个,第二个和最后一个块组的开始处。

文件和文件夹在Inode的设计方法(包含利用哈利进行加速的版本)

  1. 改进的地方:
    1. 如果我们要查找一个目录下面的文件名,可以通过名称取哈希。如果哈希能够匹配上,就说明这个文件的信息在相应的块里面。然后打开这个块,如果里面不再是索引,而是索引树的叶子节点的话,那里面还是 ext4_dir_entry_2 的列表,我们只要一项一项找文件名就行。
    2. 通过索引树,我们可以将一个目录下面的 N 多的文件分散到很多的块里面,可以很快地进行查找。

Inode进行软连接和硬链接的设计

  1. 硬链接与原始文件共用一个 inode 的,但是 inode 是不跨文件系统的,每个文件系统都有自己的 inode 列表,因而硬链接是没有办法跨文件系统的。
  2. 而软链接不同,软链接相当于重新创建了一个文件。这个文件也有独立的 inode,只不过打开这个文件看里面内容的时候,内容指向另外的一个文件。这就很灵活了。我们可以跨文件系统,甚至目标文件被删除了,链接文件还是在的,只不过指向的文件找不到了而已。
  3. Linux软连接和硬链接 - iTech - 博客园
    1. 删除符号连接f3,对f1,f2无影响;
    2. 删除硬连接f2,对f1,f3也无影响;
    3. 删除原文件f1,对硬连接f2没有影响,导致符号连接f3失效;
    4. 同时删除原文件f1,硬连接f2,整个文件会真正的被删除。
      1
      2
      3
      4
      5
      6
      7
      8
      [oracle@Linux]$ touch f1          #创建一个测试文件f1
      [oracle@Linux]$ ln f1 f2 #创建f1的一个硬连接文件f2
      [oracle@Linux]$ ln -s f1 f3 #创建f1的一个符号连接文件f3
      [oracle@Linux]$ ls -li # -i参数显示文件的inode节点信息
      total 0
      9797648 -rw-r--r-- 2 oracle oinstall 0 Apr 21 08:11 f1
      9797648 -rw-r--r-- 2 oracle oinstall 0 Apr 21 08:11 f2
      9797649 lrwxrwxrwx 1 oracle oinstall 2 Apr 21 08:11 f3 -> f1

总结一下 inode 和数据块在文件系统上的关联关系

  1. 为了表示图中上半部分的那个简单的树形结构,在文件系统上的布局就像图的下半部分一样。无论是文件夹还是文件,都有一个 inode。
  2. inode 里面会指向数据块,对于文件夹的数据块,里面是一个表,是下一层的文件名和 inode 的对应关系,文件的数据块里面存放的才是真正的数据。