삼바를 사용하여 파일 서버를 설정하고 동일한 LAN에 있는 다른 컴퓨터에서 파일을 복사했습니다. SSH 서버를 설정하고 전화기로 연결하여 프로세스를 모니터링했습니다.
내 전화기의 OpenSSH 클라이언트에서 실행하는 내용은 다음과 같습니다(서버에는 GNU Core Utilities가 설치되어 있습니다).
# while :; do du -sh /media/samba; sleep 1; done
288M /media/samba
289M /media/samba
290M /media/samba
...
^C
# while :; do du -sb /media/samba; sleep 1; done
328267292 /media/samba
328267292 /media/samba
328267292 /media/samba
... ...
(repeated ~30 times)
361334588 /media/samba
361334588 /media/samba
... ...
(repeated ~30 times)
403280532 /media/samba
403280532 /media/samba
^C
#
컴퓨터(Windows 10 실행)는 대략적인 전송 속도를 보고합니다. 1000KB/s, 모든 파일 크기는 30~35MB입니다.
내 관찰에 따르면 du
보고된 파일 크기는 이지만 -h
"점유 공간"은 입니다 -b
.
그렇다면 du
파일이 커질 때 크기가 다르게 보고되는 이유는 무엇입니까? 옵션 합계 를 처리하는
방법은 무엇입니까 ? du
-h
-b
답변1
내 관찰에 따르면 du는 -h로 파일 크기를 보고하지만 -b로 "점유된 공간"을 보고합니다.
GNU의 경우 그 반대가 적용 du
됩니다 du --help
.
-b, --bytes는 '--apparent-size --block-size=1'과 동일합니다.
du
보고서 없이 --apparent-size
디스크 사용량(디렉토리를 포함하여 모든 유형의 고유 파일 필드 합계, st_blocks
디렉터리 트리를 탐색하여 계산)을 보고하고 --apparent-size
(로 암시됨 -b
) 합계 st_size
(일반 파일에서 읽은 데이터의 양)를 보고합니다. 파일).
디스크 사용량이 점진적으로 증가하면 겉보기 크기가 큰 덩어리로 커집니다. 한 가지 가능한 설명은 파일 내용이 처음부터 끝까지 순차적으로 전송되지 않고 무작위로 전송된다는 것입니다. 이는 청크가 다른 피어에서 전송되는 비트스트리밍에서 일반적입니다.
예를 들어, 쓰기 위해 새 파일을 연 다음 1GiB 오프셋에서 4KiB 블록을 쓰면 파일 크기는 1GiB+4KiB로 커지지만 디스크 사용량은 4KiB가 됩니다.
$ zsh
% zmodload zsh/system
% exec 3> file
% du -h file
0 file
% du -s file
0 file
% sysseek -u3 $((1<<30)) # seek to 1GiB
% head -c 4K < /dev/urandom >&3 # write 4KiB there
% du -h file
4.0K file
% du -b file
1073745920 file
이는 디스크 공간을 4KiB만 차지하는 매우 큰 스파스 파일입니다.
% sysseek -u3 0
% head -c 4K < /dev/urandom >&3
% du -h file
8.0K file
% du -b file
1073745920 file
4KiB 쓰기를 시작한 후 파일 크기는 변하지 않았지만 디스크 사용량이 많이 늘어났습니다.
% head -c 4M < /dev/urandom >&3
% du -h file
4.1M file
% du -b file
1073745920 file
또 다른 4MiB를 쓴 후에도 같은 일이 일어났습니다.
1 BitTorrent 클라이언트는 일반적으로 공간을 미리 할당하여 fallocate()
공간을 보장하고 시스템이 디스크 할당 결정을 내리는 데 도움을 줍니다. fallocate()
지원되지 않는 SMB 파일에 액세스해야 하는 경우에는 이를 수행하지 못할 수도 있습니다.
답변2
차이점은 깃발이다
-h
사람이 읽을 수 있는 출력의 경우 메가바이트가 사용됩니다
-b
. 물론 -s
요약하자면
du 맨 페이지에서
-b --bytes 기본 블록 크기를 무시하고 크기를 바이트 단위로 인쇄합니다(*블록 크기 참고::).
-h --human-readable 메가바이트 수를 나타내는 "M"과 같이 각 크기에 크기 문자를 추가합니다. 1000이 아닌 1024의 거듭제곱이 사용됩니다. "M"은 1,048,576바이트를 나타냅니다. 1000의 거듭제곱을 선호하는 경우 "-H" 또는 "--si" 옵션을 사용하십시오.
-s --summarize 각 매개변수의 합계만 표시합니다.
따라서 처음 호출할 때 du -sh
메가바이트를 1024승으로 올려서 사람이 읽을 수 있는 형식으로 총계를 요약합니다.
두 번째 호출에서는 du -sb
바이트를 사용하여 매개변수를 요약합니다.