![文件系统设计:inode数量和表的必要性](https://linux22.com/image/10970/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%EF%BC%9Ainode%E6%95%B0%E9%87%8F%E5%92%8C%E8%A1%A8%E7%9A%84%E5%BF%85%E8%A6%81%E6%80%A7.png)
*nix 文件系统在磁盘的开头(或某个固定位置)维护一个 inode 表。它通过索引节点号进行索引,索引节点号是唯一标识索引节点的整数。知道了inode编号,就可以很快找到一个inode。索引节点包含指向其他磁盘块的指针/地址,其中包含文件的实际数据。
我想知道下面删除 inode 表和 inode 编号的方法是否有效:
我们仍然有索引节点,但是现在,索引节点存储在磁盘的数据区域中,我们不再跟踪索引节点编号,而是只记录索引节点的磁盘地址或块编号。每当我们尝试访问文件或其索引节点时,我们只是使用磁盘地址来查找索引节点,而不是使用索引节点号来索引索引节点表。这将使我们免于另一层间接。
我的方法中缺少什么?我想了解索引节点表背后的基本原理。
答案1
如果我理解正确的话,您想用块地址替换索引节点号。这意味着(1)每个块一个 inode,这会浪费大量空间(inode 没有那么大),(2)这与使用 inode 编号没有什么不同:inode 具有固定大小,因此一个块包含已知数量n
的 inode。因此,如果将 inode 编号除以n
(理想情况下是 2 的幂,因此只是移位),商就是 inode 的块编号(加上 inode 表开始的磁盘地址),余数就是该块内的索引节点的索引。
要理解 inode 表背后的基本原理,请考虑 inode 表中存储的数据:它是所有者、组、权限和时间戳等属性,以及数据块的索引和间接索引。您必须将它们存储在某个地方,并且不能将它们与文件数据存储在一起。
因此,如果你想设计自己的文件系统,你必须回答的第一个问题是“如何识别属于文件的数据块?”第二个问题是“我在哪里存储所有权、权限和时间戳等属性?”。是的,您可以使用与 inode 不同的方案。
编辑
至于
为什么不直接使用它的地址,就像我们使用主内存和其中的对象一样?
正如我所写,基本上你已经有了块地址 - 你只需要先除以,然后添加一个偏移量。如果原则上将偏移量添加到每个索引节点,“索引节点编号”将会大得多,并且在每个索引节点编号中重复的高位中将有一个恒定值。这反过来又会使每个目录条目变得更大。
不要忘记,unix 文件系统是在硬盘大小约为 20 MB 左右时发明的。您不想浪费空间,因此将所有东西都密集地包装起来,并避免冗余。每次访问索引节点时添加偏移量的成本都很低。将此偏移量存储为每个“inode 编号”引用的一部分是昂贵的。
有趣的是,尽管 inode 方案是为当今的小型硬盘发明的,但它的扩展性很好,甚至在 TB 级的硬盘上也“正常工作”。