7

我正在寻找一种简单的方法来查找哪些扇区占用给定文件。我的语言偏好是 C#。

在我的 A-Level 计算课上,我被告知硬盘驱动器在磁盘的前几 KB 上有一个查找表。在此表中,每个文件都有一个链接列表,详细说明了该文件占用的扇区。所以我希望有一种方便的方法可以在此表中查找某个文件并查看它占用的扇区。

我试过谷歌,但我没有发现任何有用的东西。也许我没有在寻找正确的东西,但我根本找不到任何东西。

任何帮助表示赞赏,谢谢。

4

2 回答 2

12

关于驱动器

现代硬盘驱动器的物理几何形状不再由操作系统直接访问。早期的硬盘驱动器非常简单,可以根据它们的物理结构、柱面扇区来解决它们。现代驱动器要复杂得多,并且使用诸如区域位记录之类的系统,其中并非所有轨道都具有相同数量的扇区。根据它们的物理几何形状来处理它们不再实用。

从 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 现在应该包含原始文件的内容。

于 2010-08-10T20:16:13.437 回答
1
sudo hdparm --fibmap  file

对于分机,vfat 和 NTFS ..也许更多。

fibmap也是一个linux C库。

于 2015-04-25T19:36:16.840 回答