Sparse 파일의 겉보기 크기

Sparse 파일의 겉보기 크기

다음을 사용하여 8GB의 스파스 파일을 만들었습니다.

dd if=/dev/zero of=/sparse-file bs=1 count=0 seek=8G

그럼 내가 그랬어

echo "test" >> /sparse-file

나는 그것이 du -sh sparse-file16K를 제공하고 du -sh --apparent-size sparse-file8.1G를 보여줍니다.

파일에 데이터를 쓰면 스파스 파일의 0을 덮어쓰게 되지만 실제로는 커질 것이라고 생각했습니다. 왜 그런가요? 실제 데이터를 8GB 채우기 시작하면 겉보기 크기는 16GB가 될까요?

여기서 "계산"은 정확히 무엇을 합니까?

답변1

"Sparse" 파일은 0으로 채워지는 것으로 추정되는 빈 간격이 있는 파일이지만 해당 가정이 계속 진행하기에 충분합니다. 즉, 파일을 읽으면 0을 얻게 되지만, 그것이 0이라는 것을 알기 때문에 실제로 8GB 상당의 0을 쓸 필요는 없습니다. "실제로 공간을 할당하지 않고 여기에 큰 파일이 있다는 것에 동의하자"라고 말하는 것만으로도 충분합니다.

파일의 빈 내용을 덮어쓰면 저장하는 내용을 수용하기 위해 디스크에 블록이 할당됩니다(더 이상 0이라고 가정할 수 없기 때문입니다). 하지만 만약 당신이추가파일에 아무것도 덮어쓰지 않습니다. 당신은 끝에 더 많은 것을 추가하고 있습니다. 따라서 추가함으로써 디스크에 블록을 할당하지만 해당 블록은 그렇지 않습니다.자리를 차지하다기존의 "가상" 블록; 대신에 당신이 만든 것은 상상의 것 뒤에 추가됩니다.

추가할 수도 있습니다dd -skip파일을 생성하는 데 사용한 것과 유사한 작업을 사용하여 가상 블록을 생성합니다 . "가상" 블록이 모두 함께 있을 필요는 없습니다. 그리고 실제로 파일 내의 기존 블록을 덮어쓰면,덮어쓴 블록만 할당됩니다., 파일의 어디에 나타나든 상관없습니다. 즉, 위치 101에 블록을 쓰면 블록 1부터 99까지 자동으로 할당되거나 0으로 채워지지 않습니다.

답변2

우선, count=0에서 0개의 블록만 복사했습니다 /dev/zero. 그래서, 아무것도. seek=8G8GB의 블록을 건너뛰었습니다. 차라리 로 그렇게 하고 싶지만 count=1, 완전히 생략해도 될 것 같습니다.

나머지는 그냥 읽어보세요남자 뒤. 이 apparent-size옵션은 실제 디스크 사용량이 아닌 겉보기 크기를 인쇄합니다. 따라서 첫 번째 명령에서는 파일에 디스크에 16K가 필요하다고 보고했지만 겉보기 크기는 8.1GB입니다.

16K 미만의 콘텐츠가 포함된 파일은 사용된 기본 파일 시스템에 따라 여전히 디스크에 16K가 필요할 수 있습니다. 참조GNU Coreutils 설명:

예를 들어 개행 없이 'zoo'라는 단어를 포함하는 파일은 물론 겉보기 크기가 3입니다. 이러한 작은 파일에는 유형 및 구성에 따라 0~16KiB 이상의 디스크 공간이 필요할 수 있습니다. 파일이 상주하는 파일 시스템의 정보입니다. 그러나 다음 명령으로 생성된 스파스 파일은 다음과 같습니다.

dd bs=1 seek=2GiB if=/dev/null of=big

겉보기 크기는 2GiB이지만 대부분의 최신 시스템에서는 실제로 디스크 공간을 거의 사용하지 않습니다.

관련 정보