Sysinternals DiskViewと同じ(または一部)機能、特にハードドライブ上のファイルの物理的な場所を表示する機能を提供するLinuxプログラムはありますか?
ディスクビューURL:http://technet.microsoft.com/en-gb/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、ネットワークブロックデバイスなどの物理ボリュームがあります。物理ディスクまたはディスクグループに戻るのは難しい場合があります。
私の場合、それは線形拡張でGPTパーティションの上にある論理ボリュームだったので、比較的簡単でした。
$ sudo dmsetup table /dev/storage/home
0 1953120256 linear 8:98 384
/dev/sdg2
したがって、/ dev / storage / homeはデバイス8:98内の384セクタであり、これは私にとっては大丈夫です。
$ 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
。
端末でこのコマンドを実行する場合:
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のファイルシステムにあります。