La Fórmula: ¿Cuál es ese número?
total int = Suma de (physical_blocks_in_use) * physical_block_size / ls_block_size) para cada archivo.
Dónde:
ls_block_size
es una variable de entorno arbitraria (normalmente 512 o 1024 bytes) que se puede modificar libremente con el
--block-size=<int>
indicador activado ls
, la POSIXLY_CORRECT=1
variable de entorno GNU (para obtener unidades de 512 bytes) o el -k
indicador para forzar unidades de 1kB.
physical_block_size
es el valor dependiente del sistema operativo de una interfaz de bloque interno, que puede o no estar conectado al hardware subyacente. Este valor normalmente es 512b o 1k, pero depende completamente del sistema operativo. Se puede revelar a través del %B
valor en stat
o fstat
. Tenga en cuenta que este valor (casi siempre) no está relacionado con la cantidad de bloques físicos en un dispositivo de almacenamiento moderno .
¿Por qué tan confuso?
Este número está bastante separado de cualquier métrica física o significativa. Muchos programadores junior no han tenido experiencia con agujeros de archivo o enlaces hard / sym . Además, la documentación disponible sobre este tema específico es prácticamente inexistente.
La desarticulación y la ambigüedad del término "tamaño de bloque" ha sido resultado de numerosas medidas diferentes que se confunden fácilmente, y los niveles relativamente profundos de abstracción giran en torno al acceso al disco.
Ejemplos de información conflictiva: du
(o ls -s
) vsstat
La ejecución du *
en una carpeta de proyecto produce lo siguiente: (Nota: ls -s
devuelve los mismos resultados).
dactyl:~/p% du *
2 check.cc
2 check.h
1 DONE
3 Makefile
3 memory.cc
5 memory.h
26 p2
4 p2.cc
2 stack.cc
14 stack.h
Total : 2 + 2 + 1 + 3 + 3 + 5 + 26 + 4 + 2 + 14 = 62 bloques
Sin embargo, cuando uno corre stat
, vemos un conjunto diferente de valores. Ejecutar stat
en el mismo directorio produce:
dactyl:~/p% stat * --printf="%b\t(%B)\t%n: %s bytes\n"
3 (512) check.cc: 221 bytes
3 (512) check.h: 221 bytes
1 (512) DONE: 0 bytes
5 (512) Makefile: 980 bytes
6 (512) memory.cc: 2069 bytes
10 (512) memory.h: 4219 bytes
51 (512) p2: 24884 bytes
8 (512) p2.cc: 2586 bytes
3 (512) stack.cc: 334 bytes
28 (512) stack.h: 13028 bytes
Total: 3 + 3 + 1 + 5 + 6 + 10 + 51 + 8 + 3 + 28 = 118 bloques
Nota: Puede usar el comando stat * --printf="%b\t(%B)\t%n: %s bytes\n"
> para generar (en orden) el número de bloques, (en pares) el tamaño de esos bloques, el nombre del archivo y el tamaño en bytes, como se muestra arriba.
Hay dos cosas importantes para llevar:
stat
informa tanto el physical_blocks_in_use
y physical_block_size
como se utiliza en la fórmula anterior. Tenga en cuenta que estos son valores basados en las interfaces del sistema operativo.
du
proporciona lo que generalmente se acepta como una estimación bastante precisa de la utilización del disco físico.
Como referencia, aquí está el ls -l
directorio de arriba:
dactyl:~/p% ls -l
**total 59**
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.cc
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.h
-rw-r--r--. 1 dhs217 grad 0 Oct 16 2013 DONE
-rw-r--r--. 1 dhs217 grad 980 Oct 16 2013 Makefile
-rw-r--r--. 1 dhs217 grad 2069 Oct 16 2013 memory.cc
-rw-r--r--. 1 dhs217 grad 4219 Oct 16 2013 memory.h
-rwxr-xr-x. 1 dhs217 grad 24884 Oct 18 2013 p2
-rw-r--r--. 1 dhs217 grad 2586 Oct 16 2013 p2.cc
-rw-r--r--. 1 dhs217 grad 334 Oct 16 2013 stack.cc
-rw-r--r--. 1 dhs217 grad 13028 Oct 16 2013 stack.h
man ls
en mi sistema no menciona esa línea, peroinfo coreutils ls
sí. ¿Cómo vieneman ls
yinfo coreutils ls
tiene información diferente sobre el mismo comando? ¿Por qué nols
solo se documenta una vez? Tener dos documentaciones diferentes para el mismo comando parece estar preparado para el fracaso.