关于驱动器
现代硬盘驱动器的物理几何结构不再可由操作系统直接访问。早期的硬盘驱动器非常简单,可以根据其物理结构(柱面磁头扇区)对其进行寻址。现代驱动器更加复杂,并且使用诸如区域位记录 http://en.wikipedia.org/wiki/Zone_bit_recording,其中并非所有磁道都具有相同数量的扇区。根据它们的物理几何形状来寻址它们已不再实际。
从 fdisk 手册页:
如果可能,fdisk 将自动获取磁盘几何结构。这不一定是物理磁盘几何结构(事实上,现代磁盘实际上没有任何东西)
就像物理几何形状一样,当然不能用简单的圆柱体/磁头/扇区形式来描述)
为了解决这个问题,现代驱动器使用逻辑块寻址来寻址,这是操作系统所知道的。 LBA 是一种寻址方案,其中整个磁盘表示为一组线性块,每个块都是统一的字节数(通常为 512 或更大)。
关于文件
为了了解“文件”在磁盘上的位置(LBA 级别),您需要了解文件是什么。这将取决于您使用的文件系统。在 Unix 风格的文件系统中,有一种称为 inode 的结构来描述文件。 inode 存储文件的所有属性,并指向实际数据的 LBA 位置。
Ubuntu 示例
下面是查找文件数据的 LBA 位置的示例。
首先获取文件的索引节点号
$ 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 现在应该包含原始文件的内容。