본문 바로가기

실습

[Mini project] VM Migration VMware to OpenStack

 

**[2026-09-14] 현재 브로드컴에서 VDDK 를 다운로드 경로를 막았기때문에 사용 할 수 없습니다. 이 경우 ndbkit이 curl 로 경유하여 데이터를 복사하는데 이는 vddk 방법보다 속도가 느리고 증분백업이 불가능합니다.

 

회사 테스트 환경에 OpenStack과 vSphere가 둘 다 있어서  예전부터 궁금했던 VMware → OpenStack V2V를 한번 시도해봤습니다.

대상은 vSphere 테스트 VM 하나, 타깃은 Red Hat OpenStack. 도구는 virt-v2v, 오케스트레이션은 Migration Toolkit for Virtualization(MTV)를 사용했습니다.

전체흐름은 다음과 같습니다.

마이그레이션의 흐름


명령어 및 의존성

 

헬퍼 VM 은 오픈스택위에 생성 ( RHLE 9.6 )

 

1. virt-2v2 install

dnf install -y virt-v2v nbdkit nbdkit-vddk-plugin

 

2. Broadcom 홈페이지에서 VDDK를 다운 받은 후 헬퍼 vm에 설치

3. vCenter 및 OpenStack에 접근가능하도록 설정

sudo subscription-manager repos --enable=openstack-17.1-for-rhel-9-x86_64-rpms
sudo dnf install -y python3-openstackclient
. stackrc
ssl 인증서 추가 작업 후
openstack server list

vspher vm 리스트 정보 확인
virsh -c vpx://user@vcenter.example.lab/Datacenter/Cluster/esxi01.example.lab?no_verify=1 list --all

 

4. virt-v2v 실행

virt-v2v -i libvirt  -v -x -ic 'vpx://vcenterid@vcenterurl/Main-Datacenter/Prod2-Cluster/esxiurl?no_verify=1' \
-ip ~/password.txt \
"ubuntu_purse" \
-o openstack \
-it vddk  \
-io vddk-libdir=/opt/vmware-vix-disklib-distrib \
-io vddk-thumbprint=77:FF:62:72:AF:8C:8E:50:FB:F2:76:02:BD:FA:91:A2:E2:A4:BB:CC \
-oo server-id="fa89114d-b577-4094-b992-58e24a6bc7df" \


-ic 'vpx://user@vcenter/Datacenter/Cluster/esxi?no_verify=1' : vSphere 접속 정보

-ip: 패스워드 파일

-o openstack : 타깃

 

 

디스크 마이그레이션

그렇다면 소스 VMDK를 어떻게 읽고, 어디를 고치고, 그걸 언제 OpenStack 볼륨에 쓰는지 알아 보겠습니다.

변환이 시작되면 virt-v2v는 소스 VMDK를 VDDK를 통해 read-only로 접근합니다.

그리고 로컬에 qcow2 오버레이 파일을 하나 만든 뒤 마이그레이션 작업이 시작됩니다.


libguestfs appliance가 실제로 하는 일
오버레이를 만들고 나면 virt-v2v는 조그만 libguestfs appliance VM을 띄웁니다.

이 appliance에 아까 만든 오버레이가 virtio-scsi로 붙습니다.

임시 vm 이 생성된 모습


appliance는 오버레이를 마운트하고 chroot로 들어가서 게스트를 KVM에서 부팅 가능하게 수정합니다.

· dracut으로 initramfs에 virtio 드라이버를 주입
· grub2-mkconfig 부트로더 설정
· open-vm-tools 제거
· fstab에서 VMware 환경에 묶인 항목을 정리

vddk를 통한 복사 후 오버레이 수정하는 모습


그 후 Cinder API로 빈 볼륨을 생성하고, 그 볼륨을 conversion host(helper VM)에 블록 디바이스로 붙입니다.

openstack 명령어로 볼륨을 생성하는 모습


그리고 복사를 시작합니다.

각 블록마다, 오버레이에 해당 블록이 있으면(즉 수정된 블록이면) 오버레이에서 읽고, 없으면 VDDK를 통해 원본 VMDK에서 읽습니다. 그렇게 고른 블록을 Cinder 볼륨(/dev/vdb)에 쓴다. 이걸 디스크 전체에 대해 반복합니다.

즉, 원본 블록과 수정 블록을 읽는 순간에 합성해서 최종 결과를 Cinder 볼륨에 한 번에 쓰는 것입니다.

복사가 끝나면 볼륨을 detach하고 오버레이는 삭제합니다.

디스크 복사

 

오픈스택에서 생성된 볼륨
부팅된 모습



데이터 복사를 하는 이유는 vmdk 의 파일 시스템 때문인듯 합니다.
오픈스택에서는 vmfs 나 vmdk 를 읽을 수가 없어 VDDK 를 통해 데이터를 복사하여 마이그레이션 하는 것입니다.


배운 것들

VDDK

vmware vmfs, vmdk 를 읽기 및 수정을 할수 있는 도구

Copy-on-write

원본을 read-only로 두고 오버레이에만 수정을 기록한 뒤 읽는 순간에 합성하는 구조. 이걸 한 번 제대로 이해하면 도처에서 같은 그림이 보인다. Docker 이미지 레이어, LVM·스토리지 스냅샷, thin provisioning, 골든 이미지 배포에 사용되는 패턴입니다.

 

vm 트러블 슈팅

부팅 체인에 대해 좀 더 깊숙히 접해봤습니다.
virtio 드라이버를 dracut으로 주입하고 libguestfs appliance를 띄워 오버레이를 chroot를 통해 수정하여 부팅디스크를 생성하는 과정이 인상적이었습니다. 

 

guestfish

guestfish 를 이용해 부팅 디스크의 내용을 직접 수정할 수 있습니다.

 

한계점

cold migration인점 ( Hot 아니 Warm Migration 은 안되는지? )

v대량 이관이 가능한지?

vSan에 저장된 vm 디스크는 이관이 안됨

공유 스토리지가 있다면 어떻게 마이그레이션을 할수 있을지?

좀 더 알아보고 추후에 글을 작성해보겠습니다.

 

또 실무 관점에서는
대량 이관에서 진짜 부담은 변환이 아니라, 그 앞단의 discovery(클러스터 전체 VM 전수조사, 현재 호스트 위치 파악, 디스크·네트워크 수집, 솔루션 의존성 등)와 뒷단의 검증·컷오버 단계에 있을 것 입니다.

'실습' 카테고리의 다른 글

vSphere 환경에서 VM Owner(Creator) 명시하기  (2) 2024.11.08
Azure와 Openvpn를 이용한 S2S vpn 연결  (0) 2024.02.06