[GUIDA] Ridurre la dimensione dell'immagine di una MicroSD

Qui trovate tutti i thread riguardanti la risoluzione di problemi di diversa natura. Scrivete qui per ricevere supporto se il vostro problema è generico o non esiste (ancora) la sezione apposita per il sistema con cui avete problemi
astuni
Messaggi: 1
Iscritto il: mar nov 15, 2016 8:23 pm
Reputation: Locked

[GUIDA] Ridurre la dimensione dell'immagine di una MicroSD

Messaggioda astuni » mar dic 20, 2016 7:35 pm

Per questo tutorial è necessario utilizzare Linux, non c'è modo di effettuare questo procedimento in ambiente Windows, TUTTAVIA, è possibile effettuarlo da Windows eseguendo Linux in una VM senza problemi, i comandi utilizzati sono abbastanza basilari ma in generale possiamo considerare questo un tutorial avanzato e sconsiglio di avventurarsi senza avere un minimo di dimestichezza con Linux, è anche vero che però lavorando su file immagine all'interno di una Virtual Machine siete sempre liberi di testare con una copia del file in vostro possesso e ripetere il procedimento da capo se non dovesse funzionare al primo colpo.

A volte può capitare di avere a disposizione un file immagine di dimensioni superiori alla dimensione della propria scheda MicroSD, in questo caso, non sarà possibile scrivere l'immagine in nostro possesso direttamente sulla scheda ma, usando Linux e qualche comando avanzato è possibile, previa cancellazione di una quantità di dati sufficiente all'interno dell'immagine, andare a ridimensionare effettivamente l'immagine in maniera da poterla scrivere senza problemi sulla nostra MicroSD.

Per questo procedimento abbiamo bisogno di copiare la nostra immagine all'interno di un sistema Linux, nel mio caso ho utilizzato Linux Mint, che è un derivato di Ubuntu, ma in generale, essendo i comandi della guida abbastanza universali, si potranno eseguire senza grossi problemi anche in altre distribuzioni.

Se utilizzate Linux all'interno di una VM, è consigliabile copiare l'immagine all'interno del sistema operativo virtualizzato utilizzando una comunissima share samba che vi permetta di fare "ponte" da Windows al Linux dentro la VM, una semplice ricerca su Google vi potrà indirizzare su come fare per condividere una cartella via samba da Linux, uno dei primi risultati è il seguente: https://forums.linuxmint.com/viewtopic.php?t=224391.

Una volta copiata l'immagine all'interno del nostro sistema Linux possiamo procedere a montarla per potervi accedere e cominciare a cancellare il contenuto "superfluo" per far si che la dimensione dello spazio effettivamente occupato scenda al di sotto della dimensione massima della MicroSD a nostra disposizione:

Col comando fdisk andiamo a visualizzare il numero e le caratteristiche delle partizioni presenti nella nostra immagine:

Codice: Seleziona tutto

sudo fdisk -l imagename.img

L'output sarà qualcosa del tipo:

Codice: Seleziona tutto

Device Boot      Start         End      Blocks   Id  System
imagename.img1            8192      122879       57344    c  W95 FAT32 (LBA)
imagename.img2          122880    15415295     7646208   83  Linux

La partizione che dobbiamo montare e che contiene di fatto i dati che dobbiamo "ridurre" è la seconda, ovvero la partizione di tipo "Linux".

Pertanto dopo esserci annotati il valore corrispondente alla colonna "START" ovvero 122880 nel nostro esempio, andremo a montare la partizione dell'immagine con i seguenti comandi:

Codice: Seleziona tutto

sudo losetup /dev/loop0 imagename.img -o $((START*512))

NOTA: Sostituire il valore START con il valore annotato in precedenza, nel nostro caso 122880
Creiamo quindi un mount point attraverso cui montare la partizione:

Codice: Seleziona tutto

sudo mkdir -p /retropie_img
sudo mount /dev/loop0 /retropie_img

Arrivati a questo punto avremo accesso in lettura e scrittura alla partizione contenente di fatto tutto il sistema RetroPie dal nostro sistema Linux e potremo navigare all'interno delle cartelle andando a cancellare tutto ciò che riteniamo superfluo per far si che la dimensione complessiva dello spazio occupato scenda al di sotto della dimensione della nostra MicroSD, per questo procedimento suggerisco di cancellare un tot di files alla volta, ad esempio potremmo voler eliminare interi romset presenti nel percorso

Codice: Seleziona tutto

/home/pi/RetroPie/roms
e monitorare lo spazio effettivamente occupato utilizzando il comando

Codice: Seleziona tutto

df -h
dopo ogni cancellazione.

Una volta che la quantità di dati è stata sufficientemente ridotta per poterla scrivere sulla nostra MicroSD dobbiamo procedere con i comandi necessari a ridurre il File-System ext4 della partizione appena montata in maniera tale che non sia superiore alla dimensione massima consentita dalla nostra MicroSD.
Per fare ciò abbiamo bisogno di un programma specifico ovvero gparted.
gparted è una sorta di "Partition Magic" che gli informatici più navigati ricorderanno sicuramente, per installarlo su Linux Mint o Ubuntu digitare il seguente comando:

