파일 시스템에 구애받지 않는 방식으로 모든 파티션의 빈 공간 매핑을 얻으려고 합니다. 이를 위해 모든 빈 공간을 사용하는 파일을 생성한 다음 "filefrag -e" 명령(e2fsprogs v1.42.9)을 사용하여 공간 맵을 생성합니다(Ubuntu 14.04 Trusty에서 테스트, 커널 3.16.0 사용) 67 4.1.20 -040120, dosfstools v3.0.26-1).
이는 대부분의 파일 시스템에서 작동하지만 특히 FAT 파일 시스템의 경우 파티션 크기를 초과하는 물리적 오프셋을 얻습니다. 이제 질문이 변경되었습니다. 아래 편집 내용을 참조하세요.
$ dd if=/dev/zero of=temp.img bs=512 count=2048000
$ sudo losetup /dev/loop1 ./temp.img
$ sudo parted /dev/loop1 mklabel msdos
$ sudo parted /dev/loop1 mkpart primary fat32 2048s 1026047s
$ sudo blockdev --rereadpt /dev/loop1
$ sudo mkfs -t vfat /dev/loop1p1
$ sudo mount /dev/loop1p1 ./mnt
$ sudo cp somefile1 ./mnt
$ sudo cp somefile2 ./mnt
$ df -B 512 ./mnt
Filesystem 512B-blocks Used Available Use% Mounted on
/dev/loop1p1 1023440 21232 1002208 3% ./mnt
$ sudo dd if=/dev/zero of=./mnt/emptyspace.zeros bs=512 count=1002208
$ df -B 512 ./mnt
Filesystem 512B-blocks Used Available Use% Mounted on
/dev/loop1p1 1023440 1023440 0 100% ./mnt
$ sudo filefrag -b512 -e ./mnt/emptyspace.zeros
Filesystem type is: 4d44
File size of ./mnt/emptyspace.zeros is 513130496 (1002208 blocks of 512 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 1002207: 348688.. 1350895: 1002208: 1350880: merged,eof
./mnt/emptyspace.zeros: 1 extent found
$ cat /proc/mounts
/dev/loop1p1 .../mnt vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,
iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 0
$ sudo umount /dev/loop1p1
$ sudo fsck /dev/loop1p1
fsck from util-linux 2.20.1
fsck.fat 3.0.26 (2014-03-07)
/dev/loop1p1: 4 files, 63965/63965 clusters
$ echo $?
0
(filefrag는 파티션의 시작 부분을 기준으로 물리적 오프셋을 반환합니다)
$ cat /sys/class/block/loop1p1/start
2048
$ cat /sys/class/block/loop1p1/size
1024000
(512바이트 섹터의 sysfs 시작 및 크기)
분명히 1350895는 1024000보다 큽니다. 이것은 FIBMAP ioctl의 Linux vfat/fat 구현에 있는 버그입니까, 아니면 다른 이유가 있습니까?
EmmaV가 이 문제를 암시하는 댓글을 게시한 것을 확인했습니다.이 문제하지만 명확한 답은 없습니다.
또한 Theodore Ts'o(filefrag의 작성자)에게 연락했지만 그는 filefrag와 관련된 알려진 문제를 지적하지 않았습니다.
편집하다: 그 외에도 위의 문제는 e2fsprogs v1.42.9의 버그로 인해 발생하는 것으로 나타났습니다. 이 문제에 대한 해결책은여기에서 찾을 수 있습니다e2fsprogs v1.42.12에 처음 포함되었습니다. 업그레이드하고 테스트했는데 출력이 크게 다릅니다.
그러나 FAT 파일 시스템에는 여전히 문제가 있습니다. 이제 오프셋은 최소한 파티션 내부에 있지만 파일 내용을 filefrag에서 반환된 블록과 비교하면 차이가 발생합니다. 나는 썼다파이썬 스크립트는 여기에 있습니다테스트 목적으로. 문제가 무엇인지에 대한 피드백과 제안을 보내주시면 감사하겠습니다.
btrfs 문제에 대한 mkfs에 대해 말해 줄 수 있는 사람이라면 누구나 보너스를 받을 수 있습니다! :)
답변1
저는 OGAWA Hirofumi 및 Theodore Ts'o와 연락하여 다양한 커널과 e2fsprogs 태그를 테스트했습니다. 2015년 현재 e2fsprogs v1.43-WIP에서 나머지 문제가 수정되었습니다. 나는 믿는다이번에 제출하세요이 문제를 해결했습니다.
완전한 테스트 기록 및 테스트 스크립트를 사용할 수 있습니다.여기에서 발견.
이야기의 교훈: 1.43-WIP
매뉴얼 페이지 하단에 "and 2015+"라고 적혀 있지 않는 한 FAT 파일 시스템에서 filefrag를 사용하지 마십시오.
또한 v9.43에서는 hdparm --fibmap에도 버그가 구현되어 있다는 점을 언급하고 싶습니다. 최소한 v9.45가 필요하지만 hdparm을 filefrag만큼 철저하게 확인하지 않았습니다.