답변:
호스트 시스템에서이 작업을 수행 할 수 있습니다. 같은 대부분의 도구 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
나는 원래 문제가 오래 전에 해결되었다고 확신하지만 비슷한 문제가있는 사람은 다음과 같습니다.
전체 이미지 복사를 피하는 한 가지 방법은 파티션 테이블과 파티션 내용에 대해 별도의 익스텐트 파일을 참조하는 .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 내에서 드라이브를 분할하고 오프셋을 올바르게 받으면 새로 만든 파티션 내부에 파티션 이미지 내용이 표시됩니다.
재미있는 문제. 내가 할 일은 다음과 같습니다.
이 작업이 완료되면 부트 로더를 업데이트해야합니다. 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
개인적으로 첫 번째 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)
나는 개인적으로 첫 번째 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는 더 작습니다. 나는 당신이 해결책을 뒤집어 놓았다고 생각합니다.
seek=2048
= testfs.img 스킵 = 2048 학사 = 512의 경우이 명령 DD에 = full.img