为什么 NTFS 将文件存储在连续但独立的片段中?

为什么 NTFS 将文件存储在连续但独立的片段中?

我从文件的 contig 中获得了看似矛盾的信息:

>contig -nobanner -a -v "C:\Users\bruno\Downloads\pp.big"
------------------------
Processing C:\Users\bruno\Downloads\pp.big:
Scanning file...
[Cluster] Runlength
  [0] 31272
  [31272] 20376
  [51648] 20652
  [72300] 19452
  [91752] 21269
  [113021] 20674
  [133695] 22565
  [156260] 6409
  [162669] 23291
  [185960] 230176
  [416136] 320942
File size: 3019070010 bytes
C:\Users\bruno\Downloads\pp.big is in 4 fragments
------------------------
Summary:
     Number of files processed:      1
     Number unsuccessfully procesed: 0

它列出了 11 个片段,但随后它说只有 4 个片段/范围。fsutil file queryextents 确认前 8 个范围是连续的:

VCN: 0x0        Clusters: 0x7a28     LCN: 0x26cbe3c    LCN_end:0x26d3864
VCN: 0x7a28     Clusters: 0x4f98     LCN: 0x26d3864    LCN_end:0x26d87fc
VCN: 0xc9c0     Clusters: 0x50ac     LCN: 0x26d87fc    LCN_end:0x26dd8a8
VCN: 0x11a6c    Clusters: 0x4bfc     LCN: 0x26dd8a8    LCN_end:0x26e24a4
VCN: 0x16668    Clusters: 0x5315     LCN: 0x26e24a4    LCN_end:0x26e77b9
VCN: 0x1b97d    Clusters: 0x50c2     LCN: 0x26e77b9    LCN_end:0x26ec87b
VCN: 0x20a3f    Clusters: 0x5825     LCN: 0x26ec87b    LCN_end:0x26f20a0
VCN: 0x26264    Clusters: 0x1909     LCN: 0x26f20a0    LCN_end:0x26f39a9
VCN: 0x27b6d    Clusters: 0x5afb     LCN: 0x1f7fec9    LCN_end:0x1f859c4
VCN: 0x2d668    Clusters: 0x38320    LCN: 0x26f39a9    LCN_end:0x272bcc9
VCN: 0x65988    Clusters: 0x4e5ae    LCN: 0x2ca2da0    LCN_end:0x2cf134e

(我添加了最后一列,由 Clusters + LCN 计算得出,与下一行中的 LCN 在前 8 行中匹配)

为什么 NTFS 将第一个片段/范围分成 8 个不同且奇数大小的部分?

答案1

这是一个术语问题。

微软文章 集群和范围 定义这些术语:

集群可以从两个不同的角度来指代:在文件内和在卷上。文件中的任何簇都有一个虚拟簇号 (VCN),它是相对于文件开头的相对偏移量。例如,寻道到簇大小的两倍,然后读取,将返回从第三个 VCN 开始的数据。逻辑簇号 (LCN) 描述簇相对于卷内某个任意点的偏移量。LCN 应仅视为序数或相对数。逻辑簇与物理硬盘驱动器扇区没有保证的映射。

一个程度是连续簇的运行。例如,假设一个由 30 个簇组成的文件被记录在两个区段中。第一个区段可能由 5 个连续簇组成,另一个区段由其余 25 个簇组成。

如果我们使用这些术语,您的文件有 4 个范围,其中包含 11 个集群。

因此,该实用程序contig使用非标准术语,使用术语“片段”表示“范围”,并且该-v选项仅列出集群。

如果您希望措辞更精确,请使用以下命令:

fsutil file queryextents "C:\Users\bruno\Downloads\pp.big"

此内置 Windows 命令将使用 Windows 术语“Clusters”、“VCN”和“LCN”。

参考 :Fsutil 文件


维基百科 范围(文件系统) 解释更多:

区段是文件系统中为文件保留的连续存储区域,表示为 Count 关键数据设备上的块号或轨道范围。文件可以由零个或多个区段组成;一个文件碎片需要一个区段。直接的好处是将每个范围紧凑地存储为两个数字,而不是规范地存储范围内的每个块号。[1] 此外,区段分配可以减少文件碎片。

问题仍然是,为什么即使磁盘上的区段是连续的,它们的大小也不尽相同。或者换句话说,为什么不是所有连续的簇都包含在一个区段中。区段大小的长度似乎也相当随机。

由于我找不到有关该主题的任何文档,我只能推测这取决于驱动程序和计算机上的工作负载,这就是为什么大小是随机的。

由于 Windows 有义务定期将文件的元数据刷新到磁盘主文件表 (MFT),我的理论是每次刷新时,都会向文件中添加新的数据运行(范围)。

数据运行的大小将取决于驱动程序在这段时间内写入磁盘文件的数据量。这将取决于计算机总工作量、数据在磁盘上的位置、查找数据所花的时间等诸多因素。

我无法指出有关该主题的任何文献,因为我没有找到任何文献,但这个理论确实解释了所发布的调查结果。

相关内容