系统内部磁盘视图产生了一种似乎不太可能的情况。我有一系列文件,我知道它们存在于 NTFS 文件系统(位于旋转磁盘硬盘上),但当我尝试使用突出显示功能查找它们时,它通常会报告The specified file does not occupy any clusters
。我不知道这是怎么可能的,因为该文件也包含在导出文本文件输出中。也许这种类型的工具有一些我不理解的限制,但任何建议或指示都会有所帮助。
dd
此任务是我尝试直接从 Linux 机器上的磁盘查找一些文件的一部分。
更新
感谢评论中的指点,有关 $MFT 的注释让我走上了正确的道路。谢谢!
进一步了解背景... 我正在备份一些旧硬盘,这时我遇到了一些令人讨厌的权限被拒绝故障。大多数人可能就此止步了,我可能也应该这样做。长话短说,这些很可能是用远程教育或者可能已损坏。Diskview 无法找到相关簇,这有点让人分心,但对于文件系统新手来说,可能需要解释一下。我会尝试一下这部分,并将权限被拒绝异常的分析留到另一天。
$ tar czf - lab01/ 1> /dev/null
tar: lab01/lab01/.DS_Store: Read error at byte 0, while reading 6148 bytes: Permission denied
tar: lab01/lab01/.vscode/launch.json: Read error at byte 0, while reading 512 bytes: Permission denied
tar: lab01/lab01/lab01.ok: Read error at byte 0, while reading 247 bytes: Permission denied
tar: lab01/lab01/lab01.py: Read error at byte 0, while reading 3072 bytes: Permission denied
tar: lab01/lab01/map.jpg: Read error at byte 0, while reading 8192 bytes: Permission denied
tar: lab01/lab01/numberline_0.png: Read error at byte 0, while reading 3584 bytes: Permission denied
tar: lab01/lab01/numberline_1.png: Read error at byte 0, while reading 3584 bytes: Permission denied
tar: lab01/lab01/school.csv: Read error at byte 0, while reading 5120 bytes: Permission denied
tar: lab01/lab01/tests/.DS_Store: Read error at byte 0, while reading 5120 bytes: Permission denied
tar: lab01/lab01/tests/q22.py: Read error at byte 0, while reading 2863 bytes: Permission denied
tar: lab01/lab01/tests/q231.py: Read error at byte 0, while reading 1689 bytes: Permission denied
tar: lab01/lab01/tests/q232.py: Read error at byte 0, while reading 1046 bytes: Permission denied
tar: lab01/lab01/tests/q311.py: Read error at byte 0, while reading 1072 bytes: Permission denied
tar: lab01/lab01/tests/q41.py: Read error at byte 0, while reading 367 bytes: Permission denied
tar: lab01/lab01/tests/q411.py: Read error at byte 0, while reading 360 bytes: Permission denied
tar: lab01/lab01/tests/q51.py: Read error at byte 0, while reading 736 bytes: Permission denied
tar: lab01/lab01/tests/q52.py: Read error at byte 0, while reading 784 bytes: Permission denied
tar: lab01/__MACOSX/lab01/._.DS_Store: Read error at byte 0, while reading 120 bytes: Permission denied
tar: lab01/__MACOSX/lab01/._lab01.ok: Read error at byte 0, while reading 176 bytes: Permission denied
tar: lab01/__MACOSX/lab01/._lab01.py: Read error at byte 0, while reading 435 bytes: Permission denied
tar: lab01/__MACOSX/lab01/tests/._.DS_Store: Read error at byte 0, while reading 120 bytes: Permission denied
tar: Exiting with failure status due to previous errors
答案1
正如 kreemoweet 在评论中指出的那样,较小的文件(可能小于 1024 字节)可能完全包含在 MFT 中。通常,除非出现损坏或损坏,否则这并不重要。如果出于某种原因您关心这一点,Diskview 中有关文件不占用任何簇是文件数据包含在 MFT 中的完全可接受的指标。下面详细介绍了几个更慎重的选项的示例。我们关心的是 $DATA 属性,它将有一个标志来指示数据是驻留在 MFT 本身内还是位于群集中。我仍然对此感到困惑,因为 MFT 在技术上占用了磁盘上的扇区,但识别系统文件的结构是 Diskview 无法做到的。而且很少有工具似乎直接引用这些驻留文件。
Linux/Unix 选项使用ntfsprogs(基于 .deb 的系统上的 ntfs-3g)
在 MFT 中:
$ ntfsls -l -p /file1 /dev/sdb2
17 Jan 16 21:38 2021 file1
$ ntfsinfo -F /file1 /dev/sdb2 | grep -A1 \$DATA
Dumping attribute $DATA (0x80) from mft record 66054 (0x10206)
Resident: Yes
不在 MFT 中:
$ ntfsls -l -p /file2 /dev/sdb2
2768 Jan 16 21:38 2021 file2
$ ntfsinfo -F /file2 /dev/sdb2 | grep -A1 \$DATA
Dumping attribute $DATA (0x80) from mft record 67840 (0x10900)
Resident: No
使用 nfi.exe 的 Windows 选项
从这里找到这个其他类似问题解答。我应该注意,该软件包的链接在 microsoft.com 上不再可用,因此我不得不使用 archive.org。
在 MFT 中:
C:\oem3sr2\nfi>nfi.exe n:\file1
NTFS File Sector Information Utility.
Copyright (C) Microsoft Corporation 1999. All rights reserved.
\file1
$STANDARD_INFORMATION (resident)
$FILE_NAME (resident)
$SECURITY_DESCRIPTOR (resident)
$DATA (resident)
不在 MFT 中:
C:\oem3sr2\nfi>nfi.exe n:\file2
NTFS File Sector Information Utility.
Copyright (C) Microsoft Corporation 1999. All rights reserved.
\file2
$STANDARD_INFORMATION (resident)
$FILE_NAME (resident)
$SECURITY_DESCRIPTOR (resident)
$DATA (nonresident)
logical sectors 102022152-102022159 (0x614bc08-0x614bc0f)
随后,如果您想从 Linux 查看文件数据,并且出于某种原因想要在不安装设备或映像的情况下查看它,则可以-v
使用ntfsinfo
选项 。这将在底部输出一个包含群集编号的运行列表。将它与群集大小结合起来,您就会得到我们可以寻求的物理偏移量dd
(虽然如果您可以使用 ,则没有太多理由这样做ntfscat
)。感谢这个答案有关簇到扇区和字节偏移转换的解释。同样,我们可能需要查看此类数据的唯一原因是文件系统损坏或损坏。同样,还有许多其他工具可能更适合此类分析,例如http://sleuthkit.org/sleuthkit/。
查找集群信息:
$ ntfsinfo -m /dev/sdb2 | grep "Cluster Size"
Cluster Size: 4096
$ ntfsinfo -v -F /file2 /dev/sdb2
...
Dumping attribute $DATA (0x80) from mft record 67840 (0x10900)
Attribute length: 72 (0x48)
Resident: No
Name length: 0 (0x0)
Name offset: 64 (0x40)
Attribute flags: 0x0000
Attribute instance: 2 (0x2)
Lowest VCN 0 (0x0)
Highest VCN: 0 (0x0)
Mapping pairs offset: 64 (0x40)
Compression unit: 0 (0x0)
Data size: 2768 (0xad0)
Allocated size: 4096 (0x1000)
Initialized size: 2768 (0xad0)
Runlist: VCN LCN Length
0x0 0xc29781 0x1
寻道/跳过位置(以字节为单位)是簇号乘以簇大小。显然,这就是文件碎片化成为问题的地方!
$ dd bs=1 if=/dev/sdb2 skip=$(python -c 'print 0xc29781*4096') count=2768
...our data...