ドライブについて
最新のハード ドライブの物理ジオメトリは、オペレーティング システムから直接アクセスできなくなりました。初期のハード ドライブは、シリンダー ヘッド セクターという物理的な構造に基づいてアドレス指定できるほど単純なものでした。最新のドライブははるかに複雑で、ゾーン ビット レコーディングのようなシステムを使用しており、すべてのトラックが同じ量のセクターを持っているわけではありません。それらの物理的なジオメトリに従ってそれらに対処することは、もはや実用的ではありません。
fdiskのmanページから:
可能であれば、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 には元のファイルの内容が含まれているはずです。