Ridimensionare un file immagine del Raspberry Pi

closeQuesto articolo è stato pubblicato 5 anni 3 mesi 6 giorni giorni fa quindi alcuni contenuti o informazioni presenti in esso potrebbero non essere più validi.

Il problema delle immagini del Raspberry Pi ritorna ogni volta che mi tocca usarne uno. Per questo sto iniziando ad odiare questa scheda. Anzi, odio le memorie microSD.

Il modo più sicuro di fare un backup offline (cioè a sistema spento e scheda collegata da un’altra parte) è ottenere un file immagine, tipicamente con estensione IMG. Se si deve ripristinare il sistema a causa di un guasto (tipicamente la microSD che si corrompe) sarà sufficiente “masterizzare” questa immagine su una nuova scheda microSD.

La procedura qui indicata è fatta con un PC Windows, se avete altri sistemi operativi sarà necessario modificare leggermente le cose (ad esempio non c’è Rufus per Mac)

Step 1 – creare il file IMG dalla memoria microSD

Fare il backup della scheda SD da Windows non richiede competenze particolari. Si deve scaricare il programma Win 32 Disk Imager e lo si installa.

Si inserisce la memoria microSD nel classico slot che ogni PC ormai ha (eventualmente con il suo adattatore) e ci si prende nota della lettera che le viene assegnata. Ignorare tutti i messaggi del tipo “l’unità non è utilizzabile, deve essere formattata”. Aprire il programma appena installato.

Per comodità l’immgine va salvata sul disco C:\ diretttamente, senza cartelle.

Selezionare dove deve essere salvato il file, selezionare l’unità della scheda SD e poi far click su “Leggi”. Attendere il completamento.

Nota bene: sul disco di destinazione il file occuperà tanto spazio quanto è grossa la SD, anche se è quasi vuota.

Per Linux o Mac si può usare il comando “dd” avendo cura di identificare il dispositivo della scheda SD con il comando “df” o con la gestione disco

$ sudo dd if=/dev/[nome_periferica] of=/[percorso]/immagine.img bs=4M

Qui nasce il problema. Le schede microSD a parità di spazio dichiarato sono tutte diverse tra di loro. Finché la scheda di destinazione è un pochino più grande non c’è problema, ma se è più piccola, anche solo di 10 MB, il ripristino dell’immagine con Balena Etcher non andrà a buon fine. Quindi come si fa?

Step 2 – Preparare le attività

Prima di tutto si deve fare un bel backup del file IMG, così, per non perdere tutto a causa di un errore. Poi ci si arma di (santa) tanta pazienza e del seguente materiale:

  • Un PC dal quale si possa fare il boot da USB (immagino un portatile con Windows)
  • Una chiavetta USB da sacrificare
  • Il file IMG da ridurre (che potrà essere messo sul disco del PC che useremo per l’attività, magari in C:\ direttamente)

Adesso si va sul sito di GParted e si scarica la ISO per avviare il sistema Live.
Poi si scarica Rufus dal relativo sito.

La procedura con la quale si rende la chiavetta bootable usando Rufus partendo dal file ISO è tutto sommato banale.

Step 3 – Ridimensionare il file IMG (questo è lungo)

Abbiamo la nostra chiavetta avviabile. Si spegne il PC, si infila la chiavetta USB in una porta lo si accende e si fa partire il sistema dalla chiavetta (ogni PC ha la sua modalità per essere avviato da un dispositivo USB).

Nella procedura di avvio si possono lasciare tutte le opzioni standard, in modo che il sistema parta in inglese con tastiera US e interfaccia grafica. Potrebbe essere comodo configurare la tastiera in IT per la questione dei caratteri speciali che serviranno durante il processo.

Per adesso la finestra di Gparted non serve, la possiamo chiudere. E’ necessario avviare il terminale. Questi sono i comandi da dare (ho preso le informazioni da questo sito). La procedura in sintesi è creare un device di tipo disco con l’immagine dentro in modo che questa possa essere vista dal programma che modifica le partizioni.

La prima cosa da fare è montare il disco locale del PC in modo che si possa accedere al file immagine che abbiamo messo sul disco C:\. Riassimendo è necessario montare il disco C:\ nella cartella /mnt/.

Ma come si chiama il disco C:\? Si comincia con questo comando (nota per chi fa copia-incolla: il carattere “$” identifica il prompt e non va quindi copiato e incollato).

