[Linux] Converting VMware ESXi Linux VM to KVM (virt-v2v)
virt-v2v로 VMware ESXi의 Linux VM을 ssh 키 인증으로 읽어 KVM(libvirt) VM으로 변환하고 네트워크 설정을 맞추는 과정을 정리합니다.
요약
- KVM 호스트에 virt-v2v를 설치하고 ESXi에 ssh 키를 등록하면
virt-v2v -i vmx -it ssh로 ESXi 데이터스토어의 VM을 KVM으로 변환할 수 있습니다. - 변환이 끝나면
virsh edit로 네트워크 인터페이스를 KVM 환경(예: bridge br0)에 맞게 고치고, VM 부팅 후 ifcfg 파일도 수정합니다.
테스트 환경 CentOS Linux 7.4.1708 게스트 (VMware ESXi에서 KVM/libvirt로 이관)
Converting VMware ESXi Linux VM to KVM (virt-v2v)
1. Install package virt-v2v
$ yum install virt-v2v
위와 같이 virt-v2v package 를 설치 합니다.
2. ESXi - KVM 간 ssh key 인증 설정
KVM 호스트에서 ESXi 의 데이터스토어에 Password 없이 접근이 가능하도록 설정을 해야 virt-v2v 를 이용하여 VM 을 이관 할 수 있습니다.
+ VMware ESXi ssh Daemon 시작

