Linux에서 자세한 스파 스 파일 정보


11

스파 스 파일이 있는데 일부 블록 만 할당됩니다.

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

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

충분히 긴 문자열 0 (GNU cp, rsync 등에서 사용하는 접근 방식)을 확인하는 것만으로는 제대로 작동하지 않습니다.

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

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

답변:


7

SO에도 비슷한 질문 이 있습니다 . 현재 허용 대답 하여 @ephemient는 사용하여 제안 ioctl이라고 fiemap설명되어있는가 linux/Documentation/filesystems/fiemap.txt. 해당 파일에서 인용 :

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

이런 소리는 당신이 찾고있는 정보의 종류입니다. 파일 시스템에 의한 지원은 다시 선택적입니다.

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

SEEK_DATASEEK_HOLE인수에 대한 지원lseek 당신이 솔라리스에서 언급이 에 따라 리눅스 3.1에 추가 된 맨 페이지 당신은뿐만 아니라 그것을 사용할 수 있도록. fiemap ioctl지금 다른 리눅스 버전에서 더 이식 할 수 있도록 반면 나타난다는 나이가하는 lseek솔라리스 같은 경우 운영 체제에서 더 이식 할 수 있습니다.


2
당신은을 사용하여이 FIEMAP 정보를 얻을 수 --fibmaphdparm유틸리티입니다. 설명서를 참조하십시오.
Totor

2

라는 파이썬 프로그램의 모음이 sparseutils 사용 SEEK_HOLE하고 SEEK_DATA파일의 섹션이 구멍으로 표시하고 데이터있는하는 결정은. 사용법은 매우 간단합니다. mksparse주어진 레이아웃에 따라 스파 스 파일을 생성하는 데 사용할 수 있습니다.

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

sparsemap프로그램은 stdout에 레이아웃을 인쇄하는 데 사용할 수 있습니다.

 $ sparsemap example
 HOLE 4096
 DATA 4096
 HOLE 4096

1

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

inode를 열고 결과를 구문 분석해야 할 것입니다. Inode 형식은 파일 시스템에 따라 다릅니다. 일부 파일 시스템은 inode 자체에서 데이터의 일부를 가질 수 있습니다.


1
이 정보를 가지려면 FS에 구애받지 않는 방법이 있어야합니다. inode에서 직접 읽는 것은 확실히 옵션이 아닙니다. 내가 좋아하는 뭔가를 찾고 있었다 SEEK_DATASEEK_HOLE매개 변수 lseek(): 솔라리스에있는 것처럼, opensolarisforum.org/man/man2/lseek.html
줄리아노

@Juliano Linux lseek 옵션을 살펴보면 이러한 옵션이 없습니다. Solaris는 파일 시스템을 거의 지원하지 않으므로 비교적 지원하기 쉽습니다. Linux는 다양한 파일 시스템을 지원하며 그 중 일부는 스파 스 파일을 지원하지 않습니다. SEEK_DATA / SEEK_HOLE에 대한 지원은 모든 파일 시스템에 대한 코드 지원을 강요합니다. 이러한 방법은 예상대로 작동하지 않을 수 있습니다. Sun 측의 자세한 데이터는 blogs.sun.com/bonwick/entry/seek_hole_and_seek_data 를 참조하십시오 .
BillThor

1
파일 시스템은 lseek () 인터페이스로 아무것도 지원할 필요가 없으며, 커널은 모듈 속성을 통해 SEEK_DATA / SEEK_HOLE을 지원하는 파일 시스템 모듈을 사용합니다. 맨 페이지 자체와 링크 된 블로그에 있습니다. "구멍에 대한 정보를 제공하지 않는 파일 시스템의 경우 파일은 하나의 전체 데이터 영역으로 표시됩니다."
Juliano

@Juliano 여전히 lseek에 대한 변경은 물론 커널 모드가 필요합니다. 블로그 항목에 따르면 이것은 Sun의 새로운 기능입니다. 그것이 작동하려면 파일 시스템 코드도 수정해야합니다. 커널 후크를 제공하기 위해 스파 스 파일을 지원하는 모든 파일 시스템을 변경해야합니다.
BillThor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.