ESXi VM 마이그레이션 (Datastore to Datastore)
ESXi에서 VM을 datastore 간 이동하는 절차입니다. Storage vMotion과 cold vmkfstools clone 기준, snapshot 확인, VMX 등록, 부팅 검증까지 정리했습니다.
ESXi VM 마이그레이션: Datastore to Datastore
ESXi에서 VM을 다른 datastore로 옮기는 방법은 크게 두 가지다. vCenter와 라이선스가 준비되어 있으면 Storage vMotion으로 운영 중인 VM의 디스크를 이동할 수 있다. 단일 ESXi 호스트나 랩 환경처럼 vCenter 기능을 쓰기 어려운 경우에는 VM을 끈 뒤 vmkfstools -i로 VMDK를 clone하고 VMX를 다시 등록하는 방식이 현실적이다.
실습은 vmkfstools -i <source> -d thin <target> 한 줄만 남아 있었는데, 실제 작업에서는 전원 상태, snapshot, datastore 여유 공간, VMX 등록, 부팅 검증까지 같이 봐야 한다. 특히 snapshot이 남아 있는 VM을 잘못 clone하면 현재 디스크 상태가 빠질 수 있으므로 이 부분을 먼저 확인해야 한다.
작업 전 선택 기준
| 상황 | 권장 방식 | 주의점 |
|---|---|---|
| vCenter 관리, Storage vMotion 가능 | vSphere Client에서 Migrate - Change storage only | 무중단에 가깝지만 라이선스와 vCenter 상태가 필요하다. |
| 단일 ESXi, 랩, 유지보수 가능 | VM 전원 종료 후 vmkfstools -i | 작업 중 VM downtime이 발생한다. |
| snapshot 존재 | snapshot 정리 또는 Storage vMotion 검토 | base VMDK만 복사하면 최신 delta 상태가 누락될 수 있다. |
| 장애 디스크에서 긴급 이동 | 백업 우선, 이후 clone | 읽기 오류가 있으면 clone이 중단될 수 있다. |
1. VM과 datastore 상태 확인
먼저 VMID, 현재 datastore 경로, 전원 상태, snapshot 여부를 확인한다.
vim-cmd vmsvc/getallvms
VMID="123"
vim-cmd vmsvc/power.getstate "${VMID}"
vim-cmd vmsvc/snapshot.get "${VMID}"datastore 용량과 파일 시스템 경로를 확인한다. clone 대상 datastore에는 기존 디스크 크기와 작업 여유 공간이 충분해야 한다.
esxcli storage filesystem list
df -h
ls -lh /vmfs/volumes/SOURCE_DATASTORE/VM_NAME/2. snapshot 정리 여부 판단
snapshot.get 결과가 비어 있지 않다면 바로 base VMDK를 clone하지 않는다. 운영 VM에서 snapshot chain이 남아 있으면 실제 최신 데이터는 -000001.vmdk 같은 delta 파일에 있을 수 있다. 가능하면 vSphere Client에서 snapshot을 consolidate하거나 삭제한 뒤 진행한다.
vim-cmd vmsvc/snapshot.get "${VMID}"
# snapshot 정리가 필요한 경우 vSphere Client에서 먼저 consolidate/delete를 수행한 뒤 재확인
vim-cmd vmsvc/snapshot.get "${VMID}"3. VM 전원 종료
cold migration 방식에서는 VM을 반드시 종료한다. guest OS에서 정상 종료가 가능하면 OS 내부 shutdown을 먼저 수행하고, ESXi에서는 전원 상태만 확인한다.
vim-cmd vmsvc/power.getstate "${VMID}"
# 필요 시 ESXi에서 shutdown 요청
vim-cmd vmsvc/power.shutdown "${VMID}"
sleep 30
vim-cmd vmsvc/power.getstate "${VMID}"정상 종료가 되지 않는 VM에 power.off를 쓰면 파일시스템 손상이 날 수 있다. 장애 상황이 아니라면 강제 종료는 마지막 수단으로 둔다.
4. 대상 디렉터리 생성
SOURCE_DS="SOURCE_DATASTORE"
TARGET_DS="TARGET_DATASTORE"
VM_NAME="VM_NAME"
mkdir -p "/vmfs/volumes/${TARGET_DS}/${VM_NAME}"
ls -ld "/vmfs/volumes/${TARGET_DS}/${VM_NAME}"5. VMDK clone
vmkfstools -i는 VMDK descriptor를 입력으로 받아 디스크를 새 VMDK로 clone한다. thin provisioning으로 옮길 때는 -d thin, eager zeroed thick이 필요한 환경이면 -d eagerzeroedthick를 사용한다.
vmkfstools -i \
"/vmfs/volumes/${SOURCE_DS}/${VM_NAME}/${VM_NAME}.vmdk" \
-d thin \
"/vmfs/volumes/${TARGET_DS}/${VM_NAME}/${VM_NAME}.vmdk"진행 중 오류가 나면 원인부터 확인한다. 자주 보는 원인은 대상 datastore 용량 부족, 기준 값 VMDK 경로 오타, snapshot chain, 기준 값 스토리지 읽기 오류다.
tail -n 100 /var/log/vmkernel.log
tail -n 100 /var/log/hostd.log
ls -lh "/vmfs/volumes/${TARGET_DS}/${VM_NAME}/"6. VMX와 부가 파일 복사
VM 설정 파일인 .vmx는 별도로 복사해야 한다. .nvram, .vmxf 등 부가 파일도 있으면 함께 복사한다. 로그 파일은 필수는 아니지만 이관 근거를 남기고 싶으면 같이 보관할 수 있다.
cp "/vmfs/volumes/${SOURCE_DS}/${VM_NAME}/${VM_NAME}.vmx" \
"/vmfs/volumes/${TARGET_DS}/${VM_NAME}/"
cp "/vmfs/volumes/${SOURCE_DS}/${VM_NAME}/"*.nvram \
"/vmfs/volumes/${TARGET_DS}/${VM_NAME}/" 2>/dev/null || true
cp "/vmfs/volumes/${SOURCE_DS}/${VM_NAME}/"*.vmxf \
"/vmfs/volumes/${TARGET_DS}/${VM_NAME}/" 2>/dev/null || trueVMX 안에 디스크 파일명이 절대 경로로 박혀 있으면 target datastore 기준으로 수정해야 한다. 일반적으로 같은 디렉터리 안에 같은 이름의 VMDK를 만들면 VMX의 상대 경로를 그대로 쓸 수 있다.
grep -nE 'fileName|scsi|sata|nvme|ethernet' \
"/vmfs/volumes/${TARGET_DS}/${VM_NAME}/${VM_NAME}.vmx"7. 새 위치의 VM 등록
기존 VM을 그대로 두고 새 datastore의 VMX를 추가 등록하면 같은 VM이 목록에 두 개 보일 수 있다. 운영에서는 먼저 기존 VM을 unregister할지, 검증 후 삭제할지 정책을 정해야 한다. 랩에서는 새 VMX를 등록한 뒤 부팅 검증을 하고 기존 경로를 정리하는 방식이 안전하다.
NEW_VMX="/vmfs/volumes/${TARGET_DS}/${VM_NAME}/${VM_NAME}.vmx"
vim-cmd solo/registervm "${NEW_VMX}"
vim-cmd vmsvc/getallvms | grep -i "${VM_NAME}"8. 부팅과 디스크 검증
등록 후 새 VMID를 확인하고 전원을 켠다. 처음 부팅할 때 ESXi가 "moved or copied" 질문을 할 수 있다. 같은 VM을 이동한 작업이라면 일반적으로 "I moved it"에 해당하는 선택을 해야 MAC 주소와 UUID 충돌 위험을 줄일 수 있다.
NEW_VMID="456"
vim-cmd vmsvc/power.on "${NEW_VMID}"
vim-cmd vmsvc/power.getstate "${NEW_VMID}"
tail -n 100 /var/log/vmkernel.log
tail -n 100 /var/log/hostd.logguest OS 부팅 후에는 파일시스템, 서비스, IP, 애플리케이션 로그를 확인한다. 단순히 VM 전원이 켜졌다는 것만으로 마이그레이션 성공으로 보지 않는다.
# Linux guest 예시
df -h
ip addr
systemctl --failed
journalctl -p warning -n 100 --no-pager9. 기존 VM 정리
새 datastore에서 정상 동작을 확인한 뒤 기존 VM을 unregister하거나 백업 보관 기간 이후 삭제한다. 삭제 전에 기준 값과 대상 경로를 다시 한 번 확인한다.
vim-cmd vmsvc/getallvms
ls -lh "/vmfs/volumes/${SOURCE_DS}/${VM_NAME}/"
ls -lh "/vmfs/volumes/${TARGET_DS}/${VM_NAME}/"정리
vmkfstools -i 자체는 짧은 명령이지만 ESXi VM 마이그레이션 작업은 짧게 보면 안 된다. snapshot이 없는지 확인하고, VM을 정상 종료하고, VMDK를 clone하고, VMX를 새 위치에 등록한 뒤 guest OS 레벨까지 검증해야 한다. vCenter와 Storage vMotion을 쓸 수 있는 환경이라면 그 기능을 우선 검토하고, 단일 호스트나 랩 환경에서는 cold clone 절차를 작업표처럼 따라가는 것이 좋다.