Come ridimensionare il file img creato con dd?


19

Ho un'immagine DD da una scheda SD da 4 GB che ha due partizioni, queste due partizioni utilizzano solo circa 800 MB e come tale desidero ridurre le dimensioni del file img.

Qualcuno sa come rimuovere lo "spazio libero" dal file img?


potresti voler aggiungere qual è il risultato desiderato. cioè: immagine di nuovo sulla scheda, da memorizzare su CD.
Wayne,

Risposte:


8

Per prima cosa assicurati che lo spazio libero sia effettivamente vuoto e non contenga gli avanzi di file eliminati. Il modo più semplice per raggiungere questo obiettivo è creare un enorme file sul disco, contenente solo byte null, quindi eliminarlo.

# losetup --find --partscan foo.img
# lsblk
NAME      MAJ:MIN RM    SIZE RO TYPE MOUNTPOINT
loop0       7:0    0   4096M  0 loop 
├─loop0p1 259:0    0   2048M  0 loop 
└─loop0p2 259:1    0   2048M  0 loop 
# for part in /dev/loop0p*; do
    mount $part /mnt
    dd if=/dev/zero of=/mnt/filler conv=fsync bs=1M
    rm /mnt/filler
    umount /mnt
  done
dd: error writing ‘/mnt/filler’: No space left on device
dd: error writing ‘/mnt/filler’: No space left on device
# losetup --detach /dev/loop0

Quindi comprimilo con uno strumento come gzipo xz. Anche ai livelli di compressione più bassi, una lunga serie di zeri comprime bene:

# ls -s
4096M foo.img
# gzip foo.img
# ls -s
11M foo.img.gz

Si noti che è necessario decomprimere l'immagine quando si riscrive sul disco. Questo lo decomprimerà 'live':

# cat foo.img.gz | gunzip | dd of=/dev/sda

Si noti che il dispositivo di output (sda) deve avere dimensioni sufficienti per adattarsi all'immagine originale , altrimenti i dati andranno persi o danneggiati.


Un metodo alternativo, se si desidera continuare a utilizzare l'immagine, ad esempio con una macchina virtuale, è convertire l'immagine non elaborata in uno dei formati di immagine utilizzati dal software di virtualizzazione; ad es. qcow2 per Qemu, VDI per VirtualBox o VMDK per VMware.

Si noti che ciò richiede comunque di preparare l'immagine pulendo lo spazio libero usando il metodo sopra.

# qemu-img convert -f raw -O qcow2 foo.img foo.qcow

# qemu-img convert -f raw -O vmdk foo.img foo.vmdk

Ma se verrà nuovamente scritto su un disco reale, è necessario riconvertirlo in un'immagine non elaborata.


1
come puoi essere sicuro che tutti i file che sono attualmente memorizzati nelle partizioni non sono fisicamente sparsi sul disco?
Valerio Santinelli,

perché suppongo che i file non vengano scritti in sequenza sul disco e se un file si trova alla fine dell'archiviazione, quando riduco le dimensioni, perderò il contenuto di quel file.
Valerio Santinelli,

Perché l'OP chiede come ridurre l'immagine del disco senza perdere dati. Se tronchi un'immagine a una determinata dimensione non puoi essere sicuro che i dati verranno conservati.
Valerio Santinelli,

@ValerioSantinelli: dove suggerisco esattamente di troncare l'immagine?
user1686

1
@ValerioSantinelli: usando l'appropriato strumento di ridimensionamento del filesystem per il tuo filesystem, ad esempio resize2fso ntfsresize(Linux non ha uno strumento per FAT), prima di scriverlo sul dispositivo più piccolo, o creando un nuovo filesystem e copiando solo i file.
user1686

22

L'uso resize2fsè molto più semplice

resize2fs -M xxx.img

ti verrà chiesto per primo e2fsck - quindi:

e2fsck -f -y xxx.img

(l'immagine NON deve essere montata!)

Nota: funzionerà solo se l'immagine è di una singola partizione, se si tratta di un dispositivo a blocchi interi con partizioni multiple vedi la risposta sopra ...


Solo una nota: per più partizioni, utilizzare losetup --find --partscan xxx.imgper impostare il file di immagine come dispositivo loop. quindi corri lsblkper trovare le partizioni del dispositivo loop.
Yihui Xiong

Sembra che non dovrebbe funzionare per l'immagine ISO che contiene il sistema operativo. Dopo il ridimensionamento del sistema non avviare.
RS

Sistema operativo Linux @ SR?
Rolf,

1
Questa è una risposta molto bella, ma resize2fssono solo per le extNpartizioni di tipo. Altri tipi di partizioni richiedono altri strumenti.
Rolf,

2

L'ho provato anche con qemu-img , e ha funzionato come un incantesimo:

qemu-img resize test.img 2G

Stiamo ridimensionando il test.imgper renderlo 2G (2 GB).

Ha funzionato perfettamente per me.


1
Fantastico, ha funzionato perfettamente anche per me, comprimendo un'immagine Raspbian. perfettamente funzionante!
ffleandro,

Bene, tutto funziona, tuttavia dopo l'avvio, la corsa df -hmostra le dimensioni originali. Com'è possibile?
ffleandro,

Apparentemente, qemu-img non ha la tabella delle partizioni, quindi come comprime il .img?
ffleandro,

Posso ridimensionare un disco .img a 1M che rompe definitivamente l'immagine del disco. Qualche idea per rendere il ridimensionamento più sicuro?
lesca,

1

Ho usato l'approccio gparted con il mio computer Ubuntu 16.10:

1) Mappare il file img sulla successiva partizione di loop disponibile con losetup, come descritto nei post precedenti come sopra

2) Verificare con lsblkquale loop drive è mappato il file immagine, ad es/dev/loop0

3) Eseguire sudo gparted /dev/loop0

4) Ridurre le partizioni del loop come ritenuto appropriato; assicurati di aver smontato queste partizioni.

5) Esegui fdisk /dev/loop0, quindi inserisci p, questo ti mostrerà la dimensione del blocco e il numero del blocco finale delle varie partizioni.

6) Esegui dd if=/dev/loop0 of=shrunk_image_file.img, applica a quel comando le opzioni bs=[BlockSize]e count=[EndBlockNumberOfLastLoopPartition+1]avrai un file di immagine ridotto e ridimensionato.

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.