是否有任何 Linux 程式可以提供與 Sysinternals DiskView 相同(或部分)的功能,特別是能夠查看硬碟上檔案的實體位置?
磁碟查看網址: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/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
。
在一個終端機中執行此命令時:
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 是十六進位的區塊位址。如果你想要十進制,請更改 printf。
- 0x0008是讀取的區塊數
- dd 是發出請求的應用程式的名稱
此範例位於區塊大小為 4K 的檔案系統上。