편집(1&2):

편집(1&2):

편집(1&2):

작동 중인 OS를 복제했습니다(전원이 꺼진 상태, USB 드라이브에 HD 마운트,

> 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

일반적인 최신 시스템 헤더로 시작하려면(512바이트의 2048개 블록이 있는 빈 슬레이트로 시작) - 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의 단일 파티션에서 현재 OS(Ubuntu10.04)를 복제했습니다.

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

새 U18.04 시스템에서 원시 이미지를 qcow2로 변환했습니다(두 이미지 모두 OS와 별도의 ext4 데이터 파티션에 있음).

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

이것은 분명히 시작에 실패합니다( geom error부팅을 시도할 때 qemu-kvm이 말합니다).

디스크가 너무 크기 때문에 전체 디스크를 복사하고 싶지 않습니다(매우 느리고 내 목적에 적합하지 않음).
그러나 이 방법은 필수 디스크 섹터(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...거기에 달려 있습니다.


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

문제:

이 이미지는 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

#프롬프트가 필요한 명령읽기 전용디스크에 액세스합니다(즉, 루트로 실행해야 합니다). 스파스 파일에만 써야 disk.img하지만 두 번 확인하는 것이 좋습니다 ;-)

grub이나 기타 부트로더가 복사하지 않은 파티션(sdc5 또는 sdc6)에서 2차 또는 3차 단계를 유지한 경우 결과 이미지를 직접 부팅하지 못할 수 있습니다.

당신은해야~ 아니다달리다 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

관련 정보