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 fdisk
mostre 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 error
ao 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.img
arquivo 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