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.