我家停电了,我的计算机硬盘的文件系统损坏了。
我检查了系统文件和硬件,没有发现任何问题。但我做了一个愚蠢的事情,chkdsk /f X:
先运行,结果发现它从 16659 个文件中找到并删除了损坏的属性记录。
现在我认为所有这些文件可能都已损坏。
我获得了“系统卷信息”文件夹的所有权,并在其中的 Chkdsk 文件夹内找到了完整的日志。
我使用 nfi.exe 从扇区号中获取受影响的文件。我正在尝试编写一个程序来asyncio.create_subprocess_exec
执行此操作。
但首先我想了解的输出nfi.exe
。
PS C:\Users\Xeni> D:\downloads\nfi\nfi.exe D: 0x9379dc5
NTFS File Sector Information Utility.
Copyright (C) Microsoft Corporation 1999. All rights reserved.
***Logical sector 154639813 (0x9379dc5) on drive D is in file number 551312.
\Games\Saints Row 4\packfiles\pc\cache\dlc3.vpp_pc
$STANDARD_INFORMATION (resident)
$FILE_NAME (resident)
$FILE_NAME (resident)
$DATA (nonresident)
logical sectors 154625064-154690687 (0x9376428-0x938647f)
输出是什么意思? 是什么$DATA (nonresident)
? 这是否意味着元数据和文件名被保留,但文件的数据消失了,该文件是一个“幽灵文件”?
我尝试用 Google 搜索"$DATA (nonresident)"
,但完全没有找到任何关于其含义的信息。
答案1
维基百科中有解释 NTFS:
对于 MFT 记录中描述的每个文件(或目录),都有一个流描述符(也称为属性)的线性存储库,这些流描述符一起打包在一个或多个 MFT 记录中(包含所谓的属性列表),并使用额外的填充来填充每个 MFT 记录固定的 1 KB 大小,并完整描述与该文件关联的有效流。
每个属性都有一个属性类型(一个固定大小的整数,映射到文件 $AttrDef 中的属性定义)、一个可选的属性名称(例如,用作备用数据流的名称)和一个以字节序列表示的值。对于 NTFS,文件的标准数据、备用数据流或目录的索引数据都存储为属性。
根据 $AttrDef,一些属性可以是常驻的,也可以是非常驻的。$DATA 属性,包含文件数据就是这样的例子。当属性常驻(用标志表示),其值直接存储在MFT记录中否则,将为数据分配簇,并且 集群位置信息作为数据的运行存储在属性中。
nfi.exe
列出 NTFS 属性。常驻表示来自 MFT,非常驻表示来自属性本身。
答案2
NFI 的文件输出示例
PS C:\Users\Xeni> D:\downloads\nfi\nfi.exe D: 0x9379dc5 NTFS 文件扇区信息实用程序。版权所有 (C) Microsoft Corporation 1999。保留所有权利。***驱动器 D 上的逻辑扇区 154639813 (0x9379dc5) 位于文件编号 551312 中。\Games\Saints Row 4\packfiles\pc\cache\dlc3.vpp_pc $STANDARD_INFORMATION (常驻)
$FILE_NAME (常驻)
$FILE_NAME (常驻)
$DATA (非常驻)
逻辑扇区 154625064-154690687 (0x9376428-0x938647f)
您的命令正在询问有关卷 D: 的扇区 0x9379dc5 的信息。
将文件表示为 MFT 中的条目
文件编号 551312 指的是 MFT 表中的条目。从技术上讲,在 NTFS 中,每个文件都由 MFT 表中的条目号表示。MFT 实现为具有固定长度条目的文件,长度通常为 1024 字节。NTFS 中的每个文件通常由一个条目表示。您正在寻找的扇区属于 MFT 中的条目号 551312。
MFT 条目的属性
该条目将所谓的标准属性分配给该编号,例如名称、日期(以 $STANDARD_INFORMATION 编码)。关键字“resident/nonresident”仅告诉您是否可以在该 MFT 条目内或其他地方(MFT 之外)找到此属性。
某些属性始终是常驻的,例如 $STANDARD_INFORMATION。文件的内容(即数据)足够小,可以放入条目本身,则可以位于关联的 MFT 条目中。在这种情况下,数据将被描述为“常驻”。您的文件数据太大,无法放入条目中,因此必须将其存储在其他位置,因此被标记为“非常驻”。在内部,NTFS 使用簇号指向数据。在我的环境中,标准簇每个簇包含 8 个 512 字节扇区。幸运的是,NFI 已经将这些簇号解码为逻辑扇区。
我猜想该行指logical sectors 154625064-154690687 (0x9376428-0x938647f)
的是相对于卷的起始位置的文件的第一个和最后一个数据扇区。要将该扇区号解码为(绝对)磁盘扇区,您需要将卷起始位置的扇区号添加到上述两个数字中。
为了更好地理解 NFI 的输出,对磁盘进行分区,例如一个小型 U 盘,有两个分区,每个分区占用大约一半的可用空间。然后将一个小文本文件和一个大文本文件写入第二个分区,并运行 NFI 以查看结果。