回收硬盘 $MFT 文件中占用的大量空间

因为硬盘存储了大量小文件,造成 MFT 文件占用近 3 GiB 空间。一直想找到减少空间的方法,之前尝试过几次搜索都没有结果,今天再次搜索了一下,在这里记录一下。

关于 $MFT 主文件表

NTFS 文件系统的核心包含一个名为主文件表(MFT)的文件。对于 NTFS 上的每一个文件都会在 MFT 中记录至少一个条目,包括 MFT 文件本身。

The NTFS file system contains at its core, a file called the master file table (MFT). There is at least one entry in the MFT for every file on an NTFS volume, including the MFT itself.

当文件添加到NTFS卷时,MFT中会添加更多条目,因此MFT的大小会增加。从NTFS卷中删除文件时,它们的MFT条目被标记为空闲,可以重新使用,但 MFT 不会收缩。因此,这些条目使用的空间不会从磁盘中回收。

As files are added to an NTFS volume, more entries are added to the MFT and so the MFT increases in size. When files are deleted from an NTFS volume, their MFT entries are marked as free and may be reused, but the MFT does not shrink. Thus, space used by these entries is not reclaimed from the disk.

如果一个卷以前有很多被删除的文件,那么 MFT 可能太大。删除的文件会导致 MFT 出现内部空洞 (holes),这些洞是文件未使用的重要区域。要收回这个空间是不可能的。至少在现存的 NTFS 卷上是这样。

An MFT can be too large if a volume used to have lots of files that were deleted. The files that were deleted cause internal holes in the MFT. These holes are significant regions that are unused by files. It is impossible to reclaim this space. This is at least true on a live NTFS volume.

上面这段内容来自这篇官方文档,当中提到了一句 It is impossible to reclaim this space,意味着希望直接通过系统减少 $MFT 文件的空间是不可能的。

可选方案

目前有下面三种解决方案,但没有任何一种是比较优雅且适合我的,各位根据实际情况自行选择即可,这里不做推荐。

第三方工具

因为考虑到文件安全性,所以没有做过多的尝试,如果有需要相关工具可以参考下方参考链接中的内容,也许对你有帮助。但我已经尝试过系统的磁盘清理工具以及 CCleaner 的驱动器擦除程序是无效的,这两个可以直接排除。

优点:简单方便。
缺点:不易确定是否可靠,文件安全无法保证。

格式化磁盘

将磁盘格式化之后 $MFT 文件也会随之被重置。但如果需要保留硬盘中的文件,这需要准备另一块硬盘。

优点:文件较为安全,可以得到一定程度的保证。
缺点:需要较多时间、且需要额外准备一块硬盘有一定成本。

通过 VHDX 虚拟磁盘避免

可以在硬盘中创建一个 VHDX 虚拟磁盘文件,将大量小文件全部存储在这一块虚拟硬盘中,这样不论多少数量的文件对于主硬盘来说都是一个文件。

要注意的是这个方法是提前预防,对于已有的大 $MFT 文件是不能减少空间的。另外虚拟硬盘中的 $MFT 仍然会占用相同空间,但在迁移之后主硬盘的 $MFT 能够保持较小的空间无需格式化。

另外,硬盘独写必然产生虽然,一个大文件跨越磁盘的大量区域,碎片整理非常耗时。

优点:易迁移,不会影响到主硬盘导致 $MFT 增大。
缺点:性能有一定影响,大文件碎片不易整理。

总结

结合下方参考链接中的相关内容和讨论,总结如下:

  1. 在 Windows 中不可能直接(这里指不借助任何额外的工具或设备,通过常规的文件操作或系统功能)做到。
  2. 第三方工具有可能做到。
  3. 格式化磁盘可以做到。
  4. 提前通过 VHDX 避免 $MFT 增大。

虽然没能找到较好的办法,我的 $MFT 文件也没有回收,但也积累了一定的经验。另一方面在搜索过程中还是有不少收获的,比如 defrag 命令等。

额外收获

需要获取磁盘碎片等相关报告时,可以用到 defrag 命令。完整的说明见官方文档:defrag | Microsoft Docs

来自于这个问题,文中命令如下:

defrag c: /a /v report:

1
2
3
4
5
6
7
8
9
10
11
12
Analysis Report

Volume size = 76.30 GB
Cluster size = 4 KB
Used space = 17.57 GB
Free space = 58.73 GB

Master File Table (MFT) fragmentation
Total MFT size = 7.74 GB
MFT record count = 49,575
Percent MFT in use = 0
Total MFT fragments = 5

defrag d: /a /v report

1
2
3
4
5
6
7
8
9
10
11
12
13
Analysis Report

Volume size = 372 GB
Cluster size = 4 KB
Used space = 317 GB
Free space = 55.05 GB

Master File Table (MFT) fragmentation

Total MFT size = 3.10 GB
MFT record count = 3,247,737
Percent MFT in use = 99
Total MFT fragments = 3

例如我这次使用磁盘检查工具结果如下(因为系统语言是中文,该命令输出也是中文):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Post Defragmentation Report:

卷信息:
卷大小 = 3.63 TB
簇大小 = 4 KB
已用空间 = 3.63 TB
可用空间 = 1.18 GB

碎片:
总碎片空间 = 23%
每个文件的碎片平均个数 = 9.38

可移动文件和文件夹 = 3886
不可移动文件和文件夹 = 4

文件:
碎片文件 = 37
文件碎片总数 = 29639

文件夹:
文件夹总数 = 146
碎片文件夹 = 8
文件夹碎片总数 = 21

可用空间:
可用空间计数 = 84
可用空间的平均大小 = 14.35 MB
可用空间的最大大小 = 25.44 MB

主文件表(MFT):
MFT 大小 = 2.87 GB
MFT 记录计数 = 3020287
MFT 用法 = 100%
MFT 碎片总数 = 28

注意: 大于 64MB 的文件碎片不会计入碎片统计信息。

建议对该卷进行碎片整理。

相关链接