"Ls -lh" informa un tamaño total menor que la suma de tamaños individuales

14

¿En qué circunstancias se ls -lhmostrará un total menor que la suma de los archivos individuales? Por ejemplo:

$ ls -lh /var/lib/nova/instances/_base
total 100G
-rw-rw-r-- 1 nova         nova 4.3M 2012-02-14 14:07 00000001
-rw-rw-r-- 1 nova         nova 5.7M 2012-02-14 14:07 00000002
-rw-rw-r-- 1 nova         nova  42G 2012-03-08 15:24 1574bddb75c78a6fd2251d61e2993b5146201319.part
-rw-rw-r-- 1 libvirt-qemu kvm   24M 2012-02-14 14:07 77de68daecd823babbb58edb1c8e14d7106e83bb_sm
-rw-r--r-- 1 libvirt-qemu kvm   65G 2012-03-02 12:43 bd307a3ec329e10a2cff8fb87480823da114f8f4
-rw-rw-r-- 1 libvirt-qemu kvm  160G 2012-02-24 16:06 ephemeral_0_160_None
-rw-rw-r-- 1 libvirt-qemu kvm   80G 2012-02-24 22:38 ephemeral_0_80_None
-rw-r--r-- 1 libvirt-qemu kvm   10G 2012-02-24 22:37 fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f
-rw-r--r-- 1 libvirt-qemu kvm   10G 2012-02-24 11:09 fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f_sm

Editar: ahora se muestran algunas banderas adicionales por solicitud en el comentario:

$ ls -aiFlh  /var/lib/nova/instances/_base/
total 143G
29884440 drwxrwxr-x 2 nova         nova 4.0K 2012-03-08 15:45 ./
29884427 drwxr-xr-x 6 nova         nova 4.0K 2012-03-08 15:05 ../
29884444 -rw-rw-r-- 1 nova         nova 4.3M 2012-02-14 14:07 00000001
29884445 -rw-rw-r-- 1 nova         nova 5.7M 2012-02-14 14:07 00000002
29884468 -rw-r--r-- 1 nova         nova  65G 2012-03-08 15:59 1574bddb75c78a6fd2251d61e2993b5146201319.converted
29884466 -rw-rw-r-- 1 nova         nova  58G 2012-03-08 15:35 1574bddb75c78a6fd2251d61e2993b5146201319.part
29884446 -rw-rw-r-- 1 libvirt-qemu kvm   24M 2012-02-14 14:07 77de68daecd823babbb58edb1c8e14d7106e83bb_sm
29884467 -rw-r--r-- 1 libvirt-qemu kvm   65G 2012-03-02 12:43 bd307a3ec329e10a2cff8fb87480823da114f8f4
29884443 -rw-rw-r-- 1 libvirt-qemu kvm  160G 2012-02-24 16:06 ephemeral_0_160_None
29884442 -rw-rw-r-- 1 libvirt-qemu kvm   80G 2012-02-24 22:38 ephemeral_0_80_None
29884447 -rw-r--r-- 1 libvirt-qemu kvm   10G 2012-02-24 22:37 fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f
29884441 -rw-r--r-- 1 libvirt-qemu kvm   10G 2012-02-24 11:09 fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f_sm
Lorin Hochstein
fuente
no sé si alguno de esos son enlaces, ¿podría enumerar ls -aiFlh
bsd
@bdowning Se agregaron las banderas adicionales. Tenga en cuenta que ha habido algunos cambios en el directorio, pero el problema sigue ahí
Lorin Hochstein
¿Qué tal du -h --totalpara el mismo directorio?
bsd

Respuestas:

20

Sucederá si tiene archivos dispersos:

$ mkdir test; cd test
$ truncate -s 1000000000 file-with-zeroes
$ ls -l
total 0
-rw-r--r-- 1 gim gim 1000000000 03-08 22:18 file-with-zeroes

Un archivo disperso es un archivo que no se ha rellenado con bloques del sistema de archivos (o solo parcialmente). Cuando lea una zona no poblada de un archivo disperso obtendrá ceros. Dichas zonas en blanco no requieren espacio en disco real, y el 'total' informado lscorresponde al espacio en disco ocupado por los archivos (al igual que du).

Stéphane Gimenez
fuente
3
Sus imágenes de disco kvm probablemente estén llenas de agujeros :-)
Stéphane Gimenez
La documentación de coreutils dice que la opción -s/ --size"Imprime la asignación de disco de cada archivo a la izquierda del nombre del archivo. Esta es la cantidad de espacio en disco utilizado por el archivo, que generalmente es un poco más que el tamaño del archivo, pero puede será menor si el archivo tiene agujeros ". La -lopción, por supuesto, también imprime el tamaño.
Francesco Turco
2

Tenga en cuenta que la salida dada por ls -ly dutiene una diferencia sutil pero muy importante. Prueba esto:

dd if=/dev/urandom of=aaa bs=1024 count=1

Ahora

ls -l aaa
-rw-r--r-- 1 abc abc 1024 2012-03-08 15:45 aaa

Mientras

du -h aaa
4.0K    aaa

Esto se debe a que el sistema de archivos asigna el tamaño en trozos de 4096 (en mi caja de Linux). Se llama IO Block. Puedes ver esto por:

    stat aaa
  File: `aaa'
  Size: 1024        Blocks: 8          IO Block: 4096   regular file
Ankur Agarwal
fuente
Además, puede probar statmi propuesta empty-file, y verá que la cantidad de Bloques es 0, incluso si se informa que el archivo tiene un tamaño de 1G.
Stéphane Gimenez
@ StéphaneGimenez ¿Por qué informa Blocks como 8? ¿Qué bloque es este con un tamaño de 512 bytes?
Ankur Agarwal
1
Es un poco extraño, en los viejos tiempos, los bloques IO tenían un tamaño 512, pero ahora son generalmente 4K. statinforma el número equivalente de bloques de tamaño antiguo necesarios para almacenar todos los bloques de 4K (es decir, 8 veces el número real de bloques de 4K).
Stéphane Gimenez
1

La respuesta aceptada es absolutamente correcta, solo si desea ver el tamaño aparente, puede usar:

du --apparent-size

imprimir tamaños aparentes, en lugar del uso del disco; aunque el tamaño aparente es generalmente más pequeño, puede ser mayor debido a agujeros en archivos ('dispersos'), fragmentación interna, bloques indirectos y similares

iman
fuente