파일의 "스파 스 니스"를 어떻게 출력합니까?


15

실제로 데이터로 채워진 파일 공칭 크기를 어떻게 출력합니까? 마찬가지로 vmtouch쇼 얼마나 많은 파일은 현재 메모리에 ...

워크 플로는 다음과 같습니다.

$ fallocate -l 1000000 data 
$ measure_sparseness data
100%
$ fallocate -p -o 250000 -l 500000  data
$ measure_sparseness
50%

해결 방법 : 사용 du -bshdu -sh비교하십시오.


1
관련 : filefrag모든 파일 시스템 및 xfs_bmap -vplXFS의 경우 스파 스 파일 및 홀 펀칭으로 재생할 때 데이터의 위치 (사전 할당되지 않은 범위)를 표시하는 핵심 도구입니다.
Peter Cordes

filefrag data-> 다중 FIBMAP: Invalid argument-> data: 1 extent found...
Vi.

어떤 파일 시스템에서? filefrag -e적어도 XFS와 ext4에서 완벽하게 작동합니다. 나는 다른 사람들을 테스트하지 않았습니다. FIBMAP로 대체되는 FIEMAP (extent-map)을 사용합니다. 그것들 ioctl이 작동하지 않으면 유용하지 않습니다.
Peter Cordes

tmpfs에서. 내가 filefrag없습니다 -e옵션을 선택합니다.
Vi.

몇 살 e2fsprogs입니까? 최신 기능이 아니라고 확신합니다. 동일한 상세 정보와 일부 추가 헤더 행을 인쇄 하는 -v옵션 도 있습니다 . 아마 당신의 filefrag것입니다. 그러나 달리 xfs_bmap별도의 줄이있는 구멍을 명시 적으로 나타내지 않고 파일 위치에 불연속성이 있습니다. 어쨌든, tmpfsFIEMAP을 지원하지 않는 것은 놀랍지 않습니다. 백킹 스토어로 블록 장치가 없기 때문에 익스텐트 위치에 대한 합리적인 가치는 없습니다.
Peter Cordes

답변:


19

find%S경우에도 "스파 스"라는 형식 지정자를

         %S     File's  sparseness.   This  is  calculated as (BLOCKSIZE*st_blocks / st_size).  The exact value you will get for an ordinary file of a certain
                 length is system-dependent.  However, normally sparse files will have values less than 1.0, and files which use indirect  blocks  may  have  a
                 value which is greater than 1.0.   The value used for BLOCKSIZE is system-dependent, but is usually 512 bytes.   If the file size is zero, the
                 value printed is undefined.  On systems which lack support for st_blocks, a file's sparseness is assumed to be 1.0.
$ fallocate -l 1000000 data
$ find data -printf '%S\n'
1.00352
$ fallocate -p -o 250000 -l 500000  data
$ find data -printf '%S\n'
0.507904

흥미 롭군 시스템의 대부분의 일반 파일은 1.0 이상의 sparseness를 가지며 디렉토리, 소프트 링크 및 소켓은 항상 정확히 1.0입니다.
grochmal

일부 시스템은 데이터 블록을 전혀 사용하지 않고 inode에 직접 symlink를 저장하지 않았습니까? 그것의 희미 함이 무엇인지 궁금해하십시오. 게다가, 그 정의가 잘못된 방법이 아닙니까? 확실히 정상 (예를 들어, 스파 스가 아닌) 파일은 0의 sparseness를 가져야합니다. :)
ilkkachu

@grochmal, ext4 (Linux) : ln -s foo link, "sparseness"of link: 0. 소켓과 FIFO의 길이는 0이므로 findsparseness 1을 보여줍니다.
ilkkachu

1

당신이 경우 find해당 옵션, 70 년대이기 때문에 UNIX에 일이있는 방법이 없습니다 :

ls -ls file

사용 된 실제 블록 수와 기록 된 가장 높은 바이트를 인쇄합니다. 이를 통해 실제로 할당되지 않은 블록 수를 쉽게 계산할 수 있습니다.


0

find's %S는 간단한 출력을 인쇄 하지만 자세한 내용은 sparsetest내가 작성한 오픈 소스와 여기 github을 참조하십시오 . 모든 구멍을 인쇄하려면 (예를 들어) 자유롭게 수정하십시오.

스파 스 할당에 문제가 보여주는 블로그 기사 여기를 사용하여 sparsetest문제를 디버깅 할 수 있습니다.


파일 vmtouch -v에 캐시 된 영역의 맵을 인쇄하는 것과 같이 파일에서 범위의 "맵"을 인쇄 할 수 있습니까 ?
Vi.

@Vi. 나는 전에 그것을 잘 작성하고 세부 사항을 잊어 버렸습니다. 실제로하는 일은 스파 스 파일을 만들고, 데이터를 쓰고, 통계를 인쇄하는 것입니다. 통계 작성 비트 만 원합니다. 당신이 필요합니다 구멍을 인쇄하려면 lseekSEEK_HOLESEEK_DATA. 하기 쉽다.
abligh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.