파티션 이미지를 파티션 테이블이있는 디스크 이미지로 변환 이미지를 가상 머신의 기초로 사용하고

로 생성 된 기존 파티션의 이미지가 dd if=/dev/sdXN of=image.bin있습니다. 이제이 이미지를 가상 머신의 기초로 사용하고 싶습니다. VirtualBox가 사용할 수있는 형식으로 이미지를 변환하는 방법을 알고 있습니다.

문제는 “디스크”이미지는 실제로 하나의 파티션 이미지 일 뿐이므로 MBR 또는 파티션 테이블을 포함하지 않는다는 것입니다. 이로 인해 VM을 부팅하기가 매우 어렵습니다.

파티션 이미지를 가지고 파티션 테이블을 포함한 적절한 디스크 이미지를 만드는 간단한 방법이 있습니까?



답변

호스트 시스템에서이 작업을 수행 할 수 있습니다. 같은 대부분의 도구 fdisk는 파일에서 작동하며 파일의 kpartx파티션에 액세스 할 수 있습니다.

  1. 비어있는 100GiB 스파 스 이미지를 새로 만듭니다 (파티션 이미지의 크기보다 약간 크게 만듭니다).

    dd if=/dev/zero of=myvm.img bs=1G count=0 seek=100
    
  2. 이미지 파일을 fdisk

    fdisk myvm.img
    
  3. 이미지 파일의 파티션을 개별 장치로 사용 가능하게하십시오

    sudo kpartx -a myvm.img
    
  4. 파티션 이미지를 파티션으로 복사

    sudo cp image.bin /dev/mapper/loop0p1
    
  5. 파일 시스템을 확장하여 전체 파티션을 채 웁니다.

    sudo resize2fs /dev/mapper/loop0p1
    
  6. 파티션을 닫습니다

    sudo kpartx -d myvm.img
    
  7. 루프백 장치 해체

    sudo losetup -D
    

답변

나는 원래 문제가 오래 전에 해결되었다고 확신하지만 비슷한 문제가있는 사람은 다음과 같습니다.

전체 이미지 복사를 피하는 한 가지 방법은 파티션 테이블과 파티션 내용에 대해 별도의 익스텐트 파일을 참조하는 .vmdk 형식 이미지를 만드는 것입니다.

나는이 스 니펫이 얼마 전에했던 테스트에서 .vmdk 파일에 놓여 있습니다.

RW 63 FLAT "parttable.bin" 0
RW 585937489 FLAT "partition-image.bin" 63

이는 오프셋 0에서 시작하는 63 개의 섹터가 원시 파일 “parttable.bin”에서 읽혀 지지만 섹터 63 이상은 원시 파티션 덤프 “partition-image.bin”에서 나옵니다. (물론, 63을 첫 번째 파티션에 대한 실제 오프셋으로 대체하십시오. 요즘에는 2048입니다).

결과적으로 VBox 내부에서 긴 복사 작업을 수행하지 않고도 파티션 이미지를 파티션 이미지 앞에 추가 한 것처럼 보입니다.

VM 내에서 드라이브를 분할하고 오프셋을 올바르게 받으면 새로 만든 파티션 내부에 파티션 이미지 내용이 표시됩니다.


답변

재미있는 문제. 내가 할 일은 다음과 같습니다.

  1. 디스크가 적당히 큰 VM을 생성 한 다음 복구 CD에서 부팅하십시오.
  2. 어떻게 든 기존 디스크 이미지에 액세스 할 수 있습니다 (nfs, cifs 등).
  3. VM의 로컬 디스크에 필요한 파티션을 만듭니다.
  4. dd를 사용하여 파티션 이미지를 vm 디스크의 파티션에 씁니다.

이 작업이 완료되면 부트 로더를 업데이트해야합니다. GRUB을 사용한다고 가정하면 새로 작성된 파티션을 마운트 한 다음 chroot로 실행하고 실행하십시오 update-grub(그러나 제대로 작동하려면 구성 파일을 조정해야 할 수도 있습니다).

행운을 빕니다!


답변

GParted를 사용하여 파일 시스템의 크기를 조정할 수 있습니다.

테스트 이미지를 작성하십시오.

dd if=/dev/zero of=extfs bs=1M count=20
mkfs.ext4 extfs

여유 공간을 남기지 않고 파일 크기를 조정하기 때문에 resize2fs를 사용하지 않습니다.

sudo losetup /dev/loop0 extfs
sudo ln -s /dev/loop0 /dev/loop0p1 # needed for GParted to be able to resize it
gksudo gparted /dev/loop0

시작시 1MB의 여유 공간.

sudo rm /dev/loop0p1
sudo losetup -d /dev/loop0

마지막으로 파티션 테이블을 만듭니다.

fdisk extfs

첫 번째 섹터를 2048 (2048 섹터 * 512 B / 섹터 = 1MB)로 설정하고 마지막 섹터는 기본값 (예 : 이미지의 끝)입니다.


답변

개인적으로을 사용하여 추가하는 것을 선호합니다 dd.

여기서 512 바이트 섹터를 가정합니다. 2048 바이트 섹터의 경우가있을 수 있으므로 숫자를 바꾸고 수학을 수행하십시오.

각각의 경우에 예를 들어 512MB 테스트 파일을 사용하고 있습니다.

dd if=/dev/zero of=testfs.img bs=512 count=1M
mkfs.ext4 testfs.img

MBR

이미지 구성

개인적으로 첫 번째 MB (2048 섹터)를 시작 부분에 추가하는 것을 선호합니다.

dd if=testfs.img skip=2048 bs=512 of=full.img

마지막으로 fdisk를 실행하여 파티션 테이블을 만들거나 직접 복사하십시오. 기본값을 사용하여 1 개의 파티션을 만들었습니다.

확인 중

확인하려면 루프 파티션을 만들고 자동 감지하십시오.

sudo losetup -fP full.img

그리고 file결과 파티션 된 루프백 장치에서 실행 하십시오.

sudo file -s /dev/loop2p1
/dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files)

GPT

이미지 구성

나는 개인적으로 첫 번째 MB (gdisk가 1MB로 정렬되어 있기 때문에 gdisk 가이 숫자를 기본값으로 설정하므로 2048 섹터)를 마지막 MBR의 시작 부분과 34 섹터의 끝 부분 (또는 전체 MB의 경우 2048)을 끝 부분에 추가하는 것을 선호합니다 GPT (최종 섹터가 다를 수 있음) 최종 GPT를 생략하면 데이터가 손실 될 수 있습니다.

dd if=testfs.img skip=2048 bs=512 of=full.img
dd if=/dev/zero seek=1050624 bs=512 of=full.img count=34

마지막으로 gdisk를 실행하여 파티션 테이블을 생성하거나 직접 복사하십시오. 기본값을 사용하여 1 개의 파티션을 생성했습니다.

확인 중

확인하려면 루프 파티션을 만들고 자동 감지하십시오.

sudo losetup -fP full.img

그리고 file결과 파티션 된 루프백 장치에서 실행 하십시오.

sudo file -s /dev/loop2p1
/dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files)

이 방법은 추측, 크기 조정 또는 수동 정렬을 보장하지 않습니다.


답변