Codice: Seleziona tutto

sudo apt-get update && sudo apt-get install gparted

Una volta installato lo andremo ad avviare col seguente comando, non prima di aver smontato il file system, facendolo puntare al device /dev/loop0 che contiene la partizione da ridurre:

Codice: Seleziona tutto

sudo unmount /retropie_img
sudo gparted /dev/loop0

gparted ci presenterà un'interfaccia grafica molto semplice, tutto ciò che dobbiamo fare è selezionare la partizione con un click sulla rappresentazione grafica e poi dal Menu "Partition" selezionare la voce "Resize/Move"
Comparirà una finestra con una serie di valori da inserire, l'unico che dovremo modificare è il valore "New size (MiB)" che dovremo portare ad un valore prossimo al "Minimum Size" visualizzato in alto, per essere sicuri, suggerisco di andare ad inserire circa 500 MB in più rispetto al valore minimo possibile, così se ad esempio il valore di Minimum Size è pari a: 20000MiB il valore di "New size" lo imposteremo a 20500MiB.
Inserito il valore New size andremo ad applicare la modifica cliccando sulla voce di Menu "Edit" e poi "Apply all operations".
Il procedimento di ridimensionamento del file-system avrà inizio e comparirà una finestra di stato che mostrerà l'avanzamento della procedura simile a quella di seguito:
Immagine
NOTA: E' importantissimo annotare il valore in K della nuova dimensione del file-system perchè ci servirà tra poco, dovrete quindi esplodere i dettagli della schermata cliccando sui vari triangolini neri a sinistra fino a visualizzare l'output del comando resize2fs che viene eseguito, e annotarvi il valore numerico espresso in K che segue, nel caso dell'immagine allegata è pari a 1790976K

Eseguita questa operazione manca l'ultimo step, ovvero quello di andare a definire la nuova dimensione della partizione contente il file-system appena ridimensionato, per fare ciò useremo nuovamente il comando fdisk ma non più sulla singola partizione ma sull'intera immagine, non abbiamo quindi più bisogno del device /dev/loop0 attuale e lo rimuoviamo col seguente comando:

Codice: Seleziona tutto

sudo losetup -d /dev/loop0

Ne creiamo quindi uno nuovo che punti all'intera immagine:

Codice: Seleziona tutto

sudo losetup /dev/loop0 imagename.img

e quindi procediamo con fdisk:

Codice: Seleziona tutto

sudo fdisk /dev/loop0

All interno di fdisk andremo a digitare i seguenti comandi:

Codice: Seleziona tutto

d 2
per cancellare la definizione della seconda partizione;

Poi:

Codice: Seleziona tutto

n p 2
per creare una nuova partizione primaria sempre come seconda;
Inseriremo come valore di START della seconda partizione il valore annotato per primo ovvero lo "START" che nel nostro esempio era pari a:

Codice: Seleziona tutto

122880

e come "Size" inseriremo il valore annotato per secondo con un + davanti, quindi:

Codice: Seleziona tutto

+1790976K

Infine digiteremo:

Per scrivere le modifiche e salvare la definizione della nuova partizione "ridimensionata".

Non abbiamo ancora finito, l'ultimo step è quello di "tagliare via" lo spazio oramai inutilizzato del file immagine che ancora risulta occupare su disco la sua dimensione originaria, per fare ciò andremo a digitare i seguenti comandi:

Codice: Seleziona tutto

sudo fdisk -l /dev/loop0
dovrete annotare dall'output il valore corrispondente alla colonna END della seconda partizione, ad esempio, nell'output seguente, è pari a 4055039

Codice: Seleziona tutto

sudo fdisk -l /dev/loop0

Disk /dev/loop0: 2077 MB, 2077229056 bytes
4 heads, 32 sectors/track, 31696 cylinders, total 4057088 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x10d58467

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1   *        8192      124927       58368    e  W95 FAT16 (LBA)
/dev/loop0p2          124928     4055039     1965056   83  Linux

quindi procederemo a rimuovere il device /dev/loop0 nuovamente col comando:

Codice: Seleziona tutto

sudo losetup -d /dev/loop0

e useremo il comando truncate per tagliare via lo spazio vuoto in eccesso dal file immagine come segue:

Codice: Seleziona tutto

truncate -s $(((END+1)*512)) imagename.img
dove "END" deve essere sostituito dal valore annotato poco fa, ovvero: 4055039

Ecco fatto, abbiamo ridotto la nostra immagine ad una dimensione tale da poter essere scritta sulla nostra MicroSD e utilizzata nella nostra Raspberry Pi, ben fatto!

La guida è stata scritta prendendo spunto dalla seguente guida in inglese disponibile http://www.aoakley.com/articles/2015-10-09-resizing-sd-images.php.

Un saluto a tutti.
Giorgio


Torna a “Questioni tecniche varie”

Chi c’è in linea

Visitano il forum: sicboy e 0 ospiti