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?
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?
Risposte:
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 gzip
o 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.
resize2fs
o 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.
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 ...
losetup --find --partscan xxx.img
per impostare il file di immagine come dispositivo loop. quindi corri lsblk
per trovare le partizioni del dispositivo loop.
resize2fs
sono solo per le extN
partizioni di tipo. Altri tipi di partizioni richiedono altri strumenti.
L'ho provato anche con qemu-img , e ha funzionato come un incantesimo:
qemu-img resize test.img 2G
Stiamo ridimensionando il test.img
per renderlo 2G (2 GB).
Ha funzionato perfettamente per me.
df -h
mostra le dimensioni originali. Com'è possibile?
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 lsblk
quale 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.