Converti l'immagine di una partizione in immagine di un disco con la tabella delle partizioni


20

Ho un'immagine di una partizione esistente generata con dd if=/dev/sdXN of=image.bin. Ora voglio usare questa immagine come base per una macchina virtuale. So come convertire l'immagine in un formato utilizzabile da VirtualBox.

Il problema è che l'immagine "disco" è in realtà solo l'immagine di una partizione e quindi non contiene un MBR o una tabella delle partizioni. Questo rende molto difficile l'avvio della VM.

Esiste un modo semplice, data l'immagine di una partizione, per creare un'immagine del disco corretta, inclusa una tabella delle partizioni?

Risposte:


13

Puoi farlo sul computer host. La maggior parte degli strumenti come fdiskopererà su file e kpartxti dà accesso a partizioni in un file.

  1. Crea una nuova immagine sparsa da 100GiB vuota (rendila leggermente più grande della dimensione dell'immagine della partizione)

    dd if=/dev/zero of=myvm.img bs=1G count=0 seek=100
    
  2. Partiziona il file immagine con fdisk

    fdisk myvm.img
    
  3. Rendere disponibili le partizioni nel file immagine è singoli dispositivi

    sudo kpartx -a myvm.img
    
  4. Copia l'immagine della partizione nella partizione

    sudo cp image.bin /dev/mapper/loop0p1
    
  5. Estendi il filesystem per riempire l'intera partizione

    sudo resize2fs /dev/mapper/loop0p1
    
  6. Chiudi le partizioni

    sudo kpartx -d myvm.img
    
  7. Smontare il dispositivo di loopback

    sudo losetup -D
    

Ciò non renderebbe la partizione creata nell'immagine "non corrispondente" alla lunghezza della partizione acquisita? E c'è un modo per risolverlo? E un gestore di filesystem "abbastanza intelligente" sarebbe in grado di dire che non utilizza l'intera dimensione della partizione e di espandersi per adattarsi?
assassino del

@killermist Risposta aggiornata.
mgorven,

Questa è una buona risposta Conosci un modo per evitare di copiare l'intero processo?
Mika Fischer,

@MikaFischer Sfortunatamente no, perché la tabella delle partizioni deve esistere prima della partizione e non conosco alcun meccanismo per anteporre i dati a un file.
mgorven,

Penso che la risposta di Harun sia migliore perché è facile da fare e può essere scritta.
philcolbourn,

9

Sono sicuro che il problema originale è stato risolto molto tempo fa, ma per chiunque abbia un problema simile:

Un modo per evitare di copiare l'intera immagine sarebbe quello di creare un'immagine in formato .vmdk che faccia riferimento a file di estensione separati per la tabella delle partizioni e per i contenuti della partizione.

Ho questo frammento in giro in un file .vmdk da un test che ho fatto qualche tempo fa:

RW 63 FLAT "parttable.bin" 0
RW 585937489 FLAT "partition-image.bin" 63

Ciò significa che i 63 settori a partire dall'offset 0 vengono letti dal file non elaborato "parttable.bin", ma il settore 63 e successivi provengono dal dump della partizione non elaborata "partition-image.bin". (Naturalmente, sostituisci 63 con l'offset effettivo alla prima partizione, di solito 2048 in questi giorni).

Il risultato finale è che, dall'interno di VBox, sembra che tu abbia anteposto la tabella delle partizioni alla parte anteriore dell'immagine della partizione, senza dover eseguire la lunga operazione di copia.

Partizionare l'unità dall'interno della VM e, se si ottengono gli offset corretti, si dovrebbe vedere il contenuto dell'immagine della partizione all'interno della partizione appena creata.


2
Penso che il '63' sulla seconda riga debba essere 0 se partition-image.bin è un'immagine di partizione. Ho appena fatto una cosa del genere e avevo bisogno di impostare questo offset nel file immagine della partizione su zero. philatwarrimoo.blogspot.com.au/2014/01/…
philcolbourn,


Genio. Ho dovuto fare solo questo per usare una partizione Windows per una VM su un host Linux, e questa è l'unica cosa che ha funzionato, usando i passaggi di @philcolbourn: superuser.com/a/804396/93066
bmaupin

Cosa dovrebbe essere nel resto del file vmdk?
gozzilli,

