每个文件一条记录,由不得你
$MFT 是一个隐藏的 NTFS 系统文件:一个为卷上每个文件和文件夹各留一条记录的数据库——每条记录通常 1 KB。记录保存着名称、时间戳、安全描述符和指向数据簇的指针;这条记录就是该文件在系统索引里的条目。你在资源管理器里看不到 $MFT,因为资源管理器正是靠读它来给你显示其他一切的。
小文件更进一步:大约 700 字节以下的任何内容都能整个塞进自己的记录里,完全不占数据簇。这很高效——直到卷上积累了数百万个碎文件、MFT 本身膨胀到以 GB 计。node_modules 目录树、浏览器配置文件缓存和邮件存储都是经典的 MFT 充气机。
MFT 区域:为增长预留的空间
NTFS 并不是哪里有空地就把 MFT 长到哪里;它保持一块连续的预留——MFT 区域(MFT Zone)——让表保持在同一整块里,元数据读取也保持快速。区域大小是一项策略设置,可用 fsutil behavior query mftzone 查看,而它的默认值会让人吃惊。这对你的可用空间意味着如下几点:
- 默认预留约为卷的八分之一——划出 12.5%,让 MFT 能无碎片地增长
- 该区域是策略而非分配:在资源管理器里不会显示为已用空间
- 当常规可用空间吃紧时,NTFS 会把区域的一部分释放给普通文件
- $MFT 文件本身是不属于任何可见文件的真实已用空间——拥有数百万文件的卷可能背着好几个 GB 的它
- 调大区域(把 fsutil behavior set mftzone 设为 2–4)只影响未来的增长,且只对注定要装海量小文件的卷有意义
MFT 膨胀在重新格式化之前是永久的
删除文件会释放记录供再利用,但绝不会收缩 $MFT——表会永远停留在它的最高水位。一块曾经托管过数百万临时文件的磁盘,即使彻底清理之后仍带着肥大的 MFT,只有重新格式化能复位。想看看损伤,跑一次详细输出的 chkdsk 就能打印 MFT 大小、记录数及其碎片化程度。
在 HDD 上,碎片化的 MFT 确实拖慢元数据密集的操作——打开巨型文件夹、搜索、杀毒扫描——这正是“优化驱动器”计划任务存在的原因。在 SSD 上寻道惩罚消失了,MFT 的位置几乎无关紧要;Windows 会把同一工具切换成 TRIM 通道。对付 MFT 膨胀的实用办法是预防:把产生数百万碎文件的项目放在专用卷上——或者至少放在一个可以毫不心疼地格式化的卷上。
常见问题与解答
我硬盘上的 $MFT 文件是什么?
它是 NTFS 的主数据库:每个文件一条记录,含名称、时间戳和数据位置。它随文件数量而非文件大小增长,并且算作已用空间,却不属于任何你能打开的文件夹。
我能删掉 $MFT 文件来腾空间吗?
不能。它是卷上所有文件的索引;删除或损坏它会让数据无法读取。Windows 把它藏起来,正是因为无利可图、全盘皆输。
继续阅读
联系我们: [email protected]