Kra*_*atz 6 lookup-tables hard-drive
我正在寻找一种很简单的方法来查找哪些扇区占用给定文件.我的语言偏好是C#.
从我的A-Level Computing类开始,我被教导硬盘驱动器在磁盘的前几KB上有一个查找表.在此表中,每个文件都有一个链接列表,详细说明了该文件占用的扇区.所以我希望有一种方便的方法可以在这个表中查找某个文件并查看它占用的扇区.
我试过谷歌,但我发现没什么用.也许我不是在寻找正确的东西,但我找不到任何东西.
任何帮助表示赞赏,谢谢.
Cha*_*ler 12
关于驱动器
操作系统无法直接访问现代硬盘驱动器的物理几何形状.早期的硬盘驱动器非常简单,可以根据它们的物理结构,圆柱头部门来解决它们.现代驱动器要复杂得多,并且使用区域位记录等系统,其中并非所有轨道都具有相同数量的扇区.根据它们的物理几何形状来解决它们已不再实用.
从fdisk手册页:
如果可能,fdisk将自动获取磁盘几何.这不一定是物理磁盘的几何形状(实际上,现代磁盘实际上没有像物理几何体那样的东西,当然也不能用简单的圆柱/磁头/扇区形式来描述)
为了解决这个问题,现代驱动器使用逻辑块寻址来解决,这是操作系统所知道的.LBA是一种寻址方案,其中整个磁盘表示为一组线性,每个块是均匀的字节数(通常为512或更大).
关于文件
为了理解"文件"在磁盘上的位置(在LBA级别),您需要了解文件是什么.这取决于您使用的文件系统.在Unix风格的文件系统中,有一个称为inode的结构,它描述了一个文件.inode存储文件具有的所有属性,并指向实际数据的LBA位置.
Ubuntu示例
这是查找文件数据的LBA位置的示例.
首先获取文件的inode编号
$ ls -i
659908 test.txt
Run Code Online (Sandbox Code Playgroud)
运行文件系统调试程序."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
Run Code Online (Sandbox Code Playgroud)
"EXTENTS"下的数字266301是文件所在文件系统中的逻辑块.如果您的文件很大,则会列出多个块.可能有一种更简单的方法来获得这个数字,我找不到一个.
要验证我们是否使用了正确的块,请使用dd从磁盘读取该块.要查找文件系统块大小,请使用dumpe2fs.
dumpe2fs -h /dev/yourPartition | grep "Block size"
Run Code Online (Sandbox Code Playgroud)
然后将块大小放在ibs =参数中,并将extent逻辑块放在skip =参数中,并运行dd,如下所示:
sudo dd if=/dev/yourPartition of=success.txt ibs=4096 count=1 skip=266301
Run Code Online (Sandbox Code Playgroud)
success.txt现在应该包含原始文件的内容.