文件怎样落到磁盘
复习
- 查询、中断与 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 不含文件名,文件名记在目录项里
- 名字、元数据、数据三者分离,便于共享与管理
参考资料
- Wikipedia(zh):inode:索引节点
- Wikipedia(zh):文件系统:文件系统结构
思考题答案(仅供参考)
因为文件名属于“目录”这一层,同一份内容可能有好几个名字(硬链接),如果把名字塞进 inode,一个文件就只能有一个名字了。把三者分开,好处是:共享更容易(多个名字指向同一 inode)、改名更轻量(只改目录项,不动内容)、权限与内容解耦(元数据集中管理)。一句话——内容只有一个,名字可以有多个,分开记录才互不牵扯。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