Come creare un'immagine della scheda SD, senza una scheda SD?


2

Abbiamo un processo con script che crea un'installazione integrata Debian Jessesu una scheda SD. Le parti rilevanti della sceneggiatura si presentano così:

export DISK=/dev/sdb
umount ${DISK}1   # make sure no partitions mounted at the moment
umount ${DISK}2   # ditto
dd if=/dev/zero of=${DISK} bs=1M count=16   # zero partition table zone, overkill
sfdisk --in-order --Linux --unit M ${DISK} <<-__EOF__    # make partitions
    1,48,0xE,*
    ,,,-
__EOF__

mkfs.vfat -F 16 ${DISK}1 -n boot    # install file systems
mkfs.ext4 ${DISK}2 -L rootfs

Successivamente, l'auto mounter sembra avviarsi e rimontare la scheda SD, quindi possiamo fare cose come:

cp -v ${DIR}/u-boot/spl/u-boot-spl.bin /media/$username/boot/BOOT.BIN
cp -v ${DIR}/u-boot/u-boot.img /media/$username/boot/
cp -v ${DIR}/u-boot/uEnv.txt /media/$username/boot/
rsync -axHAX --progress ${DIR}/jessieRoot/ /media/$username/rootfs/

Dopo che uno di noi lo fa, allora possiamo usare ddper copiare il contenuto della carta e condividerlo con l'altro, facendo più carte SD usando dd.

IL PROBLEMA con questo è duplice: 1) In questo momento è molto specifico per Ubuntu / macchina (presuppone che la carta sia sdb, ecc. 2) Ha bisogno di una carta reale, quindi non si presta a una macchina di costruzione.

C'è un modo per fare quanto sopra senza una carta?

Ho provato a usare ddsolo per creare un file 8G e poi ho eseguito sfdisksu quello (tutto è un file, giusto?) E quella parte ha funzionato. Ma non è chiaro come avrei eseguito le mkfsparti per funzionare, sembrano voler lavorare su file di dispositivo a blocchi, non su regioni secondarie di un singolo file in cui è incorporata una tabella delle partizioni. E poi ho il problema di montarlo. Suppongo di usare un po 'di incantesimo mount -o loop, ma ancora una volta, non sono sicuro di come farlo nella sottoregione del file di immagine virtuale, l'ho sempre appena scaricato con i file .iso.

