Creare immagini di SD card per Raspberry Pi

rasberry-pi-b_-with-sd-card

Può capitare di sudare le proverbiali sette camicie per configurare il proprio Raspberry Pi come il più performante dei media server, la telecamera di sicurezza più simpatica del mondo, l’impianto di home theatre più cool del condominio, o come qualsiasi altra diavoleria.

Una volta arrivati ad una configurazione soddisfacente, può essere il caso di salvare il contenuto della scheda SD in un file immagine che potrà essere usato come copia di backup – nel caso in cui la scheda originale si corrompa o si guasti – oppure come sorgente da poter riversare su altre schede SD per i nostri amici o per il nostro prossimo Raspberry Pi.

Effettuando la copia byte-a-byte con il classico comando dd otterremo un file immagine corretto da ogni punto di vista, ma sensibilmente più grande del necessario: la dimensione del file immagine sarà la stessa della scheda SD (per una scheda da 8 GB avremo un file immagine di 8 GB, per una scheda da 16 GB un file immagine di 16 GB, e via discorrendo) anche se lo spazio effettivamente occupato dai dati è molto inferiore.

Avere un file immagine più grande del necessario può rivelarsi un inconveniente, per almeno due motivi:

  • Primo: spreco di spazio
    Faccio un esempio concreto: per una scheda SD con Raspbian appena installata lo spazio effettivamente occupato sarà nell’ordine di 1 GB. Con una scheda SD da 8 GB (un formato attualmente tra i più piccoli in commercio) ci saranno circa 7 GB di spazio inutilizzato che, però, verranno diligentemente copiati anche sul file immagine. E, sarete d’accordo con me, occupare sul disco del PC diversi GB per dello spazio vuoto è un vero peccato ;-).
  • Secondo: l’immagine non potrà essere riversata su schede SD più piccole
    Sempre facendo riferimento all’esempio precedente, se lo spazio occupato è di solo 1 GB, il contenuto della  scheda SD avrebbe potuto essere riversato in tutte le schede SD con tagli da 1 GB in su. Ma se la scheda originale (e quindi anche il corrispondente file immagine) ha una dimensione di 4, 8, 16 o più GB, questo non sarà possibile.

Ecco quindi un modo per creare file immagine più piccoli possibile, usando un PC con Linux. Io ho usato Ubuntu (nella versione 14.04, per la precisione) ma il procedimento è facilmente adattabile anche ad altre distribuzioni.

Installare il software necessario

L’unico programma extra da installare è GNOME Partition Editor (gparted, per gli amici) e lo si può installare con il comando:

$ sudo apt-get install gparted

Come suggerisce il nome, si tratta di un programma per modificare (creare, eliminare, ridimensionare, spostare, etc.) le partizioni dei dischi, ma anche di chiavette USB, schede SD, etc.

Ridimensionare la partizione sulla scheda SD

Dopo aver collegato la scheda SD, e prima di effettuare la clonazione con il comando dd, occorre:

  1. determinare il file di periferica che è stato assegnato alla scheda SD; questo si può fare dando un’occhiata all’output del comando
    $ sudo fdisk -l

    facendo riferimento alle dimensioni del dispositivo. Nel mio caso, si tratta di /dev/mmcblk0;

  2. smontare gli eventuali filesystem contenuti nella scheda SD e montati automaticamente dal sistema.
    Per vedere quali sono i filesystem montati attualmente si può dare, da terminale, il comando mount senza argomenti. Se nella lista visualizzata compaiono uno o più filesystem con il nome /dev/mmcblk0pn con n = 1, 2, etc. (o quale sia il device file della vostra scheda SD) allora, prima di proseguire, vanno smontati con i comandi:

    $ sudo umount /dev/mmcblk0p1
    $ sudo umount /dev/mmcblk0p2

    , etc.

  3. lanciare gparted;
  4. scegliere, dall’elenco dei dischi collegati, la scheda SD:
  5. selezionare la partizione principale (quella più grossa; di solito, nel caso del Raspberry Pi, si tratta dell’ultima partizione della scheda SD)
  6. cliccare sul pulsante ridimensiona:
    Clicca per ingrandire
  7. impostare la nuova dimensione trascinando la maniglia di destra (in modo da lasciare lo spazio non allocato dopo la partizione che si sta restringendo), lasciando comunque un po’ di spazio libero dentro la partizione (circa 150 MB di spazio libero):
    ridimensiona
  8. confermare le nuove impostazioni cliccando sul pulsante Ridimensiona/Sposta.
  9. Applicare le modifiche scegliendo la voce del menù Modifica->Applica le operazioni.

A questo punto gparted farà tutti i controlli e le operazioni necessarie, al termine dei quali presenterà un messaggio di successo o fallimento. Se tutto è andato bene, la partizione sulla scheda SD sarà stata ristretta in modo da avere uno spreco di spazio minimo (i 150 MB di cui sopra).

NOTA: in questa fase si può fare un tuning più raffinato anche delle altre partizioni della scheda SD.
Se, ad esempio, c’è molto spazio inutilizzato anche nella prima partizione, si potrà: a) restringere la prima partizione; b) spostare l’inizio della seconda partizione in modo da non lasciare spazio non allocato tra le due partizioni;  e c) restringere anche la seconda partizione. E così via se si hanno tre o più partizioni.
Io raccomando di lasciare almeno 100 MB di spazio libero per ogni partizione, altrimenti si rischia che un Raspberry Pi, avviato da quella scheda, non abbia sufficiente spazio libero per lavorare.

