`du`는 사용된 블록을 어떻게 계산합니까?

`du`는 사용된 블록을 어떻게 계산합니까?

du파일에서 사용되는 블록 수를 계산하는 방법이 궁금합니다 .

대본

dd bs=1 seek=2GiB if=/dev/null of=big
0+0 records in
0+0 records out
0 bytes (0 B) copied, 2.3324e-05 s, 0.0 kB/s

ls -lh big
-rw-r--r-- 1 roaima roaima 2.0G May 19 15:55 big

du -h big
0       big

나는 그것이 나에게 다른 대답을 줄 것이라는 것을 항상 받아들였습니다 ls. 그리고 그들은 다른 것을 측정하고 있기 때문에 괜찮습니다.

이제 저장 비용뿐만 아니라 데이터를 다운로드할 때마다 비용이 청구되는 클라우드 기반 파일 시스템이 있으므로 "이 트리에서 디스크 공간이 얼마나 사용됩니까?"와 같은 일반적인 관리 활동으로 액세스하는 데이터 양을 최소화해야 합니다. "

나는 사용된 블록의 수를 알려주는 라이브러리/시스템 호출을 인식하지 못합니다. 비록 쉽게 있을 수 있지만 말입니다. 나는 du0으로 채워진 파일과 실제로 희소한 파일을 구별하지 않기 때문에 고려 중인 모든 파일을 통해 읽는다고 믿지 않습니다 .

그렇다면 du블록 개수는 어떻게 사용되나요?

답변1

du용도stat(2)파일이 사용하는 블록 수를 찾으려면 실행하면 stat big블록 수가 에서 지정한 수와 일치하는 것을 볼 수 있습니다 du.

du옵션 을 사용하여 강제로 바이트 수를 계산할 수 있습니다 -b. 그런 다음 출력은 ls'와 일치합니다.

두 경우 모두 다음을 사용합니다 stat(2)(또는 적어도 fstatat(2)제가 가지고 있는 버전에서는):

$ strace du big|&grep big
execve("/usr/bin/du", ["du", "big"], [/* 57 vars */]) = 0
newfstatat(AT_FDCWD, "big", {st_mode=S_IFREG|0644, st_size=2147483648, ...}, AT_SYMLINK_NOFOLLOW) = 0
write(1, "0\tbig\n", 60 big

가공의 차이는에서 볼 수 있음du.c.

관련 정보