Hyper-V 스냅샷과 체크포인트 완벽 관리 가이드
Hyper-V의 체크포인트(구 스냅샷)는 가상 머신의 특정 시점 상태를 저장하여 빠르게 롤백할 수 있는 강력한 기능입니다. 그러나 잘못 사용하면 성능 저하와 데이터 손실로 이어질 수 있어 올바른 이해가 필요합니다.
스탠다드 체크포인트 vs 프로덕션 체크포인트
| 구분 | 스탠다드 체크포인트 | 프로덕션 체크포인트 |
|---|---|---|
| 저장 대상 | VM 메모리 상태 포함 | 메모리 상태 미포함 |
| 복원 결과 | 체크포인트 시점 그대로 | 재부팅 후 시작 |
| 데이터베이스 | 정합성 보장 어려움 | VSS 활용, 정합성 보장 |
| 권장 용도 | 개발/테스트 환경 | 프로덕션 환경 |
PowerShell로 체크포인트 관리
체크포인트 생성
# 단일 VM 체크포인트 생성
Checkpoint-VM -Name "WebServer01" -SnapshotName "패치 적용 전 $(Get-Date -Format 'yyyyMMdd')"
# 여러 VM 일괄 체크포인트
$vms = @("WebServer01", "DBServer01", "AppServer01")
$vms | ForEach-Object {
Checkpoint-VM -Name $_ `
-SnapshotName "월간백업-$(Get-Date -Format 'yyyy-MM')"
Write-Host "$_ 체크포인트 생성 완료"
}
# 프로덕션 체크포인트 설정 및 생성
Set-VM -Name "DBServer01" -CheckpointType Production
Checkpoint-VM -Name "DBServer01" -SnapshotName "DB 마이그레이션 전"
체크포인트 목록 확인
# 특정 VM의 체크포인트 목록
Get-VMSnapshot -VMName "WebServer01" |
Select-Object Name, CreationTime, ParentSnapshotName |
Format-Table -AutoSize
# 모든 VM의 체크포인트
Get-VM | ForEach-Object {
$vm = $_
Get-VMSnapshot -VMName $vm.Name |
Select-Object @{N='VM';E={$vm.Name}}, Name, CreationTime
} | Format-Table -AutoSize
# 체크포인트 용량 확인
Get-VMSnapshot -VMName "WebServer01" |
Select-Object Name, CreationTime,
@{N='SizeGB'; E={[math]::Round($_.HardDrives.FileSize/1GB,2)}}
체크포인트 복원
# VM 종료 후 체크포인트 복원
Stop-VM -Name "WebServer01" -Force
$checkpoint = Get-VMSnapshot -VMName "WebServer01" |
Where-Object { $_.Name -like "패치 적용 전*" } |
Sort-Object CreationTime -Descending |
Select-Object -First 1
Restore-VMSnapshot -VMSnapshot $checkpoint -Confirm:$false
# VM 재시작
Start-VM -Name "WebServer01"
Write-Host "복원 완료: $($checkpoint.Name)"
체크포인트 삭제
# 특정 체크포인트 삭제
Remove-VMSnapshot -VMName "WebServer01" -Name "오래된 체크포인트"
# 30일 이상 된 체크포인트 자동 삭제
Get-VM | ForEach-Object {
Get-VMSnapshot -VMName $_.Name |
Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-30) } |
ForEach-Object {
Write-Host "삭제: $($_.VMName) - $($_.Name)"
Remove-VMSnapshot -VMSnapshot $_ -Confirm:$false
}
}
체크포인트 사용 시 주의사항
# 체크포인트 보유 현황 리포트
$report = Get-VM | ForEach-Object {
$snapshots = Get-VMSnapshot -VMName $_.Name
[PSCustomObject]@{
VM = $_.Name
State = $_.State
SnapshotCount = $snapshots.Count
OldestSnapshot = ($snapshots | Sort-Object CreationTime | Select-Object -First 1).CreationTime
CheckpointType = $_.CheckpointType
}
}
$report | Where-Object { $_.SnapshotCount -gt 0 } |
Format-Table -AutoSize
# 경고: 프로덕션 VM에 스냅샷이 너무 많으면 성능 저하
$report | Where-Object { $_.SnapshotCount -gt 3 } |
ForEach-Object { Write-Warning "$($_.VM): 체크포인트 수 $($_.SnapshotCount)개 - 정리 필요" }
AVHD 파일 병합 (체크포인트 삭제 후)
# 체크포인트 삭제 후 AVHD 파일이 자동 병합되나 확인
$vm = Get-VM -Name "WebServer01"
$merging = $vm.HardDrives |
Where-Object { $_.Path -like "*.avhd*" }
if ($merging) {
Write-Host "AVHD 병합 진행 중... VM 종료 상태에서 완료됩니다."
} else {
Write-Host "AVHD 파일 없음 - 체크포인트 완전히 정리됨"
}
자동 체크포인트 스케줄링
# 매주 일요일 새벽 1시 자동 체크포인트 생성 스크립트
$script = @'
$vms = Get-VM | Where-Object { $_.State -eq "Running" }
foreach ($vm in $vms) {
$snapName = "Weekly-$(Get-Date -Format 'yyyyMMdd')"
Checkpoint-VM -Name $vm.Name -SnapshotName $snapName
# 5개 초과 체크포인트 삭제
$snaps = Get-VMSnapshot -VMName $vm.Name | Sort-Object CreationTime
if ($snaps.Count -gt 5) {
$snaps | Select-Object -First ($snaps.Count - 5) |
Remove-VMSnapshot -Confirm:$false
}
}
'@
$action = New-ScheduledTaskAction `
-Execute "PowerShell.exe" `
-Argument "-NonInteractive -Command `"$script`""
$trigger = New-ScheduledTaskTrigger `
-Weekly -DaysOfWeek Sunday -At "01:00"
Register-ScheduledTask `
-TaskName "WeeklyVMCheckpoint" `
-Action $action `
-Trigger $trigger `
-RunLevel Highest `
-Force
프로덕션 환경에서는 체크포인트를 장기 백업 수단으로 사용하지 마세요. 체크포인트 수가 늘어날수록 I/O 체인이 길어져 성능이 저하됩니다. 정기적인 체크포인트 생성 후 불필요한 것은 즉시 삭제하고, 실제 백업은 Windows Server Backup이나 전용 백업 솔루션을 활용하세요.
댓글남기기