【问题标题】:data pointers in inode data structureinode 数据结构中的数据指针
【发布时间】:2012-12-07 15:45:19
【问题描述】:

我在 linux 内核代码中查看了 inode 的代码,但我无法弄清楚 inode 中的数据指针在哪里。我知道有 15 个指针 [0-14],其中 12 个是直接的,1 个是单间接的,1 个是双间接的,1 个是三重间接的。

谁能找到这些数据成员。另外请说明你是如何找到这些的,因为我在谷歌上搜索了很多次不同的关键词,但都是徒劳的。

【问题讨论】:

  • “有 15 个指针 [0-14],其中 12 个是直接的,1 个是单间接的,1 个是双间接的,1 个是三间接的”这对于 ext2/3/4 是正确的,但对于 inode 不是一般
  • 好的。我不知道,但我特别担心 ext4。
  • 在 linux 内核源代码中查看 fs/ext4/ext4.h 以获取 struct ext4_inode。 “数据指针”是块号(前 12 个是直接块号,第 13 个是块的编号,其中填充了从 12 到 (blocksize/sizeof(__le32) + 12) 的另一个块索引 - 这称为“单间接',第 14 位是保存数据块地址的块地址的块的编号 - 双重间接,第 15 位 - 用于三重间接)
  • @EarlGray:这看起来像是一个答案。
  • @EarlGray:请将其写成答案,以便我接受。

标签: linux linux-kernel kernel


【解决方案1】:

访问其数据取决于特定的文件系统,因此通常没有“数据指针”(某些文件系统可能是虚拟的,这意味着动态生成数据或从网络检索数据)。

如果您对ext4 感兴趣,可以在fs/ext4/ext4.h 中查找特定于ext4 的inode 结构(struct ext4_inode),其中一个inode 的数据确实由12 个直接块的索引引用,其中1 个单间接,双间接 1 和三间接 1。

这意味着 inode 数据的块 [0..11] 的编号为 e4inode->i_block[0/1/.../11],而 e4inode->i_block[12] 是由数据块编号本身填充的块的编号(因此它保存 inode 数据块的索引在 [12, 12 + fs->block_size / sizeof(__le32)] 范围内。同样的技巧适用于 i_block[13],只是它拥有双间接索引(填充有块索引的块,这些块的列表包含实际的块列表data) 从索引12 + fs->block_size / sizeof(__le32) 开始,i_block[14] 保存三重间接索引。

【讨论】:

    【解决方案2】:

    如下所述:

    http://computer-forensics.sans.org/blog/2010/12/20/digital-forensics-understanding-ext4-part-1-extents

    Ext4 使用范围而不是块指针来跟踪文件内容。

    如果您对使用内容指针的 ext3/ext2 数据结构感兴趣:

    http://www.slashroot.in/how-does-file-deletion-work-linux

    有很多很好的图表来阐述它。在这里:

    http://mcgrewsecurity.com/training/extx.pdf

    第 16 页有“块指针”的详细示例(基本上是块号,或相对于磁盘映像开始的偏移值,1 个块通常为 512 字节)。

    如果您想以物理方式遍历文件系统,例如使用 ext3 格式的硬盘,请参阅:

    http://wiki.sleuthkit.org/index.php?title=FS_Analysis

    但是你总是可以只使用“dd”命令来做任何事情,只需要知道从哪里开始读取和停止读取,并且 dd 命令的输入通常是硬盘映像本身的副本,原因有很多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多