**[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로 붙습니다.

appliance는 오버레이를 마운트하고 chroot로 들어가서 게스트를 KVM에서 부팅 가능하게 수정합니다.
· dracut으로 initramfs에 virtio 드라이버를 주입
· grub2-mkconfig 부트로더 설정
· open-vm-tools 제거
· fstab에서 VMware 환경에 묶인 항목을 정리

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

그리고 복사를 시작합니다.
각 블록마다, 오버레이에 해당 블록이 있으면(즉 수정된 블록이면) 오버레이에서 읽고, 없으면 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 |