생성된 기존 파티션을 사용하는 이미지가 있습니다 dd if=/dev/sdXN of=image.bin
. 이제 이 이미지를 가상 머신의 기반으로 사용하고 싶습니다. VirtualBox에서 사용할 수 있는 형식으로 이미지를 변환하는 방법을 알고 있습니다.
문제는 "디스크" 이미지가 실제로 파티션 이미지일 뿐이므로 MBR이나 파티션 테이블을 포함하지 않는다는 것입니다. 이로 인해 가상 머신을 시작하는 것이 매우 어려워집니다.
파티션 이미지가 주어지면 올바른 디스크 이미지(파티션 테이블 포함)를 쉽게 생성할 수 있는 방법이 있습니까?
답변1
호스트 컴퓨터에서 이 작업을 수행할 수 있습니다. 대부분의 도구는 fdisk
파일에 대해 작동하며kpartx
파일 내의 파티션에 액세스할 수 있습니다.
새로운 빈 100GiB 스파스 이미지를 생성합니다(파티션 이미지 크기보다 약간 크게 만듭니다).
dd if=/dev/zero of=myvm.img bs=1G count=0 seek=100
파티션 이미지 파일
fdisk
fdisk myvm.img
다양한 장치에서 이미지 파일의 파티션을 사용할 수 있도록 설정
sudo kpartx -a myvm.img
파티션 이미지를 파티션에 복사
sudo cp image.bin /dev/mapper/loop0p1
전체 파티션을 채우도록 파일 시스템 확장
sudo resize2fs /dev/mapper/loop0p1
파티션 닫기
sudo kpartx -d myvm.img
루프백 장치 제거
sudo losetup -D
답변2
원래 질문은 오래 전에 해결되었다고 확신하지만 비슷한 문제가 있는 사람은 다음과 같습니다.
전체 이미지 복사를 방지하는 한 가지 방법은 파티션 테이블과 파티션 내용에 대한 별도의 확장 파일을 참조하는 .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 내부에서 긴 복사 작업을 수행할 필요 없이 파티션 이미지 앞에 파티션 테이블을 추가한 것으로 나타납니다.
가상 머신 내에서 드라이브를 분할하고 오프셋이 올바른 경우 새로 생성된 파티션에 파티션 이미지 내용이 표시되어야 합니다.
답변3
흥미로운 질문입니다. 이것이 내가하려는 일입니다.
- 적절한 크기의 디스크로 VM을 생성하고 복구 CD에서 부팅합니다.
- 어떤 방식으로든 기존 디스크 이미지(nfs, cifs 등)에 액세스합니다.
- 가상 머신의 로컬 디스크에 필요한 파티션을 만듭니다.
- dd를 사용하여 VM 디스크의 파티션에 파티션 이미지를 씁니다.
이 작업을 완료한 후에는 부트로더를 업데이트해야 합니다. GRUB를 사용한다고 가정하고 새로 작성된 파티션을 마운트한 다음 해당 파티션에 chroot하여 실행합니다 update-grub
(하지만 제대로 작동하려면 구성 파일을 조정해야 할 수도 있으므로 주의하세요).
행운을 빌어요!
답변4
저는 개인적으로 를 사용하는 것을 선호합니다 dd
.
여기에는 512바이트 섹터가 있다고 가정합니다. 2048바이트 섹터의 경우가 있을 수 있으므로 숫자를 바꿔서 계산해 보세요.
각각의 경우에 512MB 테스트 파일을 사용했습니다. 예를 들면 다음과 같습니다.
dd if=/dev/zero of=testfs.img bs=512 count=1M mkfs.ext4 testfs.img
막 생물 반응기
구성
저는 개인적으로 첫 번째 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(2048 섹터, gdisk는 1MB로 정렬되어 있으므로 기본적으로 해당 숫자를 사용하므로)를 시작 MBR로 시작 부분에 추가하고 34 섹터를 끝 부분(또는 2048 전체 MB)에 추가하는 것을 선호합니다. 종료 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)
이 방법을 사용하면 추측, 크기 조정 또는 수동 정렬이 발생하지 않습니다.