일부 블록만 할당된 희소 파일이 있습니다.
~% 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_DATA
와 SEEK_HOLE
주장lseek
솔라리스에서 언급됨Linux 3.1에 따라 추가됨매뉴얼 페이지, 그래서 당신도 그것을 사용할 수 있습니다. 이 버전은 fiemap ioctl
오래된 것으로 보이므로 현재는 다른 Linux 버전 간에 이식성이 더 높을 수 있으며, lseek
Solaris가 동일한 운영 체제를 사용하는 경우 다른 운영 체제 간에 이식성이 더 높을 수도 있습니다.
답변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에는 자체적으로 일부 데이터가 포함될 수 있습니다.