Sysinternals DiskView と同じ (または一部の) 機能、特にハードディスク上のファイルの物理的な場所を表示できる機能を備えた Linux プログラムはありますか?
ディスクビューURL:http://technet.microsoft.com/ja-jp/sysinternals/bb896650 より
答え1
Linux の ext4 や btrfs などの一部のファイル システムでは、filefrag を使用して、ファイル システムが存在するブロック デバイス上のファイルのデータ セグメントのオフセットを取得できます。
$ seq 1000 > a
$ filefrag -v a
Filesystem type is: ef53
File size of a is 3893 (1 block of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 82784147.. 82784147: 1: eof
a: 1 extent found
$ sudo dd bs=4k skip=82784147 count=1 if=/dev/storage/home 2>&- | head
1
2
3
4
5
6
7
8
9
10
ここで、ブロック デバイスは LVM ボリュームです。そのボリュームには、ディスク、パーティション、RAID アレイ、ファイル、RAM、ネットワーク ブロック デバイスなどの物理ボリュームが含まれる場合があります。実際のディスクまたはディスク セットに戻るのは難しい場合があります。
私の場合は、1 つの GPT パーティションの上に 1 つの線形ストレッチとして論理ボリュームを配置するだけなので、比較的簡単です。
$ sudo dmsetup table /dev/storage/home
0 1953120256 linear 8:98 384
つまり、/dev/storage/home はデバイス 8:98 内の 384 セクターであり、これは/dev/sdg2
私の場合も同じです。
$ cat /sys/block/sdg/sdg2/start
489060352
したがって、sdg2 は /dev/sdg (このシステムの 7 番目のディスク) 内の 489060352 セクターです。
したがって、ファイルが存在する単一のディスク内のオフセットを次のように取得できます。
$ sudo dd if=/dev/sdg skip="$((489060352+384+82784147*8))" count=1 2> /dev/null | head
1
2
3
4
5
6
7
8
9
10
答え2
これは古い投稿ですが、単純な論理アドレスから物理アドレスへのマッピングを持たないbtrfsファイルシステムに同じ機能が必要でした。これをbtrfsで実現するエレガントな方法は、ソースはこちら。
dd
私が作成した、どのファイルシステムでも機能するより一般的なメカニズムは、の実行中にを使用してファイルにアクセスすることですblktrace
。
1 つのターミナルでこれを実行すると:
sudo blktrace -d /dev/sda -o - | blkparse -i - -F Q,"%d Queue(Q) %T.%t %S %n %C\n" | grep --line-buffered "Queue(Q)" | awk -W interactive ' {printf "%s %13s %s 0x%08x 0x%04x %s\n", $2, $3, $1, $4, $5, $6; fflush() }
これを別の場所で実行します:
dd if=/mnt/myfs/test.txt bs=4096 iflag=direct count=1 | head -4
サンプル出力:
Queue(Q) 0.000000000 R 0x00044800 0x0008 dd
- Queue(Q)は解析しているblktraceイベントです
- 0.000000000は相対タイムスタンプです
- Rは操作(読み取り)
- 0x00044800 は 16 進数のブロック アドレスです。10 進数にしたい場合は printf を変更してください。
- 0x0008は読み取られたブロックの数です
- ddはリクエストを発行したアプリの名前です
このサンプルは、ブロックサイズが 4K のファイルシステム上にあります。