Sysinternals DiskView와 동일한(또는 일부) 기능을 제공하는 Linux 프로그램이 있습니까? 특히 하드 디스크에 있는 파일의 물리적 위치를 볼 수 있습니까?
디스크뷰 URL: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/sdg2
따라서 /dev/storage/home은 장치 8:98 내의 384개 섹터입니다. 이는 저에게 해당됩니다 .
$ 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에서 이를 수행하는 우아한 방법은 다음 위치에 있는 btrfs_map_physical.c를 컴파일하는 것입니다.출처는 여기.
모든 파일 시스템에서 작동하도록 제가 만든 보다 일반적인 메커니즘 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은 16진수 블록 주소입니다. 십진수를 원하면 printf를 변경하십시오.
- 0x0008은 읽은 블록 수입니다.
- dd는 요청을 발행한 앱의 이름입니다.
이 샘플은 블록 크기가 4K인 파일 시스템에 있습니다.