1
@gozzilli Il resto del file è un mucchio di dettagli come numeri di versione del file, tipo di adattatore del disco, uuidi e geometria del disco. Non so come scrivere quei pezzi. Vorrei solo usare uno strumento per creare un vmdk che punta all'immagine del disco e quindi modificare solo le righe che descrivono da dove ottenere l'intestazione della partizione aggiuntiva.
Harun,

3

Problema interessante. Ecco cosa farei:

  1. Creare la macchina virtuale con un disco di dimensioni adeguate, quindi avviarlo da un CD di ripristino.
  2. Ottieni l'accesso all'immagine del disco esistente in qualche modo (nfs, cifs, ecc.).
  3. Crea le partizioni necessarie sul disco locale della VM.
  4. Utilizzare dd per scrivere l'immagine della partizione nella partizione sul disco VM.

Al termine, dovrai aggiornare il tuo caricatore di avvio. Supponendo che tu stia utilizzando GRUB, monta la partizione appena scritta, quindi chroot in essa ed esegui update-grub(fai attenzione, potrebbe essere necessario modificare i suoi file di configurazione prima che funzioni correttamente).

In bocca al lupo!


2

Puoi ridimensionare il filesystem in atto, con GParted.

Crea l'immagine di prova:

dd if=/dev/zero of=extfs bs=1M count=20
mkfs.ext4 extfs

Non sto usando resize2fs, perché ridimensiona il file, piuttosto che lasciare spazio libero.

sudo losetup /dev/loop0 extfs
sudo ln -s /dev/loop0 /dev/loop0p1 # needed for GParted to be able to resize it
gksudo gparted /dev/loop0

1 MB gratuito all'inizio.

sudo rm /dev/loop0p1
sudo losetup -d /dev/loop0

Infine, crea la tabella delle partizioni.

fdisk extfs

Impostare il primo settore su 2048 (2048 settori * 512 B / settore = 1 MB), l'ultimo settore predefinito (ovvero la fine dell'immagine).


1

Personalmente preferisco aggiungere usando dd.

Presumo settori a 512 byte qui. Potrebbe esserci un caso per settori a 2048 byte, quindi basta scambiare i numeri e fare i conti.

In ogni caso sto usando un file di test da 512 MB, ad esempio:

dd if=/dev/zero of=testfs.img bs=512 count=1M mkfs.ext4 testfs.img

MBR

Comporre l'immagine

Personalmente preferisco aggiungere il primo MB (2048 settori) all'inizio:

dd if=testfs.img skip=2048 bs=512 of=full.img

Finalmente eseguo fdisk per creare la tabella delle partizioni (o copia nella tua), ho creato 1 partizione usando i valori predefiniti.

Verifica

Per verificare, creare partizioni di loop e rilevamento automatico:

sudo losetup -fP full.img

Ed esegui filesul dispositivo di loopback partizionato risultante:

sudo file -s /dev/loop2p1 /dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files)

GPT

Comporre l'immagine

Personalmente preferisco aggiungere i primi MB (2048 settori, poiché gdisk imposterà automaticamente questo numero poiché è 1 MB allineato) all'inizio per il MBR iniziale e 34 settori alla fine (o 2048 per un MB completo) per la fine GPT (il settore finale può essere diverso). L'omissione della fine GPT potrebbe perdere i dati:

dd if=testfs.img skip=2048 bs=512 of=full.img dd if=/dev/zero seek=1050624 bs=512 of=full.img count=34

Infine eseguo gdisk per creare la tabella delle partizioni (o copiarla nella tua), ho creato 1 partizione usando i valori predefiniti.

Verifica

Per verificare, creare partizioni di loop e rilevamento automatico:

sudo losetup -fP full.img

Ed esegui filesul dispositivo di loopback partizionato risultante:

sudo file -s /dev/loop2p1 /dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files) Questo metodo non consente di indovinare, ridimensionare o allineare manualmente.


Come trovare il settore finale dell'immagine in gpt
Anwar,

Quando corro questo sudo file -s /dev/loop11p1ho /dev/loop11p1: data. Che in precedenza era un filesystem ext4. E il risultante full.img è più piccolo. Penso che tu abbia la soluzione invertita.
Anwar,

Penso che intendi seek=2048in questo comando dd if = testfs.img skip = 2048 bs = 512 of = full.img
Anwar
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.