【问题标题】:ext2 directory entry list: Where is the end?ext2目录条目列表:到底在哪里?
【发布时间】:2015-05-26 15:10:28
【问题描述】:

ext2 目录条目作为linked list 持久化。引用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 列表有点不一致。特别是,lost+found 条目的rec_len 是 1000 而不是 980。我更正了。

【问题讨论】:

  • Fromfs/ext2/dir.c : /* * ext2_delete_entry deletes a directory entry by merging it with the * previous entry. Page is up-to-date. Releases the page. */ 所以你应该使用 rec_len 作为偏移量来添加到新的目录条目(它的绝对偏移量是 1004,所以它可能是一个末梢哨兵条目。
  • 你是对的。 rec_len 是一个信号。我将在下面发布我的答案。谢谢乔普。
  • 那么如果rec_len = 1000,它加起来就是1024,这意味着下一个条目将在下一个磁盘页面上(如果有的话)
  • 您应该(至少)在此处发布您用来获取结果的代码。这些天水晶球很稀少......

标签: c linux file unix ext2


【解决方案1】:

我想通了。目录的所有条目都应该适合大小固定的数据块。对于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,那么已经是一个数据块大小了。这就是我一直在寻找的前哨信号。除此之外,它位于另一个目录的另一个数据块中。

【讨论】:

  • 这可能与链接中的注释有关“由于此值不能为负,因此当删除文件时,必须修改块中的上一条记录以指向块中的下一个有效记录或当没有其他目录条目存在时到块的末尾。'他们可能应该明确地说出来,而不是在注释中暗示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 2020-08-20
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2013-03-08
相关资源
最近更新 更多