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
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 du
que 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 du
os blocos de contagem são usados?
Responder1
du
usastat(2)
para encontrar o número de blocos usados por um arquivo. Se você executar, stat big
verá que o número de blocos corresponde ao número fornecido por du
.
Você pode forçar du
a contagem de bytes usando a -b
opção; então sua saída corresponde à ls
de.
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
.