查看硬碟上檔案/目錄的實體位置

查看硬碟上檔案/目錄的實體位置

是否有任何 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 的檔案系統上。

相關內容