查看硬盘上文件/目录的物理位置

Emm*_*maV 5 filesystems hard-disk

是否有任何 Linux 程序提供与 Sysinternals DiskView 相同(或部分)的功能,尤其是能够查看硬盘上文件的物理位置?

DiskView 网址:http ://technet.microsoft.com/en-gb/sysinternals/bb896650

Sté*_*las 14

对于某些文件系统,如 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
Run Code Online (Sandbox Code Playgroud)

这里的块设备是一个 LVM 卷。该卷可能在磁盘、分区、RAID 阵列、文件、RAM、网络块设备上具有物理卷……回到实际磁盘或磁盘组可能会很困难。

就我而言,这相对容易,因为它只是一个 GPT 分区顶部的逻辑卷,作为一个线性延伸。

$ sudo dmsetup table /dev/storage/home
0 1953120256 linear 8:98 384
Run Code Online (Sandbox Code Playgroud)

所以 /dev/storage/home 是设备 8:98 内的 384 个扇区,这恰好/dev/sdg2适合我。

$ cat /sys/block/sdg/sdg2/start
489060352
Run Code Online (Sandbox Code Playgroud)

所以 sdg2 是 /dev/sdg 中的 489060352 个扇区(这个系统上的第 7 个磁盘)。

所以我可以获得文件所在的单个磁盘内的偏移量:

$ 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
Run Code Online (Sandbox Code Playgroud)