Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

文件怎样落到磁盘

复习

  • 查询、中断与 DMA:CPU 参与设备传输的程度怎样逐步降低
  • 文件与文件描述符:把设备和持久数据变成可读写的字节流
  • 目录与路径:用树形名字组织大量文件

TL;DR

  • 文件在磁盘上由两部分组成:数据块元数据
  • 数据块装真正的内容,元数据记录“这些块在哪、有多大”等
  • 记录元数据的结构,通常叫索引节点(inode)
  • 名字(目录)和文件本身,是分开记录的

正文

  在程序眼里,文件是一条连续的字节流。可在磁盘上,它其实被拆成一块一块存放。这一章,我们看看文件在磁盘里的真实模样。

一个文件的两半

  磁盘上的一个文件,可以看作两部分:

  • 数据块(data block):真正存内容的那些块。文件从逻辑上看是连续的一条流,落到磁盘却是分散的若干块。
  • 元数据(metadata):描述这个文件的信息——“它有哪些数据块、各在哪、文件多大、谁创建的、什么时候改的、谁能访问”。

  内容与“关于内容的信息”分开保存,这是文件系统的一贯做法。

索引节点

  这些元数据通常集中放在一个结构里,叫索引节点(inode,index node)。

  一个 inode 大致记录着:

  • 文件大小
  • 权限、所有者、时间戳
  • 数据块的位置(哪些块、在哪里)
  • 链接计数(有几个名字指向它)

  注意:inode 里没有文件名。文件名记录在目录里,目录项把“名字”指向“某个 inode”。于是:

目录项:名字 "notes.txt" ──> inode 42
inode 42:大小、权限、数据块位置……
数据块:真正的内容

  这解释了一个有趣的现象:同一个文件可以有多个名字(多个目录项指向同一个 inode),改名也只是改目录项,不动内容;而删除文件,本质上是“去掉一个名字、把链接计数减一”,计数归零才真正回收。

为什么这样设计

  把“名字”“元数据”“数据”三者分开,好处很多:

  • 定位快:先按名字找到目录项,再按 inode 找到数据块,层层直达
  • 共享方便:多个名字指向同一个 inode,天然支持硬链接
  • 管理灵活:权限、时间等信息集中在一处,便于检查和维护

  那么,inode 里记录的那些数据块,具体是怎么在磁盘上分配和查找的?空闲的块又怎么管理?下一章继续。

思考题

  inode 里为什么不直接存文件名?把文件名和文件内容分开记录,带来了哪些好处?

小结

知识点

  • 文件由数据块和元数据组成
  • 元数据集中存放在 inode 中
  • inode 不含文件名,文件名记在目录项里
  • 名字、元数据、数据三者分离,便于共享与管理

参考资料

  1. Wikipedia(zh):inode:索引节点
  2. Wikipedia(zh):文件系统:文件系统结构

思考题答案(仅供参考)

  因为文件名属于“目录”这一层,同一份内容可能有好几个名字(硬链接),如果把名字塞进 inode,一个文件就只能有一个名字了。把三者分开,好处是:共享更容易(多个名字指向同一 inode)、改名更轻量(只改目录项,不动内容)、权限与内容解耦(元数据集中管理)。一句话——内容只有一个,名字可以有多个,分开记录才互不牵扯。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