Editar (1 e 2):

Editar (1 e 2):

Editar (1 e 2):

Clonei meu sistema operacional em funcionamento (desligado, HD montado em unidade USB,

> dd if=/dev/sdc1 of=/data/system.img

O SSD original é o seguinte:

> sfdisk -d /dev/sdc
# partition table of /dev/sdc
unit: sectors

/dev/sdc1 : start=       63, size= 92164842, Id=83
/dev/sdc2 : start=        0, size=        0, Id= 0
/dev/sdc3 : start=        0, size=        0, Id= 0
/dev/sdc4 : start= 92164905, size=884603160, Id= 5
/dev/sdc5 : start= 92164968, size= 33559722, Id=82
/dev/sdc6 : start=125724753, size=851043312, Id=83

Para criar uma VM apenas com a primeira partição, me inspirei no seguinte artigo:Notas técnicas: converta uma imagem de partição em uma imagem de disco inicializável.

Eu reconstruí uma imagem de disco completa:

> dd if=/dev/zero of=d.img count=1 bs=1MiB

Para começar com um cabeçalho de sistema moderno normal (começando com uma folha em branco com 2.048 blocos de 512 bytes) - mas ao contrário do meu sistema antigo, que tinha apenas um bloco de 512 bytes.

> pv system.img >> d.img # to paste sdc1 onto that header
> file d.img 
d.img: data
> fdisk d.img # to initialise the header suitably (create the partition)

recriar a partição (n (+todos os padrões, disse não à remoção da assinatura ext4 existente), a (tornar inicializável), w)

> file d.img
d.img: DOS/MBR boot sector; partition 1 : ID=0x83, active, start-CHS \
(0x0,32,33), end-CHS (0x275,145,28), startsector 2048, 92364800 sectors
> cp d.img e.img # take a backup
> file e.img 
e.img: DOS/MBR boot sector; partition 1 : ID=0x83, active, start-CHS \
(0x0,32,33), end-CHS (0x275,145,28), startsector 2048, 92364800 sectors

> losetup -f -P d.img
> losetup -l
/dev/loop4          0      0         0  0 /data/d.img         0     512
> blkid
/dev/loop4: PTUUID="55733c83" PTTYPE="dos"
/dev/loop4p1: UUID="437b9924-b81d-4054-b89e-b1ce0cf2a2c7" TYPE="ext4" PTTYPE="dos" PARTUUID="55733c83-01"
> mkdir d
> mount /dev/loop4p1 d/
> ll d
> mount --bind /dev d/dev
> mount --bind /sys d/sys
> mount --bind /proc d/proc
> chroot d
> ls -al /boot/grub
> less /boot/grub/grub.cfg
<...>
insmod ext2
set root='(hd0,1)'
search --no-floppy --fs-uuid --set 437b9924-b81d-4054-b89e-b1ce0cf2a2c7
<...>
> grub-install /dev/loop4
Installation finished. No error reported.
> vi etc/fstab
# uncomment swap and /data, just keep the root partition (which includes /boot)
> exit # come out of the chroot environment
> umount d/sys
> umount d/proc
> umount d/dev
> umount d/
> losetup -d /dev/loop4
> qemu-img convert -f raw -O qcow2 d.img d.qcow2

Definitivamente posso ver a imagem, mas de alguma forma o GRUB no qemu não consegue ver a partição:

> qemu-system-x86_64 d.qcow2

Pára em grub_rescue, informando que não reconhece o UUID acima, e o que posso ver é:

> ls
(hd0) (fd0)

Uma coisa que fiz diferente do artigo que me inspirou é usar o local (antigo) grub-install(no chroot), em vez do sistema do host. E verificar o 'arquivo d.img' antes e depois mostra uma diferença, então talvez seja aí que ele quebra, mesmo que eu possa montá-lo novamente e fdiskmostre os mesmos dados antes e depois:

Antes d.img: DOS/MBR boot sector; partition 1 : ID=0x83, active, start-CHS (0x0,32,33), end-CHS (0x275,145,28), startsector 2048, 92364800 sectors
Depois:d.img: DOS/MBR boot sector

Não tenho ideia de por que a partição válida não é vista.

Pergunta original:

Contexto:
Clonei meu sistema operacional atual (Ubuntu10.04) de uma única partição em um SSD desmontado.

dd if=/dev/sdc1 conv=sync,noerror bs=100M of=/data/system.img

Converti a imagem bruta para qcow2 em meu novo sistema U18.04 (ambas as imagens residem em uma partição de dados ext4 separada do sistema operacional):

qemu-img convert -f raw -O qcow2 system.img system.qcow2

Obviamente, isso falha ao iniciar (qemu-kvm diz geom errorao tentar inicializar).

Não quero copiar o disco inteiro porque é muito grande (muito lento e inútil para o meu propósito).
No entanto, tornou-se óbvio para mim que este método não consegue copiar setores essenciais do disco - entre os quais o MBR com inicialização do GRUB.

Então também copiei os primeiros 512 bytes em um arquivo separado:

dd if=/dev/sdc of=/data/sdc-512B.img bs=512 count=1 conv=sync,noerror
cat sdc-512B.img system.img > system2.img
qemu-img convert -f raw -O qcow2 system2.img system2.qcow2

Agora parece que o sistema vai iniciar, mas congela para sempre durante a inicialização. Diz, Booting from hard disk...mas fica lá.


Versões SW:

> qemu-system-x86_64 --version
QEMU emulator version 2.11.1(Debian 1:2.11+dfsg-1ubuntu7.14)
> uname -a
Linux <hostname> 4.18.0-18-generic #19~18.04.1-Ubuntu SMP Fri Apr 5 10:22:13 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
> lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.2 LTS
Release:        18.04
Codename:       bionic

Problema:

Esta imagem não inicializa no kvm:

qemu-system-x86_64-spice -hda system2.qcow2 -m 4096

ou

qemu-system-x86_64 -hda system2.qcow2 -m 4096

ou

qemu-system-x86_64 -hda system2.qcow2 -m 4096 -no-acpi

O resultado é semelhante: a janela do qemu trava durante o processo de inicialização com uma CPU trabalhando em 90-100% até que eu a termine.

O que estou fazendo de errado e que guia preciso ler para que isso funcione sem precisar copiar o disco inteiro?

Responder1

/dev/sdc1 : start=       63, size= 92164842, Id=83
/dev/sdc2 : start=        0, size=        0, Id= 0
/dev/sdc3 : start=        0, size=        0, Id= 0
/dev/sdc4 : start= 92164905, size=884603160, Id= 5
/dev/sdc5 : start= 92164968, size= 33559722, Id=82
/dev/sdc6 : start=125724753, size=851043312, Id=83

Experimente isto:

$ dd if=/dev/null of=disk.img seek=$((125724753 + 851043312))
    # create a big sparse file, the same size as /dev/sdc

# dd if=/dev/sdc of=disk.img conv=notrunc count=$((63 + 92164842))
    # copy through the mbr + gap + 1st partition into place

# sfdisk -d /dev/sdc | sfdisk disk.img
    # replicate the complete partitioning of /dev/sdc onto disk.img

$ qemu img convert -O qcow2 disk.img disk.qcow2
    # convert the raw image to qcow2

Os comandos com o #prompt precisamsomente leituraacesso ao seu disco (ou seja, você deve executá-los como root). Eles devem escrever apenas no disk.imgarquivo esparso, mas é melhor você verificar duas vezes ;-)

A imagem resultante pode não ser inicializável diretamente se o grub ou outro gerenciador de inicialização mantiver seu segundo ou terceiro estágio em uma partição que você não copiou (sdc5 ou sdc6).

Você devenãocorrer grub-install. Se quiser verificar se o particionamento funcionou bem, você pode fazer (antes de excluir disk.img):

# kpartx -l disk.img

# kpartx -a disk.img  # even try to attach ...
# mount /dev/mapper/loop0p1 /mnt/tmp  # and mount it

informação relacionada