查找文件占用的硬盘扇区

7
我正在寻找一种简单易行的方法来查找占用给定文件的区块。我的语言偏好是C#。
从我的计算机科学A级课程中,我学到了硬盘上有一个查询表,位于磁盘的前几KB。在这个表中,每个文件都有一个链接列表,详细说明该文件占用的区块。因此,我希望有一种方便的方法来查找特定文件并查看其所占据的区块。
我已经尝试过谷歌搜索,但没有找到任何有用的信息。也许我没有搜索到正确的东西,但我什么也没有找到。
任何帮助都将不胜感激,谢谢。
2个回答

13

关于磁盘驱动器

现代硬盘的物理结构已不再直接可被操作系统所访问。早期的硬盘驱动器简单到可以按照它们的物理结构(柱面、磁头和扇区)进行寻址。现代硬盘驱动器更为复杂,使用像分区镜像记录之类的系统,其中并非所有轨道拥有相同数量的扇区。根据它们的物理几何结构进行定位已不再实用。

来自fdisk手册页面:

如果可能,fdisk将自动获取磁盘几何信息。这不一定是物理磁盘几何信息(事实上,现代磁盘没有真正的物理几何结构,当然也不可能用简单的柱面/磁头/扇区形式来描述)

为了解决这个问题,现代硬盘驱动器使用逻辑块地址寻址,这是操作系统所知道的。LBA是一种寻址方案,其中整个磁盘被表示为一组线性块,每个块都是一定数量的字节(通常为512或更大)。

关于文件

为了了解"文件"在磁盘上(在LBA级别)的位置,您需要了解文件是什么。这将取决于您使用的文件系统。在类Unix风格的文件系统中,有一个称为inode的结构来描述文件。inode存储文件的所有属性并指向实际数据的LBA位置。

Ubuntu示例

以下是查找文件数据的LBA位置的示例。

首先获取文件的inode号码:

$ ls -i  
659908 test.txt

运行文件系统调试器。"yourPartition"将类似于sda1,它是您的文件系统所在的分区。

$sudo debugfs /dev/yourPartition 
debugfs: stat <659908>

  Inode: 659908   Type: regular    Mode:  0644   Flags: 0x80000
  Generation: 3039230668    Version: 0x00000000:00000001
  ...
  ...
  Size of extra inode fields: 28
  EXTENTS:
  (0): 266301

"EXTENTS"下面的数字266301是文件系统中包含您的文件的逻辑块。如果您的文件很大,则会列出多个块。可能有更简单的方法获取该数字,但我找不到。

使用dd读取磁盘上的该块来验证我们拥有正确的块。要查找文件系统块大小,请使用dumpe2fs。

dumpe2fs -h /dev/yourPartition | grep "Block size"
然后将你的块大小放在ibs=参数中,将扩展逻辑块放在skip=参数中,并像这样运行dd:
sudo dd if=/dev/yourPartition of=success.txt ibs=4096 count=1 skip=266301

现在,success.txt应该包含原始文件的内容。


为什么输入块大小(ibs)被设置为4096? - Vishesh Handa
@VisheshHanda - 使用值4096是因为这是设备上块的设置大小。 - slm

1
sudo hdparm --fibmap  file

对于ext、vfat和NTFS,可能还有其他格式。

fibmap也是一个Linux C库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接