"Ls -lh" riporta le dimensioni totali inferiori alla somma delle singole dimensioni


14

In quali circostanze ls -lhmostrerebbe un totale inferiore alla somma dei singoli file? Per esempio:

$ 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

Modifica: ora mostrando alcuni flag extra sono per richiesta nel commento:

$ 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

non so se qualcuno di questi sono collegamenti, potresti elencare ls -aiFlh
bsd

@bdowning Aggiunti i flag aggiuntivi. Nota che ci sono state alcune modifiche alla directory, ma i problemi sono ancora presenti
Lorin Hochstein

Che ne dici du -h --totaldi dir stesso?
bsd

Risposte:


20

Accadrà se hai file sparsi:

$ 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 file sparse è un file che non è stato popolato con blocchi di filesystem (o solo parzialmente). Quando leggi una zona non popolata di un file sparse otterrai degli zeri. Tali zone vuote non richiedono spazio su disco effettivo e il "totale" riportato da lscorrisponde allo spazio su disco occupato dai file (proprio come du).


3
Le immagini del tuo disco kvm sono probabilmente piene di buchi :-)
Stéphane Gimenez

La documentazione di coreutils afferma che l' opzione -s/ --size"Stampa l'allocazione del disco di ciascun file a sinistra del nome del file. Questa è la quantità di spazio su disco utilizzata dal file, che di solito è un po 'più della dimensione del file, ma può essere inferiore se il file presenta buchi . " L' -lopzione ovviamente stampa anche le dimensioni.
Francesco Turco,

2

Si noti che l'output fornito da ls -le dupresenta una differenza sottile ma molto importante. Prova questo:

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

Adesso

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

Mentre

du -h aaa
4.0K    aaa

Questo perché il filesystem alloca le dimensioni in blocchi di 4096 (sulla mia scatola di Linux). Si chiama IO Block. Puoi vederlo da:

    stat aaa
  File: `aaa'
  Size: 1024        Blocks: 8          IO Block: 4096   regular file

Inoltre, puoi provare la statmia proposta empty-filee vedrai che il numero di blocchi è 0, anche se si dice che il file ha una dimensione di 1G.
Stéphane Gimenez

@ StéphaneGimenez Perché riporta Blocks come 8 però? Che blocco è questo con dimensioni 512 byte?
Ankur Agarwal

1
È un po 'strano, ai vecchi tempi, i blocchi IO avevano dimensioni 512, ma ora sono solitamente 4K. statriporta il numero equivalente di blocchi di dimensioni precedenti necessari per memorizzare tutti i blocchi 4K (ovvero 8 volte il numero reale di blocchi 4K).
Stéphane Gimenez,

1

La risposta accettata è assolutamente corretta, solo se vuoi vedere la dimensione apparente, puoi usare:

du --apparent-size

stampa formati apparenti, anziché utilizzo del disco; sebbene la dimensione apparente sia generalmente più piccola, potrebbe essere più grande a causa di buchi nei file ("sparsi"), frammentazione interna, blocchi indiretti e simili

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.