- 출처 / 참고: VMware Broadcom Knowledge Base (Powering on a virtual machine fails with the error: Could not power on VM : No swap file - KB 1030262, Virtual machine memory overhead and swap files - KB 1007696)
명령어:
vim-cmd,df,vmkfstools,grep,awk,ls
키워드: Cannot power on VM, No swap file found, disk space low, .vswp, memory reservation, sched.swap.dir, datastore full, overcommit
사용처: vSphere Client에서 가상 머신 부팅 시 스왑 파일(.vswp) 생성 공간 부족으로 인한 전원 인가 차단 장애 긴급 복구
실행예제
vSphere Client 또는 ESXi 호스트에서 가상 머신(VM) 전원을 켤 때 Could not power on VM : No swap file found 또는 There is no more space for virtual machine swap file 오류가 발생하며 부팅이 거부될 때, ESXi SSH 셸에서 VM의 메모리 할당량, 예약(Reservation) 상태, 그리고 대상 데이터스토어의 실제 잔여 용량을 진단합니다.
# 1. ESXi 호스트 관점: CLI로 가상 머신 전원 켜기(Power-on) 시도 및 실패 에러 확인
$ vim-cmd vmsvc/power.on 108
# Powering on VM:
# Failed to power on 108: Could not power on VM : No swap file
# 또는
# Cannot open the dirty block tracking file: There is no more space for virtual machine swap file
# 2. 대상 가상 머신의 vmware.log에서 스왑 파일 생성 실패 로그 확인
$ tail -n 30 /vmfs/volumes/datastore1/App-Server-02/vmware.log | grep -iE "vswp|swap|space"
# [출력 예시]
# Msg_Post: Error
# [msg.vmmon.poweron.failed] Could not power on VM : No swap file
# [msg.mainmem.alloc.vswp] There is no more space for the virtual machine swap file '/vmfs/volumes/datastore1/App-Server-02/App-Server-02-12345678.vswp'.
# Failed to create swap file of size 33554432 KB (32768 MB).
# 3. 대상 VM의 메모리 크기 및 메모리 예약(Reservation) 수치 확인
$ vim-cmd vmsvc/get.summary 108 | grep -i "memorySizeMB"
# memorySizeMB = 32768, <-- 32GB 메모리 할당
$ grep -iE "sched.mem.min|sched.swap.dir" /vmfs/volumes/datastore1/App-Server-02/App-Server-02.vmx
# (출력 없음 -> 예약 메모리가 0MB이므로 부팅 시 32GB 크기의 .vswp 파일 생성이 강제됨)
# 4. 데이터스토어 실제 가용 용량 확인
$ df -h /vmfs/volumes/datastore1
# Filesystem Size Used Available Use% Mounted on
# VMFS-6 1.0T 1.0T 4.2G 100% /vmfs/volumes/datastore1
# -> 데이터스토어 가용 공간(4.2GB)이 필요한 스왑 파일 크기(32GB)보다 작아 부팅 실패 확인
스크립트
ESXi 호스트 셸에서 전원이 꺼져 있는 특정 가상 머신의 메모리 크기와 메모리 예약 설정을 파악하여 부팅 시 요구되는 스왑 파일(.vswp)의 크기를 계산하고, 데이터스토어 여유 공간과 비교하여 즉시 부팅 가능 여부를 판별해 주는 진단/대응 쉘 스크립트입니다.
#!/bin/sh
# check_vm_swap_space.sh - Diagnose VM swap file space issues on VMware ESXi
VM_IDENTIFIER=${1:-""}
echo "=========================================="
echo " [VM 전원 켜기 및 스왑 파일(.vswp) 진단]"
echo "=========================================="
if [ -z "$VM_IDENTIFIER" ]; then
echo " [오류] 가상 머신 이름 또는 VMID를 입력하십시오."
echo " 사용법: $0 <VM_Name_or_VMID>"
exit 1
fi
# 1. VMID 및 메타데이터 추출
if echo "$VM_IDENTIFIER" | grep -qE "^[0-9]+$"; then
VMID="$VM_IDENTIFIER"
VM_NAME=$(vim-cmd vmsvc/get.summary "$VMID" 2>/dev/null | grep "name =" | head -n 1 | awk -F'"' '{print $2}')
else
VM_NAME="$VM_IDENTIFIER"
VMID=$(vim-cmd vmsvc/getallvms 2>/dev/null | grep -F "$VM_NAME" | head -n 1 | awk '{print $1}')
fi
if [ -z "$VMID" ]; then
echo " [오류] 가상 머신을 찾을 수 없습니다: ${VM_IDENTIFIER}"
exit 1
fi
VMX_PATH=$(vim-cmd vmsvc/get.summary "$VMID" 2>/dev/null | grep "vmPathName =" | awk -F'"' '{print $2}')
VM_DIR=$(dirname "$VMX_PATH")
echo " - 가상 머신명 : ${VM_NAME} (VMID: ${VMID})"
echo " - VMX 디렉터리: ${VM_DIR}"
# 2. 메모리 크기 및 예약량(Reservation) 추출
MEM_SIZE_MB=$(vim-cmd vmsvc/get.summary "$VMID" 2>/dev/null | grep "memorySizeMB" | awk '{print $3}' | tr -d ',')
MEM_RES_MB=$(grep -i "sched.mem.min" "${VM_DIR}"/*.vmx 2>/dev/null | awk -F'=' '{print $2}' | tr -d ' "')
MEM_RES_MB=${MEM_RES_MB:-0}
# 생성될 스왑 파일 크기 = 할당 메모리 - 예약 메모리
SWAP_REQUIRED_MB=$((MEM_SIZE_MB - MEM_RES_MB))
SWAP_REQUIRED_GB=$(awk "BEGIN {printf \"%.2f\", $SWAP_REQUIRED_MB / 1024}")
echo -e "\n[1] 가상 머신 메모리 요구량:"
echo " - 할당 메모리(Configured) : ${MEM_SIZE_MB} MB"
echo " - 예약 메모리(Reservation): ${MEM_RES_MB} MB"
echo " - 부팅 시 필요 스왑 크기 : ${SWAP_REQUIRED_MB} MB (${SWAP_REQUIRED_GB} GB)"
# 3. 스왑 파일이 저장될 데이터스토어 여유 공간 검사
SWAP_DIR=$(grep -i "sched.swap.dir" "${VM_DIR}"/*.vmx 2>/dev/null | awk -F'=' '{print $2}' | tr -d ' "')
TARGET_CHECK_DIR=${SWAP_DIR:-"$VM_DIR"}
DS_INFO=$(df -k "$TARGET_CHECK_DIR" | tail -n 1)
DS_AVAIL_KB=$(echo "$DS_INFO" | awk '{print $4}')
DS_AVAIL_MB=$((DS_AVAIL_KB / 1024))
DS_AVAIL_GB=$(awk "BEGIN {printf \"%.2f\", $DS_AVAIL_MB / 1024}")
DS_MOUNT=$(echo "$DS_INFO" | awk '{print $6}')
echo -e "\n[2] 대상 데이터스토어 가용 공간:"
echo " - 스왑 대상 경로 : ${TARGET_CHECK_DIR}"
echo " - 가용 디스크 공간: ${DS_AVAIL_GB} GB (${DS_AVAIL_MB} MB)"
# 4. 부팅 가능 여부 판정
echo -e "\n[3] 전원 인가(Power-on) 가능 여부 판정:"
if [ "$DS_AVAIL_MB" -lt "$SWAP_REQUIRED_MB" ]; then
DEFICIT_MB=$((SWAP_REQUIRED_MB - DS_AVAIL_MB))
DEFICIT_GB=$(awk "BEGIN {printf \"%.2f\", $DEFICIT_MB / 1024}")
echo " [치명적 불가] 디스크 공간 부족으로 부팅이 실패합니다! (부족분: ${DEFICIT_GB} GB)"
echo " [즉각 조치 방안]:"
echo " 1) 메모리 100% 예약 설정 (스왑 파일 크기를 0MB로 강제):"
echo " -> vSphere Client: VM 설정 편집 > 메모리 > '모든 게스트 메모리 예약' 체크"
echo " 2) 스왑 파일 위치 변경:"
echo " -> 여유 공간이 충분한 다른 데이터스토어로 스왑 경로 재지정 (sched.swap.dir)"
echo " 3) 불필요한 파일/스냅샷 정리 또는 다른 VM Storage vMotion 이동"
else
echo " [정상] 스왑 파일 생성을 위한 충분한 디스크 공간이 확보되어 있습니다."
echo " -> 예상 여유분: $(awk "BEGIN {printf \"%.2f\", ($DS_AVAIL_MB - $SWAP_REQUIRED_MB)/1024}") GB"
fi
echo -e "\n=========================================="
echo " [진단 완료]"
echo "=========================================="
해설
VMware ESXi에서 가상 머신을 켤 때 발생하는 Could not power on VM : No swap file found 또는 디스크 공간 부족 에러는 게스트 OS 내부의 리눅스 스왑 파티션 문제가 아니라, ESXi 하이퍼바이저가 가상 머신의 메모리 오버커밋(Memory Overcommit)을 보장하기 위해 생성하는 가상 머신 스왑 파일(.vswp)을 데이터스토어에 물리적으로 생성하지 못해 발생합니다.
1. .vswp 파일 생성 크기 결정 공식
ESXi는 가상 머신이 전원을 켜는 순간, 호스트의 물리 메모리가 부족해질 경우를 대비하여 가상 머신 디렉터리에 .vswp 파일을 미리 할당합니다. 이 파일의 크기는 다음 공식으로 정확히 결정됩니다:
- 예약(Reservation)이 0MB인 경우 (기본값):
- VM에 64GB RAM을 할당했다면 부팅 시 데이터스토어에 정확히 64GB 크기의
.vswp파일이 단번에 생성되어야 합니다. - 이때 데이터스토어의 남은 공간이 63GB라면 단 1GB 부족으로 인해 부팅이 즉각 거부됩니다.
- VM에 64GB RAM을 할당했다면 부팅 시 데이터스토어에 정확히 64GB 크기의
- 메모리를 100% 예약(Full Reservation)한 경우:
- 할당 메모리 64GB에 예약 메모리도 64GB로 잡으면 스왑 파일 요구 크기는 0MB가 되므로, 데이터스토어에 여유 공간이 단 수 MB만 남아 있어도 전원이 정상적으로 켜집니다.
2. 주요 발생 원인
- 데이터스토어 잔여 용량 한계 도달 (Thin Provisioning 착시):
- 씬 프로비저닝(Thin Provisioning)된 가상 디스크들이 동작 중 용량을 잠식하여 데이터스토어가 98~99%까지 차오른 상태에서, 유지보수를 위해 VM을 재부팅(Power Off 후 Power On)하려 할 때 스왑 파일 재생성 공간이 없어 부팅 불가 상태에 빠지는 경우.
- 이전 비정상 종료로 인한 고아
.vswp잔존 및 락(Lock):- 호스트 장애 등으로 VM이 꺼졌으나 이전에 생성되었던
.vswp파일 핸들이 제대로 닫히지 않고 데이터스토어에 남아 있어 신규 스왑 생성을 방해하는 경우.
- 호스트 장애 등으로 VM이 꺼졌으나 이전에 생성되었던
- 지정된 스왑 데이터스토어 언마운트:
- 클러스터 레벨에서 “별도 스왑 데이터스토어”를 지정해 두었으나 해당 LUN이 스토리지 경로 장애로 오프라인(Inaccessible) 상태가 된 경우.
3. 단계별 긴급 해결 방법
방법 1: 메모리 전액 예약(Full Memory Reservation) 적용 (가장 빠른 긴급 복구)
디스크 용량을 즉시 확보하기 힘든 상황에서 VM을 당장 켜야 할 때 사용하는 방법입니다.
- vSphere Client에서 대상 VM 우클릭 $\rightarrow$ 설정 편집(Edit Settings)으로 이동합니다.
- 메모리(Memory) 항목을 확장하고, “모든 게스트 메모리 예약(Reserve all guest memory)” 체크박스에 체크합니다.
- 저장 후 전원을 켭니다.
- 메모리를 100% 예약하면 ESXi는 호스트 물리 RAM에서 이 가상 머신의 메모리를 완전히 고정 보장하므로,
.vswp파일 생성 요구 크기가 0 Byte가 되어 디스크 공간 부족 에러를 우회하여 즉시 부팅됩니다.
- 메모리를 100% 예약하면 ESXi는 호스트 물리 RAM에서 이 가상 머신의 메모리를 완전히 고정 보장하므로,
방법 2: 스왑 파일 저장 위치 분리 (sched.swap.dir)
데이터스토어 A가 가득 찼다면, 여유 공간이 넉넉한 데이터스토어 B로 스왑 파일 저장 경로만 우회시킵니다.
- vSphere Client $\rightarrow$ VM 설정 편집 $\rightarrow$ 가상 시스템 옵션(VM Options) $\rightarrow$ 고급(Advanced) $\rightarrow$ 스왑 파일 위치(Swapfile Location)를 선택합니다.
- “가상 시스템과 함께 저장” 대신 “호스트에 지정된 스왑 데이터스토어” 또는 특정 데이터스토어를 지정합니다.
- VMX 파라미터 직접 수정 시:
sched.swap.dir = "/vmfs/volumes/datastore_backup/vm_swaps/"
방법 3: 데이터스토어 불필요 파일 정리
- 오래된 로그 파일(
vmware*.log), 코어 덤프 파일(vm-*.core), 또는 이미 삭제되었으나 남아있는 고아 델타 디스크 파일들을 점검하여 삭제합니다. - 여유 공간이 있는 다른 데이터스토어로 다른 가동 중인 VM을 Storage vMotion 시켜 공간을 비웁니다.
주의사항
- 메모리 전액 예약(Full Reservation) 남발 시 호스트 메모리 고갈 주의:
- 긴급 복구를 위해 ‘모든 게스트 메모리 예약’을 설정하면 스왑 공간 문제는 해결되지만, ESXi 호스트 레벨에서 물리 RAM이 완전히 묶이게 됩니다. 호스트의 물리 메모리 여유가 없는 상태에서 대용량 VM들에 예약을 남발하면 다른 가상 머신들이 메모리 부족으로 켜지지 않는 연쇄 장애가 발생할 수 있습니다.
- 재부팅 전에 데이터스토어 여유 공간을 항상 확인할 것:
- 전원이 켜져 있을 때는 이미 스왑 파일이 잡혀 있으므로 정상 작동하지만, 정기 점검이나 커널 패치로 전원을 끄는 순간 기존
.vswp파일이 삭제됩니다. 이후 다시 켤 때 공간이 1바이트라도 부족하면 부팅이 거부되므로, 씬 프로비저닝 환경에서는 재부팅 전에 반드시 데이터스토어 여유 용량을 점검해야 합니다.
- 전원이 켜져 있을 때는 이미 스왑 파일이 잡혀 있으므로 정상 작동하지만, 정기 점검이나 커널 패치로 전원을 끄는 순간 기존
- SSD/NVMe 전용 스왑 데이터스토어 권장:
- 스왑 파일 위치를 별도로 분리할 경우, 저속의 저가형 스토리지(SATA/HDD)로 빼두면 호스트 메모리 경합 발생 시 스왑 I/O 병목으로 인해 가상 머신 성능이 극단적으로 곤두박질칠 수 있으므로 고속 플래시 스토리지를 스왑 경로로 지정해야 합니다.