查找硬盘扇区占用文件的内容

时间:2010-08-09 23:05:04

标签: hard-drive lookup-tables

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

从我的A-Level Computing课程中,我被教导硬盘驱动器在磁盘的前几KB上有一个查找表。在此表中,每个文件都有一个链接列表,详细说明了该文件占用的扇区。所以我希望有一个方便的方法来查看这个表中的某个文件,看看它占据了哪些扇区。

我尝试过Google,但我发现没什么用处。也许我不是在寻找合适的东西,但我找不到任何东西。

感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:11)

关于驱动器

操作系统无法直接访问现代硬盘的物理几何形状。早期的硬盘驱动器非常简单,可以根据它们的物理结构,圆柱头部门来解决它们。现代驱动器要复杂得多,并使用像zone bit recording 这样的系统,其中并非所有轨道都具有相同数量的扇区。根据它们的物理几何形状来解决它们已经不再实用了。

来自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 =参数中,并将extent逻辑块放在skip =参数中,并像这样运行dd:

sudo dd if=/dev/yourPartition of=success.txt ibs=4096 count=1 skip=266301

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

答案 1 :(得分:0)

sudo hdparm --fibmap  file

对于ext,vfat和NTFS ..可能更多。

fibmap也是一个linux C库。

相关问题