Cancella spazio inutilizzato con zeri (btrfs)


10

Come cancellare lo spazio inutilizzato con zeri? (Chiedo uno strumento per il filesystem btrfs )

Sto cercando qualcosa di più intelligente di

cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero

Come FSArchiver è alla ricerca di "spazio utilizzato" e ignora il sito inutilizzato, ma opposto.

Scopo: vorrei comprimere le immagini delle partizioni, quindi è altamente raccomandato riempire lo spazio inutilizzato di zeri.

Btw. Per ext3, ext4: cancella lo spazio inutilizzato con zeri (ext3, ext4) . Qui chiedo btrfs

Chiarimento dell '"algoritmo più intelligente": Come vedo che l' "algoritmo più intelligente" porta alla confusione, qui ho finalmente deciso di aggiungere una riga al riguardo. Caro lettore, ti preghiamo di pensare al filesystem come a una struttura dati. Ai fini della semplificazione, immaginiamo una mappa di bilanciamento degli alberi rosso-nero auto-bilanciante, che viene utilizzata come matrice di associazione-> valore, dove i valori sono numeri interi. L'obiettivo è cancellare tutti i valori negativi con zeri. L'algoritmo "non intelligente" eseguirà l'iterazione su di esso e aggiungerà coppie chiave: valore alla nuova mappa (con eventuale modifica negativa a zero). L'algoritmo intelligente rileverà solo i luoghi in cui sono memorizzati i valori negativi e li cancellerà sul posto .


2
Hai provato il sfillsuggerimento ? Sembra che non richiede extX.
Kevin

1. So che puoi riempire i file esistenti di zeri con brandelli, ma probabilmente non è così, giusto? 2.Come stai realizzando quelle immagini? Forse puoi fare il troncamento lì?
Zlatko,

@kevin: ecco perché ho pubblicato la risposta sfill nella domanda originale. Uso raramente i filesystem ext2,3,4 da solo, quindi trovo che i programmi di utilità che funzionano solo su ext * siano fastidiosamente inutili.
CAS

