2020年5月9日 下午10:30
linux中inode结构设计
- inode版本1:

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

- Extend本质是一个指针(不是真正的保存数据),只不过他能指向128M的内存连续内存空间,而不是仅仅一个4k的Block
- 实例:
Linux下对硬盘的划分设计方法:
- 版本1:组块 Block Group

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

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

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

- 硬链接与原始文件共用一个 inode 的,但是 inode 是不跨文件系统的,每个文件系统都有自己的 inode 列表,因而硬链接是没有办法跨文件系统的。
- 而软链接不同,软链接相当于重新创建了一个文件。这个文件也有独立的 inode,只不过打开这个文件看里面内容的时候,内容指向另外的一个文件。这就很灵活了。我们可以跨文件系统,甚至目标文件被删除了,链接文件还是在的,只不过指向的文件找不到了而已。
- Linux软连接和硬链接 - iTech - 博客园
- 删除符号连接f3,对f1,f2无影响;
- 删除硬连接f2,对f1,f3也无影响;
- 删除原文件f1,对硬连接f2没有影响,导致符号连接f3失效;
- 同时删除原文件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 和数据块在文件系统上的关联关系
- 为了表示图中上半部分的那个简单的树形结构,在文件系统上的布局就像图的下半部分一样。无论是文件夹还是文件,都有一个 inode。
- inode 里面会指向数据块,对于文件夹的数据块,里面是一个表,是下一层的文件名和 inode 的对应关系,文件的数据块里面存放的才是真正的数据。
