상당히 수동 방식으로 가상 디스크 이미지를 복제하려고합니다. 지금까지 나의 방법론의 개요는 다음과 같습니다 :
- 120GB HDD (하이퍼 바이저 및 HDD 크기는 중요하지 않습니다. 나머지는 물론 파티션 크기와 같이 완벽하고 일관성을 위해 포함됨)
- 가상 머신에 Ubuntu 12.04.3 설치
- 가상 컴퓨터 닫기
- 가상 컴퓨터와 연결된 가상 하드 디스크 탑재
- 디렉토리에 저장할 운영 체제 파일 및 데이터 추출
- 가상 하드 디스크 메타 데이터 저장
- 새 가상 디스크를 생성하고 파티션 및 부팅 정보를 (6)
- (5)에서 올바른 파티션으로 데이터 복원
문제
내 복제 된 VM은 부팅되지 않습니다. 그럽 (Grub)이 복사하는 것처럼 보입니다. 등장하다 내 루트 파티션 (우분투가 설치된 상태)을 확인합니다. 우분투가로드 될 것처럼, GRUB을 한번 부팅하고 자주색 화면을 볼 수 있습니다. 그런 다음 중지합니다. 그 후, 나는 Grub으로 부팅하고 OS를 선택한 다음 깜박이는 커맨드 라인 커서를 얻을 수 있습니다. 입력이 불가능합니다. 복제 프로세스에서 누락 된 부분이있는 것으로 의심됩니다 (자세한 내용은 아래 참조). 참고 : 저는 grub2를 사용하고 있습니다.
왜 이런 짓을하는?
계약상의 요구 사항의 일부로 버전 제어에 가상 디스크를 저장해야합니다. 거대한 바이너리 블롭 (가상 디스크)을 버전 관리에 사용하는 것이 복제본 (git) / 체크 아웃 (svn)뿐 아니라 diff에 대한 통증입니다. 여러 파일을 압축하는 것을 고려했지만 위의 (5)에서 추출한 OS / 데이터를 조작 할 수 있어야합니다. VCS 저장소에는 완전한 VM을 작성하는 데 필요한 모든 정보가 필요합니다.
세부 묘사
설명 된 것을 재현하는 자세한 지침 :
- VM 만들기 및 Ubuntu Live CD 부팅
- "Try Ubuntu"를 선택하십시오.
- 터미널 열기
- msdos 파티션 만들기 : sudo parted / dev / sda mklabel msdos
- 2GB 스왑 파일 만들기 : sudo parted / dev / sda mkpart 주 리눅스 스왑 2048s 4198399s
- 루트 파티션으로 나머지 드라이브를 사용하십시오. sudo parted / dev / sda mkpart 기본 ext4 4198400s 100 %
- 컴퓨터를 재부팅하고 "Install Ubuntu"를 선택하십시오.
- 고급 파티셔닝 옵션 선택
- 스왑 파티션을 두 번 클릭하고 스왑 파티션으로 사용하도록 선택합니다.
- 루트 파티션을 두 번 클릭하고 포맷을 선택하여 루트 (/)로 사용하십시오. 마운트 포인트
이제 다음을 수행하여 디스크를 복제하십시오.
# Set up some parameters
ORIG_DEV="/dev/nbd0"
ORIG_MNT=$(mktemp -d)
ORIG_IMG="orig.vdi"
CLONE_DEV="/dev/nbd1"
CLONE_MNT=$(mktemp -d)
CLONE_IMG="clone.vdi"
qemu-img info $ORIG_IMG # save the "virtual size" output (in bytes) in the
# VIRT_SIZE variable in the next command
VIRT_SIZE="128849018880"
# Create the clone disk
qemu-img create -f vdi $CLONE_IMG $VIRT_SIZE
# Use qemu to make both disks accessible
modprobe nbd
qemu-nbd -c $ORIG_DEV $ORIG_IMG
qemu-nbd -c $CLONE_DEV $CLONE_IMG
# Set up the clone disk partition table and partitions
parted $CLONE_DEV mklabel msdos
parted $CLONE_DEV mkpart primary linux-swap 2048s 4198399s
parted $CLONE_DEV mkpart primary ext4 4198400s 100%
# Format the clone disk partitions and clone the UUIDs
mkswap $CLONE_DEVp1 -U $(blkid $ORIG_DEVp1 -s UUID -o value)
mkfs.ext4 $CLONE_DEVp2 -U $(blkid $ORIG_DEVp2 -s UUID -o value)
# Mount both disks and copy root from the original to the clone
mount $CLONE_DEVp2 $CLONE_MNT
mount $ORIG_DEVp2 $ORIG_MNT
find $ORIG_MNT -maxdepth 1 -mindepth 1 | xargs -I{} cp -ar {} $CLONE_MNT
umount $ORIG_MNT
umount $CLONE_MNT
# Copy the boot sector and partition table from the original
dd if=$ORIG_DEV of=$CLONE_DEV bs=$((2048*512)) count=1
# Disconnect the disks
qemu-nbd -d $CLONE_DEV
qemu-nbd -d $ORIG_DEV
그 외에 또 무슨 짓을 한거야?
- grub-install --root-directory = / path / to / clone / device / boot / / dev / clone_device. 이것은 올바른 장치에 Grub을 설치했지만 호스트의 장치 세부 사항으로 설치합니다. VM이 부팅되지 않습니다.
- 복제 디스크에 chroot 한 다음, grub-install을 실행하십시오. 64 비트 호스트를 사용하여 32 비트 게스트를 복제 할 수 있어야하기 때문에 문제가 발생했습니다. 이것은 조사 할 수있는 희망적인 길일 것 같지만, 나는 이것을 달성하는 방법에 관해서 붙어 있습니다.
- 가상 디스크를 마운트하고 모든 파일을 데이터 파티션 밖으로 이동합니다.
mv
, 데이터와 스왑 파티션을 제로화 (dd if=/dev/zero of=/dev/nbd0p2
)를 선택하고 가상 디스크를 압축합니다 (VBoxManage modifyhd clone.vdi --compress
). 디스크가 빈 공간 (hah!)으로 채워지면서 호스트 파일 시스템에서 디스크가 확장되기 시작했습니다. 나는 멈췄다.dd
이런 일이 발생했다는 것을 깨달았을 때 디스크 이미지가 압축되었습니다. 3GB가 넘었습니다. (gzip / bzip을 사용하지 않았지만, 오늘 저녁에 시도해 볼 것입니다. dd 닦아내 기가 완료되도록 시도 할 것입니다.하지만 작동하는 경우에도 더 적은 시간이 소요되는 솔루션을 선호합니다) . - e2 이미지. 내 다른 질문보기 : e2image는 파일 시스템 메타 데이터를 복원합니다. . 나는 이것을 해결하지 못했다. 내가 제공하는 단계는 세부 묘사 섹션 작성, 포맷 및 부트 섹터 복사를 포함하여 전에 루트 파티션을 복사하고 e2image로 만든 것과 비슷한 크기의 이미지 파일을 생성합니다.
- grub-install을 실행하기 위해 다른 VM으로 부팅하여이 VM에 chroot합니다. 나는 실제로이 일을하지 않았지만 누군가가 제안 할 경우를 대비하여 여기에 포함시켰다. 필자에게는 스크립트 작성이 가능한 가상 머신의 재조합이 필요합니다. 관련된 설치 프로세스가 배제됩니다.
- Grub 대신 extlinux를 설치하십시오. 실패한 동안,이 연습은 부트 로더가 내 파티션에서 램 디스크를 성공적으로로드하고 있지만 (이 시점에서 멈추는) 것으로 나타났습니다.
당신이 여기까지왔다면 이미 감사드립니다! 조사 방법에 대한 어떠한 제안도, 그러나 자세히 알려지지 않을 것입니다. 미리 감사드립니다.
e2image -r
왜냐하면 내 경험에 의하면 Windows는 스파 스 파일을 저장하는 데 아주 능숙하지 않기 때문에 개발자가 Windows를 사용하려면 저장소의 체크 아웃에 많은 공간이 필요합니다. 그러나 Windows에서 스파 스 파일을 사용하여 앞서 언급 한 "경험"은 매우 제한되어 있으므로 거의 추적하지 못했으며 추가 조사가 필요합니다. 제안에 대해 대단히 감사 드리며, 나는 그것에 대해 살펴보고 그것이 어떻게 진행되는지 알려줄 것입니다.