Come posso convertire un'immagine del disco Linux in un file sparse?


12

Ho un sacco di immagini del disco, realizzate con ddrescue, su una partizione EXT, e voglio ridurne le dimensioni senza perdere dati, pur essendo montabile.

Come posso riempire lo spazio vuoto nel filesystem dell'immagine con zeri e quindi convertire il file in un file sparso in modo che questo spazio vuoto non sia effettivamente archiviato sul disco?

Per esempio:

> du -s --si --apparent-size Jimage.image 
120G Jimage.image
> du -s --si Jimage.image 
121G Jimage.image

Questo in realtà ha solo 50 G di dati reali su di esso, tuttavia, quindi la seconda misurazione dovrebbe essere molto più piccola.

Questo presumibilmente riempirà lo spazio vuoto di zeri:

cat /dev/zero > zero.file
rm zero.file

Ma se i file sparsi vengono gestiti in modo trasparente , potrebbe effettivamente creare un file sparse senza scrivere nulla sul disco virtuale, impedendomi ironicamente di trasformare l'immagine del disco virtuale in un file sparse stesso. :) Lo fa?

Nota: per qualche motivo, sudo dd if=/dev/zero of=./zero.filefunziona quando catnon è presente su un'immagine disco montata.


2
Scrivere zero in un file non creerà un file sparse. È un concetto diverso. Quando cerchi / leggi un file sparso quando il sistema operativo scopre che il blocco di dati non è realmente presente (l'elenco dei blocchi è vuoto per i dati in quella regione) (il sistema operativo) riempie automaticamente magicamente il buffer di lettura con zero byte.
hotei,

Nota: sudo cat /dev/zero > zero.filenon funziona perché bash (in esecuzione come te, non root) esegue il reindirizzamento prima di eseguire il sudocomando. Vedi unix.stackexchange.com/questions/1416/…
Fritz,

Risposte:


19

Prima di tutto, i file sparsi vengono gestiti in modo trasparente solo se si cerca, non se si scrivono zero.

Per rendere più chiaro, l'esempio di Wikipedia

dd if=/dev/zero of=sparse-file bs=1k count=0 seek=5120

non senza scrivere alcun zeri, si aprirà il file di output, cercare (saltare) 5MB e poi scrivere a zero zeri (cioè nulla). Questo comando ( non da Wikipedia)

dd if=/dev/zero of=sparse-file bs=1k count=5120

scriverà 5 MB di zero e non creerà un file sparso!

Di conseguenza, un file che è già non sparso non diventerà magicamente più tardi.

In secondo luogo, per creare un file con un sacco di zeri sparse, bisogna cp esso

cp --sparse=always original sparsefile

oppure puoi usare anche l'opzione --sparse di tar 'o rsync .


1
Secondo Wikipedia, scrivere zeri con dd creerà un file sparse. Puoi spiegare cosa significa "cercare"?
endolith

1
Che mi dici del gatto allora? Non c'è nulla nella pagina man sui file sparsi, quindi presumo cat /dev/zero > zero.filesia perfettamente OK riempire lo spazio vuoto con zeri?
Ludwig Weinzierl,

2
@endolith: aggiornata la mia risposta per chiarire qual è la differenza da usare ddper scrivere zero o per cercare.
mihi,

2
@Ludwig Weinzierl: Sì, quel catcomando riempirà l'intero disco (o almeno la quantità non riservata per root o per quote) con zero "reali" e non creerà file sparsi.
mihi,

1
@endolith avrai bisogno di spazio extra, sì. ma poiché puoi comprimere il tarball, avrai solo bisogno di spazio per il file originale e una versione compressa del file sparse.
mihi,

12

Forse il modo più semplice per sparsificare un file sul posto sarebbe usare l' fallocateutilità come segue:

fallocate -v --dig-holes {file_name}

fallocate (1) è fornito dal pacchetto util-linux su Debian .


1
Per qualche motivo, fallocate --dig-holesho generato il file 103GiB dall'originale 299GiB, mentre cp --sparse=alwaysmi ha dato 93GiB - tutti con la stessa somma SHA1 (dimensioni verificate tramite du -B1Gvs du --apparent-size -B1G). Quindi fallocatesembra dare risultati inferiori.
Ruslan,

3

Modifica della mia risposta per completezza:

  1. Balloon spazio FS vuoto con zero (ATTENZIONE: questo cambia l'immagine del disco):

losetup --partscan --find --show disk.img

Supponiamo che dia / dev / loop1 come disco e che ci sia solo una partizione, altrimenti dovremo ripetere questo per ogni partizione con FS montabile (ignorare la partizione di swap ecc.).

mkdir -p /mnt/tmp mount /dev/loop1p1 /mnt/tmp dd if=/dev/zero of=/mnt/tmp/tempfile

Lascia che finisca per fallire con ENOSPC.

/bin/rm -f /mnt/tmp/tempfile umount /mnt/tmp losetup -d /dev/loop1

  1. Copia in un'immagine sparsa:

'dd' ha un'opzione per convertire un file con zero in un file sparse:

dd if=disk.img of=disk-sparse.img conv=sparse



1
Sì, questa opzione non è dal momento in cui l'OP ha chiesto. Questo era più di "lasciare una briciola di pane per gli altri ricercatori" ... :-)
Lam Das

1
a seconda del tipo di file system, zerofreepotrebbe essere più veloce del montaggio e della scrittura di zero nel file system e della riduzione dell'immagine del disco se conteneva già molti zero.
mihi,

2

Vuoi dire che la tua immagine creata da ddrescue è, diciamo, 50 GB e in realtà qualcosa di molto meno basterebbe?

In tal caso, non potresti semplicemente creare una nuova immagine con dd:

dd if=/dev/zero of=some_image.img bs=1M count=20000

e quindi creare un filesystem al suo interno:

mkfsofyourchoice some_image.img

quindi basta montare l'immagine e copiare tutto dalla vecchia immagine a quella nuova? questo funzionerebbe per te?


2

PartImage può creare immagini del disco che memorizzano solo i blocchi utilizzati di un filesystem, riducendo drasticamente lo spazio richiesto ignorando il blocco inutilizzato. Non penso che tu possa montare direttamente le immagini risultanti, ma andando:

image -> partimage -> image -> cp --sparse=alway

Dovrebbe produrre quello che vuoi (potrebbe anche essere possibile attenersi all'ultimo passaggio, non ho provato).


1
Sfortunatamente le immagini create dal partimage non possono essere montate senza espanderle di nuovo, rendendole adatte solo per scopi di archiviazione.
Perkins,

0

Ora c'è uno strumento chiamato virt-sparsify che lo farà. Riempie lo spazio vuoto con zeri e quindi copia l'immagine in un file sparso. Tuttavia richiede l'installazione di molte dipendenze.


-2

Ho il sospetto che avrai bisogno di un programma personalizzato scritto su quella specifica se è DAVVERO quello che vuoi fare. Ma è ...?

Se in realtà hai molte aree a zero, qualsiasi buon strumento di compressione lo ridurrà significativamente. E provare a scrivere file sparsi non funzionerà in tutti i casi. Se ricordo bene, anche i file sparsi occupano almeno 1 blocco di memoria di output in cui il blocco di input contiene QUALSIASI bit diverso da zero. Ad esempio, supponiamo che tu abbia un file con una media di anche 1 bit diverso da zero per blocco di 512 byte, non può essere scritto "scarsamente". A proposito, non perderai dati se comprimi il file con zip, bzip, bzip2 o p7zip. Non sono come la compressione mpeg o jpeg con perdita di dati.

D'altra parte, se è necessario eseguire letture di ricerca casuali nel file, la compressione potrebbe essere più un problema di quanto valga la pena e si torna alla scrittura sparsa. Un programmatore C o C ++ competente dovrebbe essere in grado di scrivere qualcosa del genere in un'ora o meno.


Interessante: un downvote eppure noto che non c'è confutazione di ciò che ho scritto. Se è preciso ma non utile, non è un motivo per votare. Se non è accurato e non utile, lo merita.
hotei,

Vedo altrove che l'OP aveva una domanda relativa al montaggio di immagini compresse. Suppongo che questa sia una continuazione di quel thread. Sapendo che ora posso vedere perché il mio suggerimento di compressione non è stato accettato. Un semplice programma C è ancora un modo semplice per creare file sparsi. MA - il sistema operativo (non specificato) ti consentirà di montare un ISO scarso. Per quanto schizzinoso sia il mounter ISO di Ubuntu, non sono sicuro al 100% che funzionerà neanche ... ma buona fortuna in ogni caso.
hotei,

4
perché reinventare la ruota? cp --sparse=alwaysfa bene il lavoro
mihi

@mihi: è una buona idea. Non sapevo dell'opzione sparsa in quanto non è disponibile nei gusti BSD ( freebsd.org/cgi/… ) e non ho mai avuto il requisito di guardare una pagina man di Linux per cp (fino ad oggi).
hotei,

Un modo per avere le tue immagini compresse e montarle è semplicemente memorizzarle su un filesystem che supporti la compressione nativa. Rende il recupero dei dati terribile se si verifica un arresto anomalo dell'unità, ma è a questo che servono i backup, giusto?
Perkins,
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.