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에서 이를 수행하는 우아한 방법은출처는 여기.
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인 파일 시스템에 있습니다.