Una volta terminate con successo tutte le operazioni, chiudere gparted.

Determinare il numero di settori da copiare

A questo punto, per evitare di copiare sul file immagine tutta la scheda SD, ma invece copiare solamente lo spazio effettivamente occupato dalle partizioni, occorre determinare il settore finale dell’ultima partizione sulla scheda SD. Per fare questo si deve impartire il comando:

$ sudo fdisk -lu /dev/mmcblk0

Disk /dev/mmcblk0: 31.1 GB, 31104958464 bytes
4 testine, 16 settori/tracce, 949248 cilindri, totale 60751872 settori
Unità = settori di 1 * 512 = 512 byte
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identificativo disco: 0x00070785

Dispositivo Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      131071       61440    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          131072     7041023     3454976   83  Linux

Le grandezze sono espresse in settori di 512 byte ciascuno. Il numero che interessa è il settore finale dell’ultima partizione (nel mio caso, si tratta del numero 7041023).

A questo numero occorre aggiungere 1, perché i settori si incominciano a contare da 0 e, quindi, il settore con indice n è, in realtà, l’(n+1)-esimo. Dunque, i settori da 512 byte che devono essere copiati dalla scheda SD sono 7041024.

Creare il file immagine

Solo ora, dopo aver regolato la dimensione delle partizioni della scheda SD in modo da ottenere il minimo spreco di spazio, e aver determinato il numero di settori da copiare, si può passare alla vera e propria copia su file immagine.

Il comando da dare è:

$ sudo dd if=/dev/mmcblk0 of=rasperry_sd.img bs=512 count=7041024

, laddove si deve indicare il device file dell’intera scheda SD, e non quello di una singola partizione (nel mio caso, /dev/mmcblk0 e non /dev/mmcblk0p2). Il parametro bs rappresenta la dimensione, in byte, dei blocchi da copiare (che deve essere uguale alla dimensione dei settori visualizzata dal comando ‘fdisk’ di prima), mentre il parametro count è il numero dei blocchi da copiare (uguale al numero di settori calcolato in precedenza).

Dopo qualche minuto di apparente inattività, al ritorno del prompt dei comandi ci ritroveremo con il file immagine della scheda SD (raspberry_sd.img) nella cartella corrente.

Risistemare la scheda SD (epilogo)

Non ci scordiamo che le partizioni sulla scheda SD sono state ridotte alla dimensione minimale e che, in fondo alla scheda, c’è un sacco di spazio non allocato e, per adesso, inutilizzabile. Per riportare la scheda SD alla sua condizione originale, con l’ultima partizione che occupa tutto lo spazio disponibile, possiamo agire in due modi.

Il primo modo consiste nell’utilizzare nuovamente gparted sul PC, ma andando ad espandere l’ultima partizione, piuttosto che a restringerla.

Il secondo modo consiste nell’inserire la scheda SD nel Raspberry Pi, avviare, fare il login e lanciare il comando ‘sudo raspi-config’. Dal menù di raspi-config:
raspi-config
si deve scegliere la prima voce (quella che recita “Expand Filesystem”), premere Invio e richiedere di riavviare. Una volta riavviato, la nostra partizione principale occuperà nuovamente tutto lo spazio disponibile.

Annunci

4 Pensieri su &Idquo;Creare immagini di SD card per Raspberry Pi

  1. Buongiorno,
    mi da sempre il seguente errore:
    dd: error writing ‘/media/lubuntu/BOOT/rasperry_sd.img’: File too large
    8388608+0 records in
    8388607+0 records out
    4294967295 bytes (4.3 GB, 4.0 GiB) copied, 756.456 s, 5.7 MB/s
    Penso sia per il tipo di formattazione della scheda che consente la creazione di files con dimensione massima di 4,3GB, come posso fare se ho un’immagine da 6,5GB?
    Grazie
    Ronnie

    • Salve Ronnie. Da quello che hai scritto mi pare di capire che stai tentando di scrivere l’immagine come file all’interno di una delle partizioni (quella con label BOOT) di una scheda SD. Quello che, invece, dovresti fare è scrivere l’immagine sulla scheda SD nella sua interezza, usando come destinazione il file di periferica della scheda SD (qualcosa che assomiglia a /dev/mmcblk0). Stai molto attento perché è comunque un’operazione distruttiva: tutti i dati attualmente presenti sul dispositivo di destinazione (la tua scheda SD) verranno cancellati. Quindi, prima di fare qualsiasi cosa, sii ben certo che il file di destinazione che stai usando sia quello giusto: non ci vuole niente a sovrascrivere il disco del proprio PC o a sovrascrivere qualche altro disco esterno attaccato al PC.

  2. Grazie della risposta, veramente volevo creare un’immagine ridotta da trasportare più facilmente su altre schede sd da 8 o 16 GB partendo da una montata su scheda da 16GB e ridotta con Gparted come indicato in questa pagina. Il problema è la formattazione FAT32 che limita i files a 4,3GB, ora provo con la formattazione NTFS.
    Grazie
    Ronnie

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...