无法找到文件占用的物理磁盘扇区

无法找到文件占用的物理磁盘扇区

系统内部磁盘视图产生了一种似乎不太可能的情况。我有一系列文件,我知道它们存在于 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...

相关内容