파티션 이미지를 파티션 테이블이있는 디스크 이미지로 변환


20

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

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

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

답변:


13

호스트 시스템에서이 작업을 수행 할 수 있습니다. 같은 대부분의 도구 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
    

이렇게하면 이미지에서 생성 된 파티션이 이미지 파티션의 길이와 "일치하지"않습니까? 그리고 그것을 해결할 수있는 방법이 있습니까? "충분한 스마트"파일 시스템 관리자가 전체 파티션 크기를 사용하지 않는다고 알릴 수 있습니까?
killermist

@killermist 업데이트 된 답변입니다.
mgorven

이것은 좋은 대답입니다. 프로세스에서 전체 내용을 복사하지 않는 방법을 알고 있습니까?
미카 피셔

@MikaFischer 불행히도, 파티션 테이블은 파티션 앞에 존재해야하기 때문에 데이터 앞에 파일을 추가하는 메커니즘을 모릅니다.
mgorven

하룬의 대답은 더 쉽고 스크립팅이 가능하기 때문에 더 낫다고 생각합니다.
Philcolbourn

9

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

전체 이미지 복사를 피하는 한 가지 방법은 파티션 테이블과 파티션 내용에 대해 별도의 익스텐트 파일을 참조하는 .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 내에서 드라이브를 분할하고 오프셋을 올바르게 받으면 새로 만든 파티션 내부에 파티션 이미지 내용이 표시됩니다.


2
partition-image.bin이 파티션 이미지이면 두 번째 줄의 '63'은 0이어야한다고 생각합니다. 방금 이와 같은 작업을 수행했으며 파티션 이미지 파일 에서이 오프셋을 0으로 설정해야했습니다. philatwarrimoo.blogspot.com.au/2014/01/…
philcolbourn


천재. 방금 Linux 호스트에서 VM에 Windows 파티션을 사용하기 위해이 작업을 수행해야했으며 이것이 @philcolbourn의 단계를 사용하여 작동 한 유일한 방법입니다. superuser.com/a/804396/93066
bmaupin

나머지 vmdk 파일에는 무엇이 있어야합니까?
gozzilli

1
@gozzilli 파일의 나머지 부분은 파일 버전 번호, 디스크 어댑터 유형, UUID 및 디스크 구조와 같은 세부 정보입니다. 그 비트를 쓰는 법을 모르겠습니다. 도구를 사용하여 디스크 이미지를 가리키는 vmdk를 만든 다음 추가 파티션 헤더를 가져올 위치를 설명하는 행만 수정하는 것이 좋습니다.
Harun

3

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

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

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

행운을 빕니다!


2

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)로 설정하고 마지막 섹터는 기본값 (예 : 이미지의 끝)입니다.


1

개인적으로을 사용하여 추가하는 것을 선호합니다 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) 이 방법은 추측, 크기 조정 또는 수동 정렬을 보장하지 않습니다.



내가 이것을 실행할 때 sudo file -s /dev/loop11p1나는 얻었다 /dev/loop11p1: data. 이전에는 ext4 파일 시스템이었습니다. 결과 full.img는 더 작습니다. 나는 당신이 해결책을 뒤집어 놓았다고 생각합니다.
Anwar

난 당신 말은 생각 seek=2048= testfs.img 스킵 = 2048 학사 = 512의 경우이 명령 DD에 = full.img
안와르
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.