Linux의 자세한 스파스 파일 정보

Linux의 자세한 스파스 파일 정보

일부 블록만 할당된 희소 파일이 있습니다.

~% du -h --apparent-size example
100K    example
~% du -h example
52K     example

파일의 어떤 블록이 실제로 할당되었는지 알고 싶습니다. 할당 목록이나 파일 취약점 목록을 가져오는 데 사용할 수 있는 시스템 호출이나 커널 인터페이스가 있습니까?

단순히 0으로 이루어진 충분히 긴 문자열(GNU cp, rsync 등에서 사용하는 방법)을 확인하는 것만으로는 작동하지 않습니다.

~% cp example example1  
~% du -h example1 
32K     example1

실제로 할당된 다른 제로 시퀀스를 감지합니다.

답변1

가지다SO에 비슷한 질문이 있습니다. 이것현재 승인된 답변통과@ephemientioctl다음을 사용 fiemap하는 것이 좋습니다.linux/Documentation/filesystems/fiemap.txt. 문서 인용:

fiemap ioctl은 사용자 공간이 파일 범위 매핑을 얻는 효율적인 방법입니다. fiemap은 블록별 맵(bmap과 같은)이 아닌 범위 목록을 반환합니다.

이것이 당신이 찾고 있는 정보인 것 같습니다. 파일 시스템 지원도 선택 사항입니다.

fiemap을 지원하려는 파일 시스템은 구조에 콜백을 구현해야 ->fiemap 합니다 inode_operations.

당신을 위한 지지 SEEK_DATASEEK_HOLE주장lseek솔라리스에서 언급됨Linux 3.1에 따라 추가됨매뉴얼 페이지, 그래서 당신도 그것을 사용할 수 있습니다. 이 버전은 fiemap ioctl오래된 것으로 보이므로 현재는 다른 Linux 버전 간에 이식성이 더 높을 수 있으며, lseekSolaris가 동일한 운영 체제를 사용하는 경우 다른 운영 체제 간에 이식성이 더 높을 수도 있습니다.

답변2

Python 프로그램 모음이 있습니다.희박한 도구SEEK_HOLE및 를 사용하여 SEEK_DATA파일의 어느 부분이 구멍으로 표시되고 어느 부분이 데이터인지 확인합니다. 사용법은 매우 간단합니다. mksparse특정 레이아웃을 기반으로 스파스 파일을 생성하는 데 사용할 수 있습니다.

 $ echo hole,data,hole | mksparse --hole-size 4096 --data-size 4096 example
 $ du -sh example
 4.0K   example

sparsemap프로그램은 레이아웃을 표준 출력으로 인쇄하는 데 사용할 수 있습니다.

 $ sparsemap example
 HOLE 4096
 DATA 4096
 HOLE 4096

답변3

파일 시스템에 따라 다릅니다. 나는 그것이 하나의 호출이라고 믿지 않습니다. 아마도 많은 도구가 희소 파일 복사를 잘 처리하지 못하는 이유일 것입니다. GNU 툴체인은 사용되지 않는 할당 블록을 제거할 수 있도록 큰 0 블록 검색을 사용합니다. 많은 복사 도구는 희소 파일을 모든 블록이 할당된 파일로 변환합니다.

inode를 열고 결과를 구문 분석해야 할 수도 있습니다. inode 형식은 파일 시스템에 따라 다릅니다. 일부 파일 시스템 inode에는 자체적으로 일부 데이터가 포함될 수 있습니다.

관련 정보