Linux如何知道文件数据在磁盘上的位置

Linux如何知道文件数据在磁盘上的位置

相关:什么是超级块、索引节点、目录项和文件?

没有一个著名的元数据结构保留实际文件的位置数据。 Dentry 将名称映射到 inode,而 inode 存储有关文件的信息——系统如何知道文件的实际数据位位于磁盘上的位置? inode 整数到磁盘位置是否有某种默认映射?

答案1

鉴于存在大量的文件系统,我确信存在例外,但传统上,inode 中有一个磁盘块编号数组。

例如,在 中/usr/include/linux/ext3_fs.h,我看到了 的定义struct ext3_inode

在里面struct ext3_inode,我看到一个成员i_block[EXT3_N_BLOCKS];/* Pointers to blocks */

不同的文件系统有不同的方式来跟踪哪些磁盘块属于索引节点(表示文件数据的磁盘数据结构)。有些具有块编号数组,有些具有运行或范围数组、计数加上连续块运行的起始块编号。 Berkeley FFS inode 有一个块号数组,还有一个块号数组,每个块都包含数据块号,并且一个块号包含块号,块号包含数据块号。

对于“日志结构化文件系统”来说,整个事情变得有点奇怪,但这些只是例外而不是规则。

答案2

如果您查看内核源代码(或内核文档包,或在网络上),请查看文档/文件系统,它会因文件系统而异。

例如,对于 ext2,可以使用超级块中存储的信息将 inode 号转换为分区中的某个偏移量(ext2 在 mkfs 时间分配固定数量的 inode 的原因之一),然后读取该偏移量。索引节点包含大量元数据,包括十二个指针,指示实际文件数据的存储位置。如果有超过十二个片段,则有一个指向间接块的指针(它存储更多)。间接块可以链接起来(每个间接块都有一个指向下一个间接块的指针)。

超级块存储在距分区开头的固定偏移处,因此很容易找到。 (mkfs 也会创建备份超级块)

您可能感兴趣btrfs 磁盘格式,它甚至还有图片,尽管该文档不如 ext2 文档完整。

相关内容