关于磁盘驱动器
现代硬盘的物理结构已不再直接可被操作系统所访问。早期的硬盘驱动器简单到可以按照它们的物理结构(柱面、磁头和扇区)进行寻址。现代硬盘驱动器更为复杂,使用像分区镜像记录之类的系统,其中并非所有轨道拥有相同数量的扇区。根据它们的物理几何结构进行定位已不再实用。
来自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应该包含原始文件的内容。