¿Qué es ese “total” en la primera línea después de ls -l?

¿Qué es ese “total” en la salida de ls -l?

$ ls -l /etc total 3344 -rw-r--r-- 1 root root 15276 Oct 5 2004 a2ps.cfg -rw-r--r-- 1 root root 2562 Oct 5 2004 a2ps-site.cfg drwxr-xr-x 4 root root 4096 Feb 2 2007 acpi -rw-r--r-- 1 root root 48 Feb 8 2008 adjtime drwxr-xr-x 4 root root 4096 Feb 2 2007 alchemist 

Puede encontrar la definición de esa línea en la documentación de ls para su plataforma. Para coreutils ls (el que se encuentra en muchos sistemas Linux), la información se puede encontrar a través de info coreutils ls :

Para cada directorio que se enumera, coloque los archivos con una línea `BLOQUES totales ‘, donde BLOQUES es la asignación total del disco para todos los archivos en ese directorio.

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= en ls , la variable de entorno POSIXLY_CORRECT=1 GNU (para obtener unidades de 512 bytes), o -k bandera para forzar unidades de 1kB.
  • physical_block_size es el valor dependiente del sistema operativo de una interfaz de bloque interno, que puede estar o no conectada al hardware subyacente. Este valor es normalmente 512b o 1k, pero es completamente dependiente del sistema operativo. Se puede revelar a través del valor %B 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 progtwigdores junior no han tenido experiencia con agujeros de archivos o enlaces duros / simétricos . Además, la documentación disponible sobre este tema específico es prácticamente inexistente.

La falta de articulación y la ambigüedad del término “tamaño de bloque” ha sido el resultado de numerosas medidas diferentes que se confunden fácilmente, y los niveles relativamente profundos de abstracción que giran en torno al acceso al disco.

Ejemplos de información conflictiva: du (o ls -s ) vs stat

Ejecutar 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 ejecuta 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 parens) 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 los physical_blocks_in_use y physical_block_size como se usa 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 del 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 

Esa es la cantidad total de bloques del sistema de archivos, incluidos los bloques indirectos, que utilizan los archivos enumerados. Si ejecuta ls -s en los mismos archivos y sum los números informados obtendrá el mismo número.

Solo por mencionarlo, puedes usar -h (ls -lh) para convertir esto en formato legible para humanos.