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

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

是否有任何 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 的文件系统上。

相关内容