편집(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
첫 번째 파티션만 사용하여 가상 머신을 생성하기 위해 다음 기사에서 영감을 얻었습니다.기술 노트: 파티션 이미지를 부팅 가능한 디스크 이미지로 변환.
전체 디스크 이미지를 다시 작성했습니다.
> 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
위의 UUID를 인식하지 못함을 나타내는 grub_rescue에서 중지하면 내가 볼 수 있는 것은 다음과 같습니다.
> ls
(hd0) (fd0)
영감을 받은 기사와 다르게 한 점은 호스트의 시스템이 아닌 로컬(이전) grub-install
(in )을 사용했다는 것입니다. 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로 변환합니다(두 이미지 모두 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...
거기에 달려 있습니다.
소프트웨어 버전:
> 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
프롬프트가 있는 명령은 #
require읽기 전용디스크에 액세스합니다(즉, 루트로 실행해야 합니다). 희소 파일에만 써야 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