파일에 쓰는 것과 /dev/zero에서 잘라내는 것의 차이점

파일에 쓰는 것과 /dev/zero에서 잘라내는 것의 차이점
$ timeout 1 cat /dev/zero > file1

$ wc -c file1
270422016 file1

$ du file1
264084 file1

질문:

(1) 270422016 null 문자가 어떻게 264084바이트(예: 258M)로 나오나요?

$ truncate -s 270422016 file2

$ wc -c file2
270422016 file2

$ du file2
0 file2

질문:

(2) 이전과 동일한 수의 널 문자 file2로 생성되었지만 크기가 0인 이유는 무엇입니까?file1file2

(3) 수행된 작업 중 수행되지 않은 /dev/zero작업 은 무엇이며, 그 반대의 경우도 마찬가지입니까?truncate

답변1

  1. du바이트 단위의 크기는 표시되지 않지만 (이 경우) 1024바이트 블록이 표시됩니다. 따라서 이 숫자는 실제로 동일합니다( 264084 * 1024 = 270422016).

  2. truncate만들다스파스 파일전제는 파일 시스템이 이러한 기능을 지원한다는 것입니다.

  3. /dev/zero사실상 무한한 바이트가 생성되어 \0파일에 기록되며, 0을 쓰면 다른 쓰기와 마찬가지로 공간이 소모됩니다. 공간을 많이 차지하는 파일을 생성하는 또 다른 방법실제로는 0이 기록되지 않습니다.사용하게 될 것이다 fallocate.

filefrag해당 파일에 대한 추가 정보를 얻는 데 사용할 수 있습니다 .

$ timeout 1 cat /dev/zero > file1
$ truncate -s 270422016 file2
$ fallocate -l 270422016 file3
$ filefrag -e file1 file2 file3

파일 1( cat /dev/zero)은 완전히 작성되었지만 이 경우에도 조각난 것으로 판명되었습니다.

Filesystem type is: 58465342
File size of file1 is 270422016 (66021 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..    8175:    9983740..   9991915:   8176:            
   1:     8176..   32751:   11049359..  11073934:  24576:    9991916:
   2:    32752..   54271:   11193265..  11214784:  21520:   11073935:
   3:    54272..   62191:   11182601..  11190520:   7920:   11214785:
   4:    62192..   70383:   11214785..  11222976:   8192:   11190521: last,eof
file1: 5 extents found

조각화는 사용 가능한 여유 공간의 크기와 파일 크기가 얼마나 될지 알지 못한 채 파일 시스템이 파일 쓰기를 시작하기로 결정한 위치에 따라 달라집니다.


파일 2( truncate)는 빈 셸일 뿐이며 예약된 공간이 전혀 없으며 크기는 물리적 확장 영역이 아닌 메타데이터로만 표시됩니다.

File size of file2 is 270422016 (66021 blocks of 4096 bytes)
file2: 0 extents found

파일 3( fallocate)이 할당되었으나 기록되지 않은 것으로 표시됩니다. 따라서 조각화되지 않은 경우에도 물리적 공간이 예약되어 있습니다(파일 시스템에 크기가 미리 알려지기 때문입니다). 해당 주소에 물리적으로 다른 데이터가 저장되어 있어도 파일을 읽으면 0이 됩니다. 이는 즉시 파일 할당이 공간을 예약할 뿐 디스크의 데이터를 덮어쓰지는 않기 때문입니다.

File size of file3 is 270422016 (66021 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..   66020:   10983338..  11049358:  66021:             last,unwritten,eof
file3: 1 extent found

관련 정보