Редактировать (1&2):

Редактировать (1&2):

Редактировать (1&2):

Я клонировал свою рабочую ОС (выключенную, жесткий диск смонтирован на USB-накопителе,

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

Оригинальный SSD выглядит следующим образом:

> 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

Чтобы создать виртуальную машину только с первым разделом, я черпал вдохновение из следующей статьи:Технические примечания: преобразование образа раздела в загрузочный образ диска.

Я восстановил полный образ диска:

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

Начнем с обычного заголовка современной системы (начиная с чистого листа с 2048 блоками по 512 байт) — но в отличие от моей старой системы, в которой был только один блок размером 512 байт.

> 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)

пересоздать раздел (n (+все значения по умолчанию, отказались от удаления существующей подписи ext4), a (сделать загрузочным), 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

Итак, я определенно вижу образ, но GRUB в qemu почему-то не видит раздел:

> qemu-system-x86_64 d.qcow2

Останавливается на grub_rescue, сообщая, что не распознает указанный выше UUID, и вот что я вижу:

> ls
(hd0) (fd0)

Единственное, что я сделал по-другому по сравнению со статьей, которая меня вдохновила, это то, что я использовал локальную (старую) grub-installchroot), вместо системы хоста. И проверка 'file d.img' до и после показывает разницу, так что, возможно, именно здесь он ломается, хотя я могу монтировать его снова и снова и fdiskпоказывать те же данные до и после:

До 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
после:d.img: DOS/MBR boot sector

Понятия не имею, почему не виден действительный раздел.

Исходный вопрос:

Контекст:
Я клонировал свою текущую ОС (Ubuntu10.04) с одного раздела на несмонтированном SSD.

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

Конвертировал необработанный образ в qcow2 на моей новой системе U18.04 (оба образа находятся на разделе данных ext4 отдельно от ОС):

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

Очевидно, что запуск невозможен (сообщает qemu-kvm geom errorпри попытке загрузки).

Я не хочу копировать весь диск, так как он слишком большой (очень медленный и бесполезный для моих целей).
Однако мне стало очевидно, что этот метод не копирует важные секторы диска - среди которых MBR с загрузкой GRUB.

Поэтому я также скопировал первые 512 байт в отдельный файл:

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

Теперь система выглядит так, как будто она собирается запуститься, но зависает навсегда во время загрузки. Она говорит, Booting from hard disk...но висит там.


Версии ПО:

> 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

Проблема:

Этот образ не загружается под kvm:

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

или

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

или

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

Результат аналогичный: окно QEMU зависает во время загрузки, при этом один процессор работает на 90-100%, пока я его не завершу.

Что я делаю не так и какое руководство мне нужно прочитать, чтобы это заработало без необходимости копирования всего диска?

решение1

/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

Попробуй это:

$ 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

Команды с #подсказкой нужнытолько для чтениядоступ к вашему диску (т.е. вы должны запустить их как root). Они должны писать только в разреженный disk.imgфайл, но вы лучше проверьте дважды ;-)

Полученный образ может оказаться незагружаемым напрямую, если grub или другой загрузчик сохранил свой 2-й или 3-й этап на разделе, который вы не копировали (sdc5 или sdc6).

Вам следуетнетзапустить grub-install. Если вы хотите проверить, правильно ли выполнено разбиение, вы можете сделать (перед удалением disk.img):

# kpartx -l disk.img

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

Связанный контент