(Sentiti libero di essere pedante, non sono un esperto (ovviamente) di questo tipo di cose. Ne ottengo alcune, e altre parti sembrano un po 'magiche ...)

Risposte:


4

Penso che questa pagina abbia tutto ciò di cui hai bisogno.

  • invece di sdb usa il dispositivo loopback

  • invece di una vera carta usa il filesystem virtuale

  • sei sulla buona strada usando dd per creare un file per il filesystem virtuale.

  • sei sulla strada giusta usando il dispositivo loopback. Il trucco sta montando il dispositivo di loopback negli offset in cui si trovano le partizioni.

Questo è l'articolo

Un filesystem virtuale è un filesystem che esiste in un file, che a sua volta esiste su un disco fisico. Ci sono molte cose fantastiche che puoi fare con i file system virtuali; il motivo per cui stavo scherzando con loro era configurare una macchina virtuale su un host Linux. Altri usi includono la crittografia di filesystem senza crittografia di interi dischi; File Vault di Mac OS X crittografa le directory home degli utenti in questo modo. Forse sei andato avanti e hai creato una partizione gigante e poi hai realizzato, per un motivo o per l'altro, che vuoi partizioni multiple! I filesystem virtuali possono aiutare (in una certa misura) anche in questo.

Quindi, come si crea un file system virtuale? Facile. La prima cosa che devi fare è creare un file per il filesystem in cui vivere. Qui è dove inizia a comparire 'dd'. Considera, ad esempio, il seguente comando:

dd if = / dev / zero of = ~ / myFileSystem.img bs = 1024 count = 1048576

Questo comando leggerà 1.048.576 blocchi da / dev / zero e li scriverà in ~ / myFileSystem.img; ogni blocco ha 1024 byte, risultando in un file da 1 gigabyte contenente tutti gli zero. I valori effettivi che usi per la dimensione dei blocchi (bs) e il conteggio non sono molto importanti, la chiave è di capire bene la tua matematica: bs * count = imageSize.

Quindi ora hai il tuo file; grande. È tempo di creare un file system! questa parte è ancora più semplice ... creeremo un filesystem EXT2, usando il seguente comando:

mke2fs myFileSystem.img

È possibile che venga visualizzato un messaggio di avviso in cui si dice che myFileSystem.img non è un dispositivo a blocchi, si desidera procedere? Ci arriveremo tra un secondo, per ora, vai avanti e dici di sì. Tutto dovrebbe andare liscio, sembrerà come se avessi creato un filesystem su una vera unità disco. Ora hai un file system virtuale! L'unica cosa che resta da fare è montare il tuo filesystem in modo che tu possa accedervi ...

mkdir / mnt / virtual

mount -o loop ~ / myFileSystem.img / mnt / virtual

Ora qualsiasi file che inserisci in / mnt / virtual viene effettivamente inserito direttamente in myFileSystem.img! Non è stato facile?

Fantastico. Ora che sai come creare un filesytsem virtuale, perché non creare un po 'l'immagine del disco virtuale? Qual è la differenza che chiedi? Un'immagine del disco avrà una tabella delle partizioni che definisce un numero di partizioni e ogni partizione contiene il proprio filesystem; quindi un filesystem virtuale è essenzialmente una "partizione virtuale" di un'immagine di disco virtuale; l'immagine del disco virtuale contiene più filesystem virtuali e una tabella delle partizioni virtuali che descrive dove si trovano i limiti di ciascuna partizione.

La creazione di un'immagine del disco virtuale inizia allo stesso modo; la prima cosa che ti serve è un grosso file vuoto, appena creato sopra. Questa volta, invece di creare un file system, vorremmo partizionare il file usando fdisk. Per rendere le cose un po 'più belle, però, inseriremo dispositivi di loopback nel mix. Dovresti assicurarti di avere il supporto del dispositivo di loopback abilitato nel tuo kernel (la maggior parte delle distribuzioni lo fanno di default; ma se sei un kernel compilando linux junky, potresti voler controllare). Quindi creeremo un file di grandi dimensioni e lo allegheremo a un dispositivo di loopback, come segue:

dd if = / dev / zero of = ~ / myDisk.img bs = 1024 count = 1048576

losetup / dev / loop0 ~ / myDisk.img

Collegando l'immagine del disco al dispositivo di loopback, possiamo usare / dev / loop0 nello stesso modo in cui useremmo ~ / myDisk.img; la differenza principale è che / dev / loop0 è un cosiddetto "dispositivo a blocchi". Dovresti chiedere a qualcuno con più esperienza di quanta ne abbia io di preciso, ma quello che so è che le utilità del filesystem funzionano meglio con i dispositivi a blocchi piuttosto che con i file flat. Inoltre, è divertente.

Bene, abbiamo un grosso file vuoto allegato a un dispositivo di loopback (/ dev / loop0) ... ora è il momento di creare partizioni nell'immagine del disco. Per fare ciò, eseguiremo fdisk sul nostro dispositivo di loopback:

fdisk / dev / loop0

Consente di creare tre partizioni ... se stai seguendo questo, dovresti già avere familiarità con fdisk, quindi vai avanti e crea quanto segue: Avvio dispositivo Fine blocchi Blocchi ID Sistema

/ dev / loop0p1 1 17 136521 83 Linux

/ dev / loop0p2 18 80 506047+ 82 Linux swap

/ dev / loop0p3 81 130 401625 83 Linux

Dopo aver effettuato le partizioni, scrivi le modifiche e esci da fdisk. Quello che dovremo fare dopo è creare filesystem su ogni partizione. Ricordi quanto era facile tornare con i filesystem virtuali? Non molto più ...

Non preoccuparsi però ... il problema è che "mkfs" non può "raggiungere" l'immagine del nostro disco virtuale e creare un filesystem solo su una singola partizione. Infatti, se ci provi, probabilmente finirai per cancellare la nostra immagine del disco virtuale e dover eseguire nuovamente fdisk. Quindi cosa fare ... cosa fare ?? Dispositivi di loopback in soccorso. Quello che faremo è collegare un dispositivo di loopback al file myDisk.img negli offset specifici in cui inizia ogni partizione.

È utile quindi guardare le partizioni in termini di blocchi. Eseguire il comando seguente:

fdisk -ul / dev / loop0

dovrebbe apparire (si spera esattamente) così:

Disco / dev / loop0: 1073 MB, 1073741824 byte

255 teste, 63 settori / binario, 130 cilindri, totale 2097152 settori

Unità = settori di 1 * 512 = 512 byte

  Device Boot      Start         End      Blocks   Id  System

/ dev / loop0p1 63 273104 136521 83 Linux

/ dev / loop0p2 273105 1285199 506047+ 82 Linux swap

/ dev / loop0p3 1285200 2088449 401625 83 Linux

Questi numeri sono importanti per la matematica ... useremo il comando losetup come abbiamo fatto prima, solo che questa volta arriveremo specificamente all'inizio di ciascuna delle tre partizioni. losetup accetta gli offset come numero di byte da saltare all'inizio del file. L'output di fdisk -ul / dev / loop0 ci mostra che la prima partizione inizia dal blocco 63 e che ogni blocco è di 512 byte. Quindi la partizione 1 inizia al byte 32.256

losetup -o 32256 / dev / loop1 / dev / loop0

Quel comando raggiunge 32.256 byte in / dev / loop0 e lo monta su / dev / loop1. Ricorda che dal momento che / dev / loop0 è allegato al file myDisk.img, questo equivale a raggiungere 32.256 byte in quel file ... segui? Ok bene. Stessa logica per le partizioni 2 e 3:

losetup -o 139829760 / dev / loop2 / dev / loop0

losetup -o 658022400 / dev / loop3 / dev / loop0

Quindi ora abbiamo quattro dispositivi loopback impostati; / dev / loop0 è allegato al file myDisk.img. / dev / loop1 è la prima partizione del disco virtuale rappresentata da / dev / loop0; / dev / loop2 è il 2 ° e / dev / loop3 è il 3 °.

Ora è finalmente il momento di creare quei file system! Questo è ora facile come creare un normale filesystem, dato che è tutto ciò che stiamo facendo. Ricorda, mkfs non sa che il dispositivo non è un dispositivo fisico! Realizzeremo tre tipi di file system, un file system ext2 per la partizione 1, un file system di scambio per la partizione 2 e un file system XFS per la partizione 3:

mkfs / dev / loop1

mkswap / dev / loop2

mkfs.xfs / dev / loop3

Poiché loop1, loop2 e loop3 sono collegati direttamente a loop0 e loop0 è ~ / myDisk.img, tutto ciò che abbiamo appena fatto su loop1, loop2 e loop3 ha influenzato direttamente myDisk.img! Ora possiamo montare / dev / loop3, ad esempio, su / mnt / virtual come file system XFS e usarlo come un normale file system!

Quindi spero che tu l'abbia trovato utile ... puoi fare cose piuttosto ordinate con i file system virtuali e le immagini del disco virtuale; e i dispositivi loopback fanno la differenza per rendere le cose più fluide.


1

La risposta accettata a questo problema è di fatto corretta, ma - mentre scrivo questo cinque anni dopo - esiste un approccio più semplice che dovrebbe funzionare per la maggior parte delle persone. La manipolazione manuale degli offset e la creazione di più dispositivi di loopback non è, in generale, più necessaria. L'arma segreta per la creazione di immagini di filesystem virtuali nella maggior parte delle distribuzioni Linux al giorno d'oggi è l' -Popzione per il comando losetup :

-P, --partscan
              Force the kernel to scan the partition table on a newly created loop device.

Fondamentalmente puoi pensare all'opzione -P"fingi che questo file sia un disco ". Un esempio dovrebbe chiarirlo. Questo comando crea un file di immagine da 4 GB pieno di zeri:

$ dd if=/dev/zero of=./sdcard.img bs=1024 count=4194304
4194304+0 records in
4194304+0 records out
4294967296 bytes (4.3 GB, 4.0 GiB) copied, 39.7914 s, 108 MB/s

Il comando seguente associa il primo dispositivo di loopback disponibile a questo file e lo fa in modo che il kernel interpreti i byte all'inizio come una tabella delle partizioni :

$ sudo losetup -fP ./sdcard.img

$ losetup --list
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /home/evadeflow/Desktop/sdcard.img

Può sembrare una piccola cosa, ma passare -Psignifica che ora puoi usare strumenti come fdiskpartizionare il 'disco' mappato tramite /dev/loop0. Qui creo una partizione da 128 MB all'inizio e una seconda partizione per ospitare tutto lo spazio rimanente:

$ sudo fdisk /dev/loop0
GNU Fdisk 1.3.0a
Copyright (C) 1998 - 2006 Free Software Foundation, Inc.
...
Using /dev/loop0
Command (m for help): p

Disk /dev/loop0: 4 GB, 4293596160 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

     Device Boot      Start         End      Blocks   Id  System
Command (m for help): n
Partition type
   e   extended
   p   primary partition (1-4)
p
First cylinder  (default 0cyl):
Last cylinder or +size or +sizeMB or +sizeKB  (default 521cyl): +128M
Command (m for help): n
Partition type
   e   extended
   p   primary partition (1-4)
p
First cylinder  (default 15cyl):
Last cylinder or +size or +sizeMB or +sizeKB  (default 521cyl):
Command (m for help): p

Disk /dev/loop0: 4 GB, 4293596160 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

     Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1               1          16      128488   83  Linux
Warning: Partition 1 does not end on cylinder boundary.
/dev/loop0p2              16         522     4064445   83  Linux
Command (m for help): w
Information: Don't forget to update /etc/fstab, if necessary.


Writing all changes to /dev/loop0.

Nota che Linux ha creato nuovi dispositivi di loopback per tuo conto per ciascuna delle due partizioni: /dev/loop0p1e /dev/loop0p2. Puoi vedere la loro relazione /dev/loopeseguendo lsblk:

$ lsblk /dev/loop0
NAME      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0       7:0    0     4G  0 loop
├─loop0p1 259:2    0 122.1M  0 loop
└─loop0p2 259:3    0   3.9G  0 loop

Per popolare queste partizioni, è possibile creare filesystem utilizzando i dispositivi di loopback /dev/loop0p1e /dev/loop0p2quindi semplicemente montarli e copiare i file nei punti di mount. Il processo è simile al seguente:

$ sudo mkfs.ext4 /dev/loop0p1
$ sudo mkfs.ext4 /dev/loop0p2
$ mkdir part1-stuff part2-stuff
$ sudo mount /dev/loop0p1 ./part1-stuff
$ sudo mount /dev/loop0p2 ./part2-stuff
$ cp /stuff-source/part1/* ./part1-stuff
$ cp /stuff-source/part2/* ./part2-stuff
$ sudo umount ./part1-stuff
$ sudo umount ./part2-stuff

Una volta che le partizioni sembrano nel modo desiderato, è sufficiente 'staccare' /dev/loop0dal file usando:

$ sudo losetup -d /dev/loop0

Nota che questo distacca anche i dispositivi /dev/loop0p1e /dev/loop0p2che Linux ha creato per te.

Quindi, nel complesso, la risposta accettata rimane corretta al 100% e fornisce preziose informazioni su ciò che accade sotto le coperte. Ma se la tua distribuzione losetupsupporta l' -Popzione, puoi semplicemente usare gli strumenti di partizionamento standard e lasciare che Linux gestisca la creazione (e la cancellazione ) del "sub-dispositivo" del ciclo per ogni partizione.


La risposta accettata dovrebbe essere questa!
Saad Malik,
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.