Come ridimensionare un file di immagine prima di scrivere sulla scheda SD?


13

Ho provato a creare una nuova immagine Raspbian con un kernel diverso (con supporto CAN) e con Python 3.3 installato. Invece di fare tutto questo sul Raspberry Pi, ho pensato che sarebbe stato interessante farlo sul computer (seguendo queste istruzioni ). Tuttavia, una volta che l'immagine è stata montata e pronta per l'uso, ho esaurito rapidamente lo spazio su disco. Presumo che ciò sia dovuto al fatto che l'immagine è dimensionata solo per essere sufficientemente grande con l'aspettativa che l'utente ridimensioni il file system una volta che è stato scritto su una scheda SD.

È possibile ridimensionare l'immagine e il file system prima di scriverlo sulla scheda SD in modo da poter personalizzare ulteriormente senza esaurire lo spazio?


Questa domanda probabilmente ti aiuterà.
Jivings,

1
@Jivings: tutte queste risposte descrivono come ridimensionare l'immagine dopo che è stata scritta sulla scheda SD. So come farlo; Sono interessato a come ridimensionare l'immagine prima di scriverla sulla scheda SD.
DrAl,

Risposte:


7

Ecco come ridimensionare un file di immagine non elaborato. So che sembra stupidamente semplicistico, ma funzionerà.

Crea un'immagine vuota, delle dimensioni che desideri espandere l'originale (nel mio esempio uso 5 GB);

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

Aggiungi questo all'immagine originale:

cat /path/to/temp_image >> /path/to/rasperrypi.img

Ridimensiona il filesystem che risiede alla fine del disco (di solito questo è quello che vuoi più grande):

resize2fs -f /path/to/rasperrypi.img

Fatto! Il disco ora dovrebbe essere più grande di 5 GB!


Sembra perfetto, grazie: lo proverò stasera.
DrAl,

5
Ho appena provato questo e quando arrivo alla fase resize2fs (dopo aver aggiunto 1 GB al file), ottengo "Numero magico errato in superblocco mentre provo ad aprire il 2012-12-16-wheezy-raspbian.img Impossibile" t trova un superblocco di filesystem valido. " Qualche suggerimento su cosa sto facendo di sbagliato?
DrAl,

