4

ext2 目录条目以链表的形式保存。从1引用:

目录文件是目录条目结构的链表。每个结构都包含条目的名称、与该条目的数据关联的 inode 以及目录文件中到下一个条目的距离。

但它并没有说 inode 中有终止符。此外,没有任何字段可以告诉目录 inode 中有多少条目。

那么问题来了:当你读取 inode 数据结构时,你怎么知道它什么时候到达了链表的末尾呢?

示例:假设一个空的根目录“/”。所以命令ls应该打印出如下内容:

drwxr-xr-x 4 junji junji  4096 Mar 23 10:33 .
drwxr-xr-x 7 junji junji  4096 Mar 23 10:27 ..
drwxr-xr-x 7 junji junji  4096 Mar 23 10:27 lost+found

在实现的时候ls,你已经从磁盘中读取了根 inode 结构,然后按照i_blocks并尝试获取所有目录条目。在磁盘上,条目列表实际上存储如下:

{inode = 2, rec_len = 12, name_len = 1, name = .}
{inode = 2, rec_len = 12, name_len = 2, name = ..}
{inode = 12, rec_len = 1000, name_len = 6, name = lost+found}   
{inode = 12, rec_len = 12, name_len = 1, name = .}
{inode = 2, rec_len = 32, name_len = 2, name = ..}
...

第三个“lost+found”条目旁边还有另一个条目。

显然程序应该在“lost+found”条目处停止,因为下一个条目,即“.”。属于另一个目录。但是我们如何让我们的程序知道这一点呢?我们什么时候知道它是目录条目列表的结尾?

谢谢!

编辑:

inode 列表有点不一致。特别rec_len是 lost+found 条目是 1000 而不是 980。我更正了。

4

1 回答 1

2

我想到了。目录的所有条目都应该适合大小固定的数据块。对于 ext2,一个数据块是 1024。

在上面的示例中,根 inode 仅指向单个数据块(即 i_blocks 数组只有一个非零元素)。该数据块中的所有条目都属于根。除此之外,还有其他一些目录。

{inode = 2, rec_len = 12, name_len = 1, name = .}
{inode = 2, rec_len = 12, name_len = 2, name = ..}
{inode = 12, rec_len = 1000, name_len = 6, name = lost+found}
{inode = 12, rec_len = 12, name_len = 1, name = .}
{inode = 2, rec_len = 32, name_len = 2, name = ..}

如果把前3个条目的rec_len值全部加起来,12+12+1000=1024,那么已经是一个数据块大小了。这就是我一直在寻找的前哨信号。除此之外,它位于另一个目录的另一个数据块中。

于 2015-03-23T19:17:19.100 回答