Perché un file TAR essere più piccolo di quello che il suo contenuto?
Domanda
Ho un elenco che sto archiviazione:
$ du -sh oldcode
1400848
$ tar cf oldcode.tar oldcode
Quindi, la directory è 1.4GB. Il file è significativamente più piccolo, però:
$ ls -l oldcode.tar
-rw-r--r-- 1 ieure ieure 940339200 2002-01-30 10:33 oldcode.tar
Solo 897mb. Non è compresso in alcun modo:
$ file oldcode.tar
oldcode.tar: POSIX tar archive
Perché il file tar più piccolo il suo contenuto?
Soluzione
Si ottiene una differenza a causa del modo in cui funziona il filesystem.
In poche parole il disco è fatto di cluster. Ogni cluster ha una dimensione fissa di - diciamo - 4 kilobyte. Se si memorizza un file 1kb in tale 3kb grappolo resta inutilizzato. I dettagli esatti variano a seconda del tipo di file system che si utilizza, ma la maggior parte dei file system funzionano in questo modo.
spazio3kb sprecata non è molto per un singolo file, ma se hai un sacco di file molto piccoli i rifiuti può diventare una parte significativa del utilizzo del disco.
All'interno della tar-archivio i file non vengono memorizzati in gruppi, ma uno dopo l'altro. Ecco dove la differenza viene.
Altri suggerimenti
Non avendo conoscenza di ciò che il catrame si sta utilizzando o che tipo di sistema Unix che si sta utilizzando, ecco la mia ipotesi: OLDCODE contiene numerosi file più piccoli, che, se da loro stessi utilizzano lo spazio su disco in modo inefficiente, dal momento che lo spazio su disco viene allocato da alcuni sorta di blocco, anziché byte per byte. Nel file tar, sono concatenati, e fare il massimo utilizzo dello spazio su disco sono assegnati.
Questo ha qualcosa a che fare con la dimensione del blocco del filesystem. man 1 du su MacOSX 10.5.6 stati:
L'utilità du visualizza il file system Utilizzo blocco per ogni argomento di file e per ogni directory nella gerarchia del file radicata in ogni argomento directory. Se non viene specificato alcun file, viene visualizzato l'utilizzo del blocco della gerarchia radicata nella directory corrente.
[mirko@borg foo]$ ls -la
total 0
drwxr-xr-x 2 mirko wheel 68 Jan 30 21:20 .
drwxrwxrwt 10 root wheel 340 Jan 30 21:16 ..
[mirko@borg foo]$ du -sh
0B .
[mirko@borg foo]$ touch foo
[mirko@borg foo]$ ls -la
total 0
drwxr-xr-x 3 mirko wheel 102 Jan 30 21:20 .
drwxrwxrwt 10 root wheel 340 Jan 30 21:16 ..
-rw-r--r-- 1 mirko wheel 0 Jan 30 21:20 foo
[mirko@borg foo]$ du -sh
0B .
[mirko@borg foo]$ echo 1 > foo
[mirko@borg foo]$ ls -la
total 8
drwxr-xr-x 3 mirko wheel 102 Jan 30 21:20 .
drwxrwxrwt 10 root wheel 340 Jan 30 21:16 ..
-rw-r--r-- 1 mirko wheel 2 Jan 30 21:20 foo
[mirko@borg foo]$ du -sh
4.0K .
Come si vede anche un file di 2 byte vuole un intero blocco di 4 KB. Ci sono alcuni filesystem che evitano questo spreco di spazio blocco sottoallocazione .
Ci sono 2 possibilità.
Piccoli file
Molto probabilmente, non più piccolo dei suoi contenuti. Come Nils Pipenbrinck scritto , du
visualizza la quantità di spazio alloca filesystem, che dal file sono memorizzati in blocchi del filesystem è più che la dimensione logica del file.
Per visualizzare la dimensione logica del file, utilizzare du --apparent-size
. In questo caso, il risultato dovrebbe essere più piccolo del file tar.
file sparse
I file tar in grado di memorizzare i file sparse. Se l'archivio è stata creata usando --sparse
, i fori in saranno registrati i file sparsi, in modo che il tarball potrebbe essere più piccola della dimensione logica dei file.
Se le informazioni scarsità nella vostra copia estratto è stato in qualche modo perso (ad esempio se è stato estratto il tarball su un file system che non supporta file sparsi, o se fosse zip e poi decompressi, ecc), allora sarà df
segnalare la dimensione espansa.
du conta blocchi del disco, non file Dimensione Duder.