编辑(1&2):

编辑(1&2):

编辑(1&2):

我克隆了我的工作操作系统(关闭电源,HD 安装在 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

所以我肯定可以看到图像,但不知何故 qemu 中的 GRUB 无法看到分区:

> qemu-system-x86_64 d.qcow2

停止在 grub_rescue 下,说明它无法识别上面的 UUID,我可以看到的是:

> ls
(hd0) (fd0)

我所做的与我从中获得灵感的文章不同的一件事是我使用本地(旧)grub-install(在chroot),而不是主机的系统。并且在之前和之后检查“文件 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

我不知道为什么看不到有效分区。

原问题:

语境:
我从未安装的 SSD 上的单个分区克隆了当前的操作系统 (Ubuntu10.04)。

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

在我的新 U18.04 系统上将原始映像转换为 qcow2(两个映像都驻留在与操作系统分开的 ext4 数据分区上):

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

这显然无法启动(qemu-kvmgeom error在尝试启动时显示)。

我不想复制整个磁盘,因为它太大(对于我的目的来说非常慢且无用)。
然而,对我来说很明显,这种方法无法复制重要的磁盘扇区 - 其中包含带有 GRUB 引导的 MBR。

所以我还将前 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 窗口在启动过程中挂起,其中一个 CPU 以 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 或其他引导加载程序将其第二或第三阶段保留在您未复制的分区(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

相关内容