Como o 'du' conta os blocos usados?

2

Estou curioso para entender como du conta os blocos usados em um arquivo.

cenário

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

Eu sempre aceitei que isso me daria respostas diferentes para ls , e tudo bem porque eles estão medindo coisas diferentes.

Agora eu tenho um sistema de arquivos baseado na nuvem onde eu sou cobrado não apenas pelo armazenamento, mas também sempre que faço o download de dados, então preciso minimizar a quantidade de dados acessados por atividades gerais de limpeza, como "quanto espaço em disco é usado esta árvore? "

Não estou ciente de uma chamada de biblioteca / sistema para me informar o número de blocos usados, embora possa haver facilmente um. Eu não acredito que du leia todo o arquivo que está considerando, porque isso não diferencia entre um arquivo cheio de zeros e um que é verdadeiramente esparso.

Então, como du count blocos são usados?

    
por roaima 19.05.2016 / 17:00

1 resposta

4

du usa stat(2) para encontrar o número de blocos usados por um arquivo. Se você executar stat big , deverá ver que o número de blocos corresponde ao número dado por du .

Você pode forçar o du a contar os bytes usando a opção -b ; então a saída corresponde a ls 's.

Em ambos os casos, usa stat(2) (ou melhor, fstatat(2) , pelo menos na versão que tenho):

$ 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

A diferença no processamento é visível em du.c .

    
por 19.05.2016 / 17:06

Tags