短文件可以使用更多的MFT记录而不是更长的文件吗?

时间:2012-07-23 20:21:05

标签: file ntfs ntfs-mft

我们知道,在NTFS中,我们将元数据存储在名为MFT记录的结构中(包含一些运行)。

这本书问下一个问题

  

短文件使用的MFT记录多于较长的文件吗?

我认为答案是 no - 因为如果我们有一个文件,其元数据超过一个MFT的大小,那么我们必须使用运行。还有其他建议吗?

3 个答案:

答案 0 :(得分:5)

答案是肯定的。

MFT记录(最多NT4,它有4KB,现在它有1KB)包含文件属性(如文件名,安全信息,小文件数据等);其中一些属性可以驻留(=属性头AND属性数据都位于MFT记录中),或非驻留(只有attrbite头在MFT中,属性数据存储在磁盘上的其他位置 - 例如,数据属性通常是非居民)。某些属性必须保持驻留 - 例如,文件名属性;某些属性可以是常驻属性,也可以是非属性 - 例如,数据属性。

如果您有大文件,则意味着MFT记录仅包含数据属性的属性标题,但数据位于其他位置 - 因此即使文件很大,它也只使用一个MFT记录;另一方面,如果你有非常小的文件,但是这个文件有更多的文件名(链接),NTFS必须分配更多的MFT记录以容纳所有文件名属性,它可以跨越许多MFT记录(使用称为属性的特殊属性)列表)。

答案 1 :(得分:1)

通常,新创建的文件(没有数据)将被驻留。这意味着只要有足够的可用空间,任何新数据都将被放置在其MFT记录中。随着数据的增长并且不再适合可用的MFT记录空间,数据通过将其移出MFT并进入群集块(并具有运行列表)而成为非驻留数据。一个文件是非常驻文件,如果数据稍后缩小到一个或零个字节,它将永远不会被恢复为常驻文件。

如果文件属于sparse类型并且尚未写入任何数据,则较大的数据并不总是非驻留的。只要写入的数据适合其可用的MFT记录空间,您就可以拥有1MB大小的稀疏文件并且仍然驻留。

如果零字节文件有多个硬链接,它甚至可以使用多个MFT记录。在这种情况下,其他MFT记录存储剩余的硬链接名称。

答案 2 :(得分:0)

如果一个小文件的属性列表太大而无法容纳单个记录,则该文件可以使用更多的MFT记录。

  

如果没有更多空间在文件记录段中存储属性,则会分配其他文件记录段,并将其插入称为属性列表的属性的第一个(或基本)文件记录段中。属性列表指示可以在何处找到与文件关联的每个属性。这包括基本文件记录中的所有属性,但属性列表本身除外。有关更多信息,请参见ATTRIBUTE_LIST_ENTRY

     

https://docs.microsoft.com/en-us/windows/desktop/devnotes/master-file-table

例如,当它具有大量ADS时。我创建了一个占用大部分MFT记录空间的文件(如下所示,您会看到1000/1024)

PS D:\> fsutil file queryoptimizemetadata .\test.txt
File metadata optimization                  : None
Attribute list size                         : 0 (0)
File metadata space used                    : 1000 (0x3e8)
File metadata space allocated               : 1024 (0x400)
File metadata space usage                   : 97%
File records count(s)                       : 1
Number of resident attribute(s)             : 3
Number of nonresident attribute(s)          : 8
Total number of attributes                  : 11
Total active file metadata optimization(s)  : 0
Total pending file metadata optimization(s) : 0

添加另一个流后,您可以看到分配的文件元数据空间已翻倍至2048,即2条记录,并且必须使用ATTRIBUTE_LIST,占用448个字节

PS D:\> cat .\test.txt | Set-Content -path .\test.txt -Stream stream8
PS D:\> fsutil file queryoptimizemetadata .\test.txt
File metadata optimization                  : None
Attribute list size                         : 448 (0x1c0)
File metadata space used                    : 1624 (0x658)
File metadata space allocated               : 2048 (0x800)
File metadata space usage                   : 79%
File records count(s)                       : 2
Number of resident attribute(s)             : 4
Number of nonresident attribute(s)          : 9
Total number of attributes                  : 13
Total active file metadata optimization(s)  : 0
Total pending file metadata optimization(s) : 0

如果文件碎片太多(或sparse file中的孔过多)并且记录没有足够的空间来存储扩展区列表,也会发生这种情况。其他可能性是权限太复杂,或者像提到的其他硬链接一样

  如果文件:

$ATTRIBUTE_LIST,则可能需要

     
      
  • 具有大量的硬链接(存在很多文件名属性)。
  •   
  • 变得非常分散,因此数据运行会超出MFT记录。
  •   
  • 具有复杂的安全描述符(不适用于NTFS v3.0 +)
  •   
  • 有许多命名流,例如数据流。
  •   
     

https://flatcap.org/linux-ntfs/ntfs/attributes/attribute_list.html

更多信息可以在Can the NTFS $MFT file have child records?

中找到