Ho bisogno di qualcosa di "intelligente". Qualcosa che riempie solo lo spazio vuoto di zeri senza toccare altri luoghi - intendo senza influire sulle strutture di dati interne, come gli alberi B (se sei curioso, ho scritto in questione "compressione" ma ne ho bisogno anche per altri scopi, come la duplicazione, l'analisi e la ricerca di immagini fs)
Grzegorz Wierzowiecki

basta usare truncatee / ofallocate
mikeserv il

Risposte:


4

Ecco un ripostaggio modificato e molto esteso della mia risposta alla tua domanda precedente:

sfilldal secure-deletepacchetto puoi fare quello che vuoi.

A differenza di zerofree (che funziona solo con filesystem ext2, ext3 ed ext4), sfill funzionerà con qualsiasi file system.

per esempio

sfill -l -l -z /mnt/X

La home page sfill / secure-delete sembra ora essere svanita, ma è confezionata per debian e ubuntu. probabilmente anche altre distro. se hai bisogno del codice sorgente, puoi trovarlo negli archivi debian se non lo trovi da nessun'altra parte.

NOTA: sfill funziona solo su un filesystem montato. Se stai riempiendo a zero i file di immagine dal sistema host anziché dall'interno di una VM, dovrai montare l'immagine fs sull'host. Il metodo esatto varia a seconda del tipo di file immagine (ad esempio qcow2 o raw).

Montare immagini "grezze" è semplice e diretto. Basta usare kpartxil file immagine per creare un dispositivo di loopback e le voci / dev / mapper / per ciascuna partizione possono essere montate singolarmente.

ecco uno script parziale modificato da un frammento dello script che uso per montare immagini del disco rigido freedos avviabili in rete (utilizzate per gli aggiornamenti del BIOS su macchine in cui flashrom non funzionerà):

image="myrawimagefile.img"

# use kpartx to build /dev/mapper device nodes
KP=$(kpartx -a -v "$image")

# now mount each partition under ./hd/
for p in $(echo "$KP" | awk '/^add map/ {print $3}') ; do
  dm="/dev/mapper/$p"
  fp=$(echo "$p" | sed -r -e 's/^loop[0-9]+//')
  mkdir -p "./hd/$fp"
  mount "$dm" "./hd/$fp"
  sfill -l -l -v "./hd/$fp"
  umount "$dm"
done

# now remove the loopback device and /dev/mapper entries
kpartx -d "$image"

NOTA: si presume che ogni partizione nell'immagine sia montabile. vero nel mio caso d'uso (un'immagine hd di freedos con una partizione). non è vero se una delle partizioni è, diciamo, spazio di swap. Rilevare tali partizioni e usare dd per azzerare la partizione di swap viene lasciato come esercizio per il lettore :)

Questo metodo, o una sua variante, dovrebbe funzionare anche per i volumi LVM.

Se le tue immagini sono qcow, puoi usare lo qemu-nbdstrumento dal qemu-utilspacchetto, che presenterà il file immagine e le sue partizioni come dispositivi di blocco della rete - ad esempio / dev / nbd0 / dev / ndb0p1 - che possono essere usati in modo simile al / dispositivi dev / mapper sopra.

È probabilmente più facile e meno complicato (ma richiede più tempo) per qemu-imgconvertire da qcow a raw, utilizzare il metodo per raw sopra, quindi riconvertire l'immagine grezza modificata in qcow2 compresso. Ciò comporterà probabilmente immagini leggermente più piccole rispetto all'uso di qemu-nbd poiché comprimerai la nuova immagine qcow2 mentre viene creata.


1
Quello che voglio dire è che esso è non considerato "intelligente" modo di riempire lo spazio inutilizzato con gli zeri. È il modo più ovvio e tipico di farlo. Non sto chiedendo cose del genere.
Grzegorz Wierzowiecki,

1
Descrivi un algoritmo "intelligente" che non è specifico per una particolare famiglia di filesystem (come zerofill è per ext2 / 3/4). Volevi un programma che potesse fare il lavoro. Non hai detto che doveva essere anche magico.
CAS

1
e, davvero, se il filesystem non è in uso (perché, ad esempio, è montato sull'host per zerofilling), che importanza ha l'intelligenza dell'algoritmo? Spostarsi nei metadati di fs alla ricerca di settori vuoti non sarà più veloce o migliore della semplice scrittura di un enorme riempimento pieno di NUL ... il filesystem stesso è già abbastanza intelligente da capire dove si trova lo spazio vuoto.
CAS

2
Da un lato, per le tue esigenze è sufficiente - quindi la mia domanda contiene già frammenti di codice con questa soluzione - quindi la tua risposta non fornisce nulla di nuovo. D'altra parte, le mie esigenze richiedono ciò che ho specificato, perché desidero pulire lo spazio inutilizzato con zeri senza modificare le strutture interne (ad esempio riequilibrare "Dancing B-Trees" o altro tipo di struttura di dati (ad esempio per analisi e deduplicazione scopi)
Grzegorz Wierzowiecki il

2
@cas - Penso che ti manchi il fatto che il riempimento zero sia un passaggio essenziale prima di compattare i dischi rigidi virtuali nelle macchine virtuali. Se si dispone di un disco espandibile da 500 GB, con 10 GB di file e 10 GB di spazio "vuoto" (ovvero file eliminati), l'esecuzione dell'approccio ingenuo "file zero gigante" richiederà molto più tempo e richiederà al disco rigido virtuale di gonfiarsi fino a i 500 GB completi. Scommetto che l'OP presume che anche l'utilità debba essere specifica per FS.
Nome falso

3

Il modo corretto e "intelligente" per liberare lo spazio libero sta usando:

fstrim /mountpoint

Usalo su un filesystem montato.

È importante notare che non vi è alcun vantaggio in termini di sicurezza. Se si desidera cancellare il disco per sicurezza, eseguire il backup dei file, azzerare l'intero disco con un comando come "shred" e quindi ripristinare i file.

Tuttavia, la soluzione funziona correttamente se il disco è una disposizione sottile su un file system scarso e si desidera ripristinare lo spazio inutilizzato.

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.