"du -sh"와 "du -sb"는 파일에 액세스할 때 다른 결과를 제공합니까?

"du -sh"와 "du -sb"는 파일에 액세스할 때 다른 결과를 제공합니까?

삼바를 사용하여 파일 서버를 설정하고 동일한 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바이트를 사용하여 매개변수를 요약합니다.

관련 정보