위와 같이 ESXi Web Console 에서 작업 > 서비스 > SSH 사용 선택
+ KVM, ssh-keygen 명령 수행
[root@testh ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:bj7DLUsbaRSeVu299zzPOKKpuK88cnjZi0UxxZSSxqE root@testh.example.com
The key`s randomart image is:
+---[RSA 2048]----+
| ..=o. |
| .=.o. |
| E.+.. . |
| . * . . |
| S . . |
| = . . |
| . +O. . .|
| o.=O*o... .*.|
| +*=BBo. ...B|
+----[SHA256]-----+
[root@testh ~]#
- 생성된 key 확인 진행
[root@testh ~]# cat /root/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDYVu7UYN39ue2UqAlH1D+wNTnKM6z8/JloAG0Om8w9vUTGuowXLHTRV9CGIcQ4NfGiUI/lqI2XV+ZY4XeGCE2H5LWDagRGCutJ9vh5/D3FGIEMOGez7qXdJm8/3xrhRa56rY9ie1NFGLpoi9Lkka/6Z48CJ20vvb9vJWZdX91WGkT8G0L5nv3B3JzCrY4VxYOYmxTwmu13DOeW0bbLs08pWWrbL10cIIP76NhZJG98wulQQYDo9091lqOGUsMQ1WQudw3ggIMxZ3N9eU+0nrpfsO5yKAOlRn9fQUYXFWaED1FKyOFYwYq26x8R9o/CMyQEfETv2Em2+sto7aSyK1eh root@testh.example.com
+ ESXi 에 KVM ssh key 등록
[root@testh ~]# scp /root/.ssh/id_rsa.pub 192.168.13.6:/etc/ssh/keys-root/
Password:
id_rsa.pub 100% 404 1.3MB/s 00:00
[root@testh ~]#
key 를 ESXi 에 /etc/ssh/keys-root/ 에 복사합니다.
[root@testh ~]# ssh root@192.168.13.6
Password:
The time and date of this login have been sent to the system logs.
VMware offers supported, powerful system administration tools. Please
see www.vmware.com/go/sysadmintools for details.
The ESXi Shell can be disabled by an administrative user. See the
vSphere Security documentation for more information.
[root@esxi4:~]
[root@esxi4:~] cd /etc/ssh/keys-root/
[root@esxi4:/etc/ssh/keys-root] ls
id_rsa.pub
[root@esxi4:/etc/ssh/keys-root] mv id_rsa.pub authorized_keys
[root@esxi4:/etc/ssh/keys-root] chmod 600 authorized_keys
위와 같이 authorized_keys 로 이름을 수정하거나, id_rsa.pub key 의 내용을 authorized_keys 에 추가하는 방법도 괜찮습니다.
3. virt-v2v 수행
[root@testh ~]# export LIBGUESTFS_BACKEND=direct
[root@testh ~]# virt-v2v -i vmx -it ssh "ssh://root@192.168.13.6/vmfs/volumes/NT_datastore/mtest1/mtest1.vmx"
[ 0.0] Opening the source -i vmx ssh://root@192.168.13.6/vmfs/volumes/NT_datastore/mtest1/mtest1.vmx
[ 0.7] Creating an overlay to protect the source from being modified
[ 1.6] Opening the overlay
[ 8.1] Inspecting the overlay
[ 17.2] Checking for sufficient free disk space in the guest
[ 17.2] Estimating space required on target for each disk
[ 17.2] Converting CentOS Linux release 7.4.1708 (Core) to run on KVM
virt-v2v: This guest has virtio drivers installed.
[ 83.0] Mapping filesystem data to avoid copying unused and blank areas
[ 83.9] Closing the overlay
[ 84.0] Assigning disks to buses
[ 84.0] Checking if the guest needs BIOS or UEFI to boot
[ 84.0] Initializing the target -o libvirt -os default
[ 84.0] Copying disk 1/2 to /var/lib/libvirt/images/mtest1-sda (raw)
(100.00/100%)
[ 193.6] Copying disk 2/2 to /var/lib/libvirt/images/mtest1-sdb (raw)
(100.00/100%)
[ 346.7] Creating output metadata
풀 default가 새로고침 되었습니다
mtest1에서 정의된 도메인 /tmp/v2vlibvirtc84a5d.xml
[ 346.8] Finishing off
[root@testh ~]# virsh list --all
Id 이름 상태
----------------------------------------------------
2 centos7.0 실행중
- mtest1 종료
- testvm 종료
[root@testh ~]# virsh edit mtest1
도메인 mtest1 XML 설정이 편집되었습니다.
위와 같이 convert 작업을 수행합니다.
convert 작업 이후, virsh edit <VM name> 명령을 수행하여 아래와 같이 KVM 환경에 맞게 네트워크 정보를 수정합니다.
+ 예제
... 중략 ...
--<interface type='network'>
++<interface type='bridge'>
-- <source network='default'/>
++ <source bridge='br0'/>
<model type='virtio'/>
... 중략 ...
- VM 시작
[root@testh ~]# virsh start mtest1 도메인 mtest1가 시작됨VM 부팅 후 /etc/sysconfig/network-scripts/ifcfg-XXX 파일을
KVM환경에 맞게 수정합니다.

이관 완료!
참고 자료
- https://access.redhat.com/articles/1351473
- http://libguestfs.org/virt-v2v-input-vmware.1.html
- https://kb.vmware.com/s/article/1002866
자주 묻는 질문
virt-v2v가 ESXi에 비밀번호 없이 접근하게 하려면 어떻게 하나요?
ESXi Web Console에서 SSH 서비스를 켜고, KVM 호스트에서 ssh-keygen으로 만든 id_rsa.pub를 ESXi의 /etc/ssh/keys-root/authorized_keys로 복사한 뒤 chmod 600을 적용합니다.
ESXi VM을 KVM으로 변환하는 virt-v2v 명령은 무엇인가요?
export LIBGUESTFS_BACKEND=direct 후 virt-v2v -i vmx -it ssh "ssh://root@<ESXi IP>/vmfs/volumes/<datastore>/<VM>/<VM>.vmx"를 실행합니다. 디스크는 /var/lib/libvirt/images/에 raw 형식으로 복사되고 libvirt에 도메인이 정의됩니다.
virt-v2v 변환 후 네트워크는 어떻게 맞추나요?
virsh edit <VM name>으로 <interface type='network'>를 <interface type='bridge'>와 <source bridge='br0'/>처럼 KVM 환경에 맞게 바꿉니다. VM 부팅 후에는 /etc/sysconfig/network-scripts/ifcfg-XXX 파일도 수정합니다.