Como o `du` conta blocos usados

Como o `du` conta blocos usados

Estou curioso para entender como duconta 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

Sempre aceitei que isso me daria respostas diferentes ls, e tudo bem porque eles medem coisas diferentes.

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

Não tenho conhecimento de uma chamada de biblioteca/sistema para me informar o número de blocos usados, embora possa facilmente haver um. Não acredito duque leia todos os arquivos que está considerando, porque isso não diferencia entre um arquivo preenchido com zeros e um que é realmente esparso.

Então, como duos blocos de contagem são usados?

Responder1

duusastat(2)para encontrar o número de blocos usados ​​por um arquivo. Se você executar, stat bigverá que o número de blocos corresponde ao número fornecido por du.

Você pode forçar dua contagem de bytes usando a -bopção; então sua saída corresponde à lsde.

Em ambos os casos utiliza 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 emdu.c.

informação relacionada