Boot

如何將單個分區從 HD 複製到 qcow2 磁碟映像以用於 qemu-kvm?

  • June 7, 2019

編輯(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

為了創建一個只有第一個分區的 VM,我從以下文章中獲得了靈感:技術說明:將分區映像轉換為可啟動磁碟映像

我重建了一個完整的磁碟映像:

> 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),而不是主機的系統。並且在之前和之後檢查’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

我不知道為什麼沒有看到有效的分區。

原始問題:

背景:

我從一個未安裝的 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% 的速度工作,直到我終止它。

我做錯了什麼以及我需要閱讀什麼指南才能完成這項工作而無需複制整個磁碟?

/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

引用自:https://unix.stackexchange.com/questions/522839