"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. 그것은 서로 다른 것을 측정하기 때문에 괜찮습니다.

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

사용된 블록의 수를 알려줄 수 있는 라이브러리/시스템 호출은 없지만 아마도 하나는 있을 것입니다. 나는 du그것이 0으로 가득 찬 파일과 정말로 희소한 파일을 구별할 수 없기 때문에 그것이 고려 중인 모든 파일을 읽는다고 믿지 않습니다 .

그렇다면 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.

관련 정보