Mi sembra che sia un problema con il fatto che sto cercando di ridimensionare l'intera immagine (l'equivalente di / dev / sda) anziché la partizione (l'equivalente di / dev / sda2). Tuttavia, potrei sbagliarmi e ho provato alcune altre cose senza successo (come ridimensionare la partizione con fdisk, che sembra funzionare ma non mi aiuta a ridimensionare il file system).
DrAl,

3
Va bene, ho trovato la risposta all'ultimo bit con un po 'di googling: avevo bisogno di creare un dispositivo loop che punta alla partizione nell'immagine. L'ho fatto ottenendo il settore iniziale della seconda partizione fdisk -l file.img(era 122880) e poi losetup --offset $((122880 * 512)) /dev/loop0 file.img. Potrei quindi utilizzare resize2fssu /dev/loop0e riordinare con losetup -d /dev/loop0. Se aggiorni la tua risposta per includerla, la segnerò come risposta accettata. Grazie per avermi indicato nella giusta direzione.
DrAl,

1
@DrAl Ehi, ho provato la tua soluzione usando resize2fson /dev/loop0ma ho ottenuto un panico del kernel all'avvio dicendo che la dimensione del superblocco e la dimensione della partizione non corrispondono: The filesystem size (according to the superblock) is 483840 blocks The physical size of the device is 458240 blocksTi sei imbattuto in qualcosa del genere?
GuySoft,

4

Questa è una sintesi delle risposte sopra e altrove che ha funzionato per me - esegui il backup della tua immagine in caso di errore:

Innanzitutto ingrandisci il file di immagine (qui stiamo aggiungendo 1 GB alla fine):

truncate -s +1G ./image.img

Quindi mappa l'intera immagine come un dispositivo loop in modo da poter colpire la tabella delle partizioni

sudo losetup /dev/loop0 ./image.img

Per riferimento futuro, dump:

sudo fdisk -l /dev/loop0

L'output è simile a:

Disk /dev/loop0: 2962 MB, 2962227200 bytes
255 heads, 63 sectors/track, 360 cylinders, total 5785600 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: 0x000c4661

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/loop0p2          122880     5785599     2831360   83  Linux

Ora rifaremo l'ultima partizione eliminandola, quindi ricrearla nella stessa posizione iniziale, stesso tipo ma diversa posizione finale. Quindi prendi nota della colonna "Start" per loop0p2 (partizione 2 - la partizione Linux) - la useremo più tardi - qui è 122880.

sudo fdisk /dev/loop0

Inserisci quanto segue - sono sicuri da inserire - non succede nulla di permanente finché non leggi la mia spiegazione che segue:

  1. p
  2. d
  3. 2
  4. n
  5. p
  6. 2
  7. 122880
  8. basta premere invio per accettare il valore predefinito
  9. p

Passaggio 1: stampa la tabella corrente. Passaggi 2-3: eliminare la partizione 2, Passaggi 4-8: ricreare la partizione 2 con il nuovo punto finale (l'impostazione predefinita è la fine dell'immagine), Passaggio 9: stampare la nuova tabella.

Supponendo che la tabella appena stampata sia identica alla tabella originale ad eccezione del valore Fine e del valore Blocchi (ovvero la dimensione è stata modificata), sei pronto per eseguire il commit.

Invio wper confermare la modifica, quindi entra qper uscire.

Puoi eliminare quel dispositivo di loopback, ne faremo un altro per la seconda partizione. Ricorda l'offset iniziale che hai notato e usato sopra - lo useremo di nuovo:

sudo losetup -d /dev/loop0     # delete the old loop setup
sudo losetup -o $((122880*512)) /dev/loop0 ./image.img

Ciò creerà una nuova mappatura sul /dev/loop0puntamento solo alla partizione 2 - per riferimento 512 è la dimensione del settore che puoi vedere nel primo fdiskoutput.

Ora ridimensiona la partizione per riempire lo spazio disponibile:

sudo e2fsck -f /dev/loop0
sudo resize2fs /dev/loop0

Fatto - ora ripulisci:

sudo losetup -d /dev/loop0

grazie ... le istruzioni sopra non hanno funzionato per me ma questo ha funzionato. Ho ricevuto alcuni avvisi quando scrivevo la tabella delle partizioni: `` `Comando (m per aiuto): w La tabella delle partizioni è stata modificata. Chiamata ioctl () per rileggere la tabella delle partizioni. Rileggere la tabella delle partizioni non riuscita .: argomento non valido Il kernel utilizza ancora la vecchia tabella. La nuova tabella verrà utilizzata al successivo riavvio o dopo aver eseguito partprobe (8) o kpartx (8). `` L'ho appena ignorato e andava bene.
StFS

Eccellente! Sei l'unico che ha fatto la risposta corretta! Grazie.
yushulx,

3

Per quelli che hanno Oracle VM VirtualBox in esecuzione è abbastanza facile.

Su un computer Windows le cose vanno come segue:

input.imgè qui l'immagine di cui ridurre le dimensioni ed output.imgè l'immagine finale, in questo esempio definita 7000 MB di dimensione.

ECHO "========================================================================="
ECHO "input.img => output.img"

ECHO "========================================================================="

DEL  input.vdi

DEL  output.vdi

DEL  output.img

ECHO "========================================================================="
"C:\Program Files\Oracle\VirtualBox\VBoxManage" convertfromraw input.img input.vdi -format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" createhd --filename output.vdi --size 7000 --format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd input.vdi output.vdi --existing

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd output.vdi output.img --format RAW

Spero che questo aiuti un po '.


Grazie per questa soluzione, molto furbo. È l'unico che sono stato in grado di trovare che è gratuito e funziona perfettamente su Windows. Ho riscontrato alcuni problemi con le schede da 16 GB che non avevano le stesse dimensioni e che avevo bisogno di ridimensionare la mia immagine.
Josh,

Ho avuto un errore di panico nel kernel. Kernel panic - not syncing: VFS: Unable to mount rootfs on unknown-block(179,2)
JPX

Nota che questo sta troncando l'immagine - perderai i dati se è passato oltre il segno di 7000 MB - i comandi non avvisano o si lamentano.
Mike Redrobe,

2

Ecco come ridimensionare un file di immagine non elaborato. So che sembra stupidamente semplicistico, ma funzionerà.

Crea un'immagine vuota, delle dimensioni che desideri espandere l'originale (nel mio esempio uso 5 GB);

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

Aggiungi questo all'immagine originale:

cat /path/to/temp_image >> /path/to/rpi.img

Il prossimo è ridimensionare la partizione e il filesystem. Innanzitutto, ottieni l'offset della partizione;

fdisk -l /path/to/rpi.img

Risultati in una tabella come questa:

Device    Boot   Start      End   Sectors   Size  Id  Type
rpi.img1          8192   122879    114688    56M   c  W95 FAT32 (LBA)
rpi.img2       1122880  8447999   8325120     4G  83  Linux

Nota l'offset iniziale della seconda partizione

losetup --offset $((122880 * 512)) /dev/loop0 /path/to/rpi.img
e2fsck -f /dev/loop0
resize2fs -f /dev/loop0

Infine smonta / dev / loop

losetup -d /dev/loop0

Fatto! Il disco ora dovrebbe essere più grande di 5 GB!

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.