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