Tengo curiosidad por entender cómo du
cuentan los bloques utilizados en un archivo.
Guión
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
Siempre he aceptado que me dará diferentes respuestas ls
y eso está bien porque están midiendo cosas diferentes.
Ahora tengo un sistema de archivos basado en la nube donde me cobran no solo por el almacenamiento sino también cada vez que descargo datos, por lo que necesito minimizar la cantidad de datos a los que se accede mediante actividades de limpieza generales como "¿cuánto espacio en disco se utiliza en este árbol?" "
No tengo conocimiento de una llamada a la biblioteca/sistema que me diga la cantidad de bloques usados, aunque fácilmente podría haber uno. No creo du
que lea todos los archivos que está considerando porque eso no diferencia entre un archivo lleno de ceros y uno que es realmente escaso.
Entonces, ¿cómo se du
cuentan los bloques utilizados?
Respuesta1
du
usosstat(2)
para encontrar el número de bloques utilizados por un archivo. Si ejecuta, stat big
debería ver que el número de bloques coincide con el número dado por du
.
Puedes forzar du
el recuento de bytes usando la -b
opción; entonces su salida coincide con ls
la de.
En ambos casos usa stat(2)
(o mejor dicho, fstatat(2)
al menos en la versión que tengo):
$ 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
La diferencia en el procesamiento esvisible endu.c
.