我正在寻找一个很好的简单方法来找到哪些扇区占据了给定的文件。我的语言偏好是C#。寻找硬盘驱动器扇区占用的文件
从我的A-Level Computing课程开始,我被告知硬盘驱动器在磁盘的前几KB有查找表。在这个表中,每个文件都有一个链接列表,详细列出了文件占用的扇区。所以我希望有一个方便的方法来查看此表中的特定文件,并查看它占据了哪些部分。
我试过谷歌,但我没发现有用。也许我不是在寻找正确的东西,但我什么都找不到。
任何帮助表示赞赏,感谢。
我正在寻找一个很好的简单方法来找到哪些扇区占据了给定的文件。我的语言偏好是C#。寻找硬盘驱动器扇区占用的文件
从我的A-Level Computing课程开始,我被告知硬盘驱动器在磁盘的前几KB有查找表。在这个表中,每个文件都有一个链接列表,详细列出了文件占用的扇区。所以我希望有一个方便的方法来查看此表中的特定文件,并查看它占据了哪些部分。
我试过谷歌,但我没发现有用。也许我不是在寻找正确的东西,但我什么都找不到。
任何帮助表示赞赏,感谢。
有关驱动
现代硬盘的物理几何形状不再是直接访问操作系统。早期的硬盘驱动器非常简单,可以根据它们的物理结构(圆柱头部分)来解决它们。现代驱动器要复杂得多,并且使用像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 =参数,并在跳跃=参数的程度逻辑块,并运行DD这样的:
sudo dd if=/dev/yourPartition of=success.txt ibs=4096 count=1 skip=266301
success.txt现在应该包含原来的文件的内容。
sudo hdparm --fibmap file
对于ext,vfat和NTFS ..可能更多。
fibmap
也是一个linux C库。
为什么输入块大小(ibs)被设置为4096? – 2012-11-09 11:38:38
@VisheshHanda - 正在使用值4096 b/c,这是设备上块的设置大小。 – slm 2013-12-28 00:29:55