$ sudo fdisk -lh

Il risultato è un elenco di dischi che si chiamano /dev/sdXN, dove X sono lettere dalla “a” a salire e N sono dei numeri. E’ necessario localizzare la partizione dei dati di Windows. Visto che i dischi Windows ormai hanno mille partizioni si potrebbe vedere una situazione di questo tipo

Device    Start-End-Sectors Size Type
/dev/sda1 [...] 400M Windows Recovery Environment
/dev/sda2 [...] 300M EFI System
/dev/sda3 [...] 128M Microsoft Reserved
/dev/sda4 [...] 439.2G Microsoft Basic Data
/dev/sda5 [...] 25.8G Windows Recovery Environment

A noi interessa sicuramente la partizione /dev/sda4. E’ necessario fare il mount di questa partizione

$ sudo mount /dev/sda4 /mnt

Una volta montato il disco possiamo procedere con l’abilitare sistema che emula i dischi dalle immagini IMG

$ sudo modprobe loop

Poi dobbiamo creare un nuovo device

$ sudo losetup -f

Se la tastiera è US e non IT attenzione ai caratteri “-” e “/”, io per semplicità uso quelli del tastierino numerico.

Questo comando restituirà il device che è stato creato, del tipo /dev/loopX dove X è un numero. Da ora in poi si deve usare sempre quello.

Adesso si deve montare l’immagine e renderla un device. questo comando funziona se il file si chiama immagine.img ed è direttamente su C:\

$ sudo losetup /dev/loopX /mnt/immagine.img

Ora si devono analizzare le partizioni del file appena montato

$ sudo partprobe /dev/loopX

Ci siamo, adesso si può lanciare il client grafico del programma per partizionare Gparted

$ sudo gparted /dev/loopX

Dalla parte grafica si deve selezionare la partizione più grande delle due e poi si deve fare click sul pulsante “Resize/Remove”. A questo punto sarà possibile ridurla (non meno di quello che è occupato) e confermare. La parte grafica è molto intuitiva e non ho screenshot a disposizione (sorry).

Adesso è necessario smontare l’immagine (ma prima chiudiamo la finestra di GParted).

$ sudo losetup -d /dev/loopX

Mica è finita! Abbiamo ridotto la partizione, ma non l’immagine che sarà grande come prima, ma con molto spazio non allocato. Eseguendo il comando fdisk possiamo capire come è strutturata

$ sudo fdisk -l /mnt/immagine.img

Il risultato sarà una cosa di questo genere

Disk immagine.img: 6144 MB, 6144000000 bytes, 12000000 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: 0x000000FA1

Device Boot Start End Sectors Id System immagine.img1 8192 98045 89854 c W95
immagine.img2 98304 9181183 4589568 83 Linux

Il settore è da 512 bytes e l’ultimo settore della seconda partizione è il numero 4589568, da quel settore in poi i dati sono inutili, quindi si devono tagliare. Quanto ne tagliamo? (4589568+100)*512. Il “100” è un valore arbitrario, basterebbe anche 1, ma mi tengo largo)

$ sudo truncate --size=$[(4589568+100)*512] immagine.img

Finita l’attività si può spegnere il PC con un doppio click su Exit in alto a sinistra e riaccendere in Windows, estraendo la chiavetta prima del riavvio.

Step 4 – Scrive l’immagine nella memoria microSD

Acceso nuovamente Windows si può scrivere l’immagine con balenaEtcher nella microSD e mettere poi la microSD nel Raspberry Pi. Adesso si può accendere il Raspberry Pi.

Step 5 – Avviare il raspberry e sistemare le dimensioni

Lo spazio disponibile sarà inferiore alla capacità della scheda (nel mio test ho ridotto di parecchio). Per fare questa verifica basta dare il domando

$ df -h

Il risultato sarà una cosa simile

File system     Dim. Usati Dispon. Uso% Montato su
/dev/root 3,0G 1,3G 1,6G 46% /
devtmpfs 460M 0 460M 0% /dev
tmpfs 464M 0 464M 0% /dev/shm
tmpfs 464M 6,2M 458M 2% /run
tmpfs 5,0M 4,0K 5,0M 1% /run/lock
tmpfs 464M 0 464M 0% /sys/fs/cgroup
/dev/mmcblk0p1 44M 23M 22M 51% /boot
tmpfs 93M 0 93M 0% /run/user/1000

La partizione di sistema è molto più piccola della reale capacità della microSD: nella colonna “Dim” è indicato 3GB invece dei canonici 16.

Se si vuole avere tutto lo spazio libero della scheda è necessario espandere il file system direttamente dal Raspberry. Per fare questo è necessario accedere alla shell (con la tastiera o via SSH).

$ sudo raspi-config

Selezionare la voce 7 Advanced, poi A1 Expand Filesystem. Riavviare per applicare le modifiche. Il riavvio verrà proposto all’uscita dal menu.

Il riavvio sarà un po’ più lungo, poi, fatto l’accesso, si può verificare se lo spazio disponibile è aumentato. Il comando è sempre lo stesso

$ df -h

La risposta sarà diversa: la dimensione è passata a 15GB. Pewrché non 16? Perché le schede sono tutte un po’ più piccole della capacità dichiarata e perché c’è un’altra partizione sulla scheda montata su /boot

 File system     Dim. Usati Dispon. Uso% Montato su
/dev/root 15,0G 1,3G 13G 10% /
devtmpfs 460M 0 460M 0% /dev
tmpfs 464M 0 464M 0% /dev/shm
tmpfs 464M 6,2M 458M 2% /run
tmpfs 5,0M 4,0K 5,0M 1% /run/lock
tmpfs 464M 0 464M 0% /sys/fs/cgroup
/dev/mmcblk0p1 44M 23M 22M 51% /boot
tmpfs 93M 0 93M 0% /run/user/1000

Caro lettore, se tu hai una procedura più rapida, non esitare a farmelo sapere commentando questo post! Grazie!

9 pensieri riguardo “Ridimensionare un file immagine del Raspberry Pi”

  1. ciao, ottima guida!!
    ti segnalo un refuso in $ sudo fdlisk -l /mnt/immagine.img c’è un l di troppo in fdisk

  2. Ciao, ho trovato due metodi alternativi che ho testato entrambi su di una SD Raspberry Pi con successo.

    Il primo necessita di un Mac e come al solito in questi casi anche di un’esborso monetario non indifferente (40 € circa), c’è una trial gratuita di 2 settimane comunque: https://twocanoes.com/products/mac/sd-clone/

    Il secondo invece assomiglia molto al tuo ma secondo me ha il vantaggio, per chi ha a disposizione una macchina con linux (dovrebbe funzionare anche con una macchina virtuale ma non ho provato), di poter fare tutto con linux senza doversi creare chiavette, fare reboot e spostare la scheda su Raspberry:
    https://www.youtube.com/watch?v=8afcs4y9Igs

  3. Ciao, grazie per la guida.
    Stavo provando ad eseguire il backup della micro sd del mio rpi con Win32DiskImager, ma, dato che windows assegna 2 lettere alle partizioni /boot e /root di raspbian, vorrei sapere quale delle 2 devo selezionare nel capo dispositivo di Win32diskimager.

    Grazie

  4. Ah. A me non fa così, come vedi dall’immagine del post, ho una sola lettera.
    Sei partito da NOOB o hai scritto la IMG sulla SD scaricandola dal sito?

  5. Un grazie a caratteri cubitali per chi mette a disposizione il proprio sapere a disposizione gratuita per gli altri che non sanno come il sottoscritto.
    Ho seguito alla lettera la tua procedura alla fine con il seguente comando:
    $ sudo truncate –size=$[(4589568+100)*512] immagine.img
    mi aspettavo al riavvio di win. 10 di trovare il file:
    immagine.img
    magari sovrascritto nella stessa directory di origine ma ho visto che nulla è cambiato come capienza, mi sai dare una spiegazione? grazie.

  6. Dunque, non faccio questa attività da un po’ e non mi ricordo, ma dovresti trovare il file sicuramente più piccolo, se così non fosse magari hai fatto male il comando, prova a diminuire il “100” o a verificare che il numero di settori sia quello corretto

Nota importante, da leggere prima di commentare

Questo è un blog scritto per passione, non fornisco quindi risposte di tipo professionale, se avete bisogno di un aiuto tecnico rivolgetevi ad un professionista di fiducia, non offendetevi se mi astengo dal rispondere. Vi ringrazio per la comprensione.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.