KVM/QEMU 기반 가상화가 CentOS Stream에서 Windows Server 2022를 운영하는 최적의 솔루션입니다. VirtIO 드라이버와 Hyper-V enlightenments를 적용하면 네이티브에 가까운 성능을 달성할 수 있으며, qcow2 백킹 파일 전략을 통해 여러 소프트웨어 상태 간 수 초 내 전환이 가능합니다. 네트워크 접근성이 중요한 환경에서는 Bridge 네트워킹을 권장하며, 일상 작업에는 RDP, 콘솔 접근에는 SPICE/VNC를 병행 사용하는 것이 최선의 접근법입니다.
CentOS Stream 8과 9 모두 KVM/QEMU를 완벽히 지원하지만, 패키지 버전과 일부 기능에서 차이가 있습니다. CentOS Stream 9는 QEMU 7.x-9.x 버전을 제공하며, 최신 보안 기능과 성능 개선이 포함되어 있습니다.
CentOS Stream 9 설치:
# 핵심 가상화 패키지
sudo dnf install qemu-kvm qemu-img libvirt virt-install libvirt-client
# GUI 관리 도구 (데스크톱 환경이 있는 경우)
sudo dnf install virt-manager
# 추가 유틸리티
sudo dnf install bridge-utils virt-top libvirt-devel libguestfs-toolsCentOS Stream 8 설치:
# 가상화 그룹 설치
sudo yum install @virtualization-host
# 또는 개별 패키지
sudo yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install virt-manager서비스 활성화 및 검증:
# libvirtd 시작 및 자동 시작 설정
sudo systemctl enable --now libvirtd
# KVM 모듈 확인
lsmod | grep kvm # kvm_intel 또는 kvm_amd 확인
# 가상화 확장 지원 확인
grep -E '(vmx|svm)' /proc/cpuinfo| 기능 | CentOS Stream 8 | CentOS Stream 9 |
|---|---|---|
| QEMU 버전 | 4.2-6.x | 7.x-9.x |
| 기본 머신 타입 | pc, q35 | q35 권장 |
| SPICE 지원 | 완전 지원 | 제한적 (VNC 기본) |
| Cockpit 통합 | 사용 가능 | cockpit-machines 개선 |
CentOS Stream 9에서는 Red Hat이 SPICE를 점진적으로 deprecated 처리하고 있어 VNC가 기본값입니다. 그러나 SPICE는 여전히 작동하며, USB 리다이렉션이나 클립보드 공유가 필요한 경우 별도 설정으로 사용할 수 있습니다.
VirtIO 드라이버는 Windows 게스트의 I/O 성능을 300% 이상 향상시키는 핵심 컴포넌트입니다. Windows Server 2022는 2k22 버전 드라이버를 사용합니다.
# 안정 버전 다운로드
wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
sudo mv virtio-win.iso /var/lib/libvirt/images/
# 또는 RHEL 기반 패키지 설치
sudo dnf install virtio-win
# ISO 위치: /usr/share/virtio-win/virtio-win.isoWindows 설치 중 드라이버 로드 순서:
vioscsi\2k22\amd64NetKVM\2k22\amd64Balloon\2k22\amd64설치 후 간편 방법: Windows 부팅 후 VirtIO ISO에서 virtio-win-gt-x64.msi 실행으로 모든 드라이버 및 QEMU Guest Agent 자동 설치
Windows 게스트 성능을 극대화하는 핵심 설정입니다. 이 기능들은 Windows가 KVM 위에서 실행됨을 인지하고 최적화된 코드 경로를 사용하도록 합니다.
<features>
<acpi/>
<apic/>
<hyperv mode='custom'>
<relaxed state='on'/> <!-- 워치독 타임아웃 방지, BSOD 예방 -->
<vapic state='on'/> <!-- 가상 APIC, exit-less EOI 처리 -->
<spinlocks state='on' retries='8191'/> <!-- 스핀락 최적화 -->
<vpindex state='on'/>
<runtime state='on'/>
<synic state='on'/>
<stimer state='on'>
<direct state='on'/> <!-- 직접 타이머, 유휴 시 CPU 사용량 감소 -->
</stimer>
<reset state='on'/>
<frequencies state='on'/>
<tlbflush state='on'/> <!-- TLB 플러시 최적화, SMP 성능 향상 -->
<ipi state='on'/>
</hyperv>
</features>
<clock offset='localtime'>
<timer name='hypervclock' present='yes'/> <!-- ~20% 단일 코어 성능 개선 -->
<timer name='hpet' present='no'/>
</clock>hv-time 타이머만으로도 단일 코어 워크로드에서 약 20% 성능 향상이 확인됩니다.
<iothreads>2</iothreads>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='writeback' io='native' discard='unmap' iothread='1'/>
<source file='/var/lib/libvirt/images/win2022.qcow2'/>
<target dev='sda' bus='scsi'/>
</disk>
<controller type='scsi' model='virtio-scsi'>
<driver iothread='1' queues='4'/>
</controller>캐시 모드 선택 가이드:
writeback: BBU RAID 또는 UPS가 있는 환경에서 최고 성능none: 프로덕션 기본값, 데이터 안전성과 성능 균형writethrough: 최대 데이터 안전성, 성능 저하 있음VirtIO-SCSI가 VirtIO-BLK보다 권장됩니다. 다중 디스크 지원, TRIM/discard 지원이 더 우수하며, 유지보수도 활발합니다.
여러 프로그램 상태 간 빠른 전환이 필요한 환경에서는 qcow2 백킹 파일 전략이 내부 스냅샷보다 효율적입니다.
| 특성 | 내부 스냅샷 | 외부 스냅샷 |
|---|---|---|
| 저장 방식 | 단일 qcow2 파일에 내장 | 별도 오버레이 파일 |
| 복구 지원 | virsh snapshot-revert 완전 지원 | 수동 프로세스 필요 |
| 생성 속도 | 상대적으로 느림 | 디스크 전용 시 빠름 |
| UEFI VM | libvirt 지원 제한적 | 더 유연함 |
| GUI 지원 | virt-manager 지원 | GUI 미노출 |
권장: 단순한 백업/테스트에는 내부 스냅샷, 빈번한 상태 전환에는 백킹 파일 방식 사용
# 스냅샷 생성 (VM 꺼진 상태에서)
virsh snapshot-create-as win2022-vm base-state "깨끗한 Windows 설치"
# 라이브 스냅샷 (BIOS 펌웨어 VM만 지원)
virsh snapshot-create-as win2022-vm snap-before-update --atomic
# 스냅샷 목록 트리 형태로 표시
virsh snapshot-list win2022-vm --tree
# 스냅샷 복구
virsh snapshot-revert win2022-vm base-state --running
# 스냅샷 삭제
virsh snapshot-delete win2022-vm snap-before-update이 방식은 각 상태별 오버레이 파일을 생성하여 수 초 내 상태 전환을 가능하게 합니다:
/var/lib/libvirt/images/
├── Templates/
│ └── win2022-base.qcow2 (읽기 전용 기본 이미지)
├── States/
│ ├── win2022-state-clean.qcow2 (기본 상태)
│ ├── win2022-state-sqlserver.qcow2 (SQL Server 설치됨)
│ └── win2022-state-iis.qcow2 (IIS 설치됨)
└── Active/
└── win2022-vm.qcow2 (현재 활성 오버레이)상태 전환 스크립트:
#!/bin/bash
# switch-state.sh - 빠른 VM 상태 전환
VM_NAME="win2022-vm"
STATES_DIR="/var/lib/libvirt/images/States"
ACTIVE_DIR="/var/lib/libvirt/images/Active"
case "$1" in
clean) STATE="win2022-state-clean.qcow2" ;;
sql) STATE="win2022-state-sqlserver.qcow2" ;;
iis) STATE="win2022-state-iis.qcow2" ;;
*) echo "사용법: $0 {clean|sql|iis}"; exit 1 ;;
esac
# VM 중지
virsh destroy $VM_NAME 2>/dev/null
# 현재 오버레이 삭제 및 새 오버레이 생성
rm -f $ACTIVE_DIR/$VM_NAME.qcow2
qemu-img create -f qcow2 -b $STATES_DIR/$STATE -F qcow2 \
$ACTIVE_DIR/$VM_NAME.qcow2
# VM 디스크 경로 업데이트 및 시작
virt-xml $VM_NAME --edit target=vda --disk path=$ACTIVE_DIR/$VM_NAME.qcow2 --update
virsh start $VM_NAME
echo "$1 상태로 전환 완료"# Windows에서 실행
c:\windows\system32\sysprep\sysprep.exe /generalize /oobe /shutdownvirt-clone --original win2022-template --name win2022-base \
--file /var/lib/libvirt/images/Templates/win2022-base.qcow2중요: Sysprep 후 복잡한 애플리케이션이 손상될 수 있으므로 철저한 테스트가 필요합니다. 업데이트가 필요한 경우를 대비해 템플릿을 VM 형태로 유지하는 것이 좋습니다.
네트워크 구성은 VM의 접근성과 성능에 직접적인 영향을 미칩니다. 용도에 따라 적절한 모드를 선택해야 합니다.
| 시나리오 | 권장 모드 | 이유 |
|---|---|---|
| 프로덕션 Windows Server | Bridge | 외부 접근성, 최적 성능 |
| 개발/테스트 환경 | NAT (기본) | 설정 간편, 격리됨 |
| 고성능 워크로드 | SR-IOV 또는 macvtap | 최소 오버헤드 |
| 무선 전용 호스트 | NAT | Bridge 불가 |
| 보안 격리 필요 | Isolated | 외부 접근 차단 |
| VLAN 필요 | Open vSwitch | 표준 Linux 브릿지 VLAN 미지원 |
Bridge 네트워킹은 VM이 물리 네트워크에서 독립적인 장치로 인식되어 직접 IP를 할당받습니다. Active Directory 통합이 필요한 Windows Server 환경에 적합합니다.
# 브릿지 인터페이스 생성
nmcli connection add type bridge con-name br0 ifname br0
# 고정 IP 설정 (또는 DHCP 사용)
nmcli connection modify br0 ipv4.addresses '192.168.1.100/24'
nmcli connection modify br0 ipv4.gateway '192.168.1.1'
nmcli connection modify br0 ipv4.dns '8.8.8.8,8.8.4.4'
nmcli connection modify br0 ipv4.method manual
# 물리 NIC를 브릿지 슬레이브로 추가 (enp0s8을 실제 NIC로 교체)
nmcli connection add type bridge-slave ifname enp0s8 master br0
# 활성화
nmcli connection down enp0s8
nmcli connection up br0libvirt에 브릿지 등록:
<!-- /tmp/bridge.xml -->
<network>
<name>br0</name>
<forward mode="bridge"/>
<bridge name="br0"/>
</network>virsh net-define /tmp/bridge.xml
virsh net-start br0
virsh net-autostart br0외부에서 NAT 네트워크의 VM에 접근하려면 포트 포워딩이 필요합니다. libvirt hooks를 사용하면 VM 시작/중지 시 자동으로 규칙이 적용됩니다.
/etc/libvirt/hooks/qemu 파일 생성:
#!/bin/bash
Guest_name=winserver2022
Guest_ipaddr=192.168.122.50
Host_port=3389
Guest_port=3389
if [ "${1}" = "${Guest_name}" ]; then
if [ "${2}" = "stopped" ] || [ "${2}" = "reconnect" ]; then
/sbin/iptables -D FORWARD -o virbr0 -d ${Guest_ipaddr} -j ACCEPT
/sbin/iptables -t nat -D PREROUTING -p tcp --dport ${Host_port} -j DNAT --to ${Guest_ipaddr}:${Guest_port}
fi
if [ "${2}" = "start" ] || [ "${2}" = "reconnect" ]; then
/sbin/iptables -I FORWARD -o virbr0 -d ${Guest_ipaddr} -j ACCEPT
/sbin/iptables -t nat -I PREROUTING -p tcp --dport ${Host_port} -j DNAT --to ${Guest_ipaddr}:${Guest_port}
fi
fichmod +x /etc/libvirt/hooks/qemu
systemctl restart libvirtd# 라이브 업데이트 (재시작 불필요)
virsh net-update default add ip-dhcp-host \
"<host mac='52:54:00:4c:40:1c' name='winserver2022' ip='192.168.122.50'/>" \
--live --configvirsh 명령어와 스크립팅을 통해 VM 라이프사이클을 완전히 자동화할 수 있습니다.
| 작업 | 명령어 |
|---|---|
| 모든 VM 목록 | virsh list --all |
| VM 시작 | virsh start <vm> |
| 정상 종료 | virsh shutdown <vm> |
| 강제 종료 | virsh destroy <vm> |
| 스냅샷 생성 | virsh snapshot-create-as <vm> --name <snap> --atomic |
| 스냅샷 복구 | virsh snapshot-revert <vm> --snapshotname <snap> --running |
| 스냅샷 목록 | virsh snapshot-list <vm> --tree |
| VM 복제 | virt-clone --original <vm> --name <new> --auto-clone |
| XML 내보내기 | virsh dumpxml <vm> > vm.xml |
| VM 정의 | virsh define vm.xml |
| DHCP 리스 확인 | virsh net-dhcp-leases default |
#!/bin/bash
# auto-snapshot.sh - 자동 스냅샷 생성 및 로테이션
VM_NAME=$1
MAX_SNAPSHOTS=5
SNAP_PREFIX="auto-snap"
# VM 확인
virsh dominfo "$VM_NAME" &>/dev/null || { echo "VM을 찾을 수 없음: $VM_NAME"; exit 1; }
# 스냅샷 생성
SNAP_NAME="${SNAP_PREFIX}-$(date +%Y%m%d-%H%M%S)"
virsh snapshot-create-as --domain "$VM_NAME" --name "$SNAP_NAME" --atomic
# 오래된 스냅샷 로테이션
SNAP_COUNT=$(virsh snapshot-list "$VM_NAME" --name | grep "^${SNAP_PREFIX}" | wc -l)
if [ "$SNAP_COUNT" -gt "$MAX_SNAPSHOTS" ]; then
DELETE_COUNT=$((SNAP_COUNT - MAX_SNAPSHOTS))
virsh snapshot-list "$VM_NAME" --name | grep "^${SNAP_PREFIX}" | \
head -n "$DELETE_COUNT" | while read OLD_SNAP; do
virsh snapshot-delete "$VM_NAME" "$OLD_SNAP"
done
fiCron 등록:
# /etc/cron.d/kvm-automation
# 매시간 스냅샷
0 * * * * root /usr/local/bin/auto-snapshot.sh win2022-vm---
# vm-management.yml
- name: KVM VM 관리
hosts: kvm_hosts
become: yes
tasks:
- name: VM 목록 조회
community.libvirt.virt:
command: list_vms
register: all_vms
- name: VM 시작
community.libvirt.virt:
name: "{{ vm_name }}"
state: running
- name: 자동 시작 설정
community.libvirt.virt:
name: "{{ vm_name }}"
autostart: yesAnsible 설치:
ansible-galaxy collection install community.libvirt#!/usr/bin/env python3
import libvirt
conn = libvirt.open('qemu:///system')
# VM 스냅샷 생성
def create_snapshot(vm_name, snap_name):
dom = conn.lookupByName(vm_name)
snap_xml = f"""
<domainsnapshot>
<name>{snap_name}</name>
<description>API로 생성된 스냅샷</description>
</domainsnapshot>
"""
dom.snapshotCreateXML(snap_xml)
# 사용
create_snapshot('win2022-vm', 'api-snapshot')
conn.close()Windows Server 관리에는 용도별로 다른 접근 방법을 조합하여 사용하는 것이 효과적입니다.
| 용도 | 권장 방법 | 이유 |
|---|---|---|
| 일상 관리 작업 | RDP | 최고 성능, 클립보드/프린터 공유 |
| OS 설치/BIOS 접근 | VNC 또는 SPICE | 부팅 전 접근 가능 |
| USB 장치 리다이렉션 | SPICE | 네이티브 USB 패스스루 지원 |
| 웹 기반 관리 | Cockpit | 브라우저에서 어디서나 접근 |
| 부팅 문제 해결 | VNC/SPICE | OS 무관 접근 |
Cockpit은 웹 기반으로 VM을 관리할 수 있는 현대적인 도구입니다:
# 설치
sudo dnf install cockpit cockpit-machines
# 활성화
sudo systemctl enable --now cockpit.socket
# 방화벽 개방
sudo firewall-cmd --permanent --add-service=cockpit
sudo firewall-cmd --reload접속: https://서버IP:9090 → 시스템 계정으로 로그인 → "가상 머신" 메뉴
<graphics type='spice' autoport='yes'>
<listen type='address' address='127.0.0.1'/>
<image compression='auto_glz'/>
</graphics>
<video>
<model type='qxl' ram='65536' vram='65536' heads='1'/>
</video>
<channel type='spicevmc'>
<target type='virtio' name='com.redhat.spice.0'/>
</channel>
<!-- USB 리다이렉션 -->
<redirdev bus='usb' type='spicevmc'/>
<redirdev bus='usb' type='spicevmc'/>Windows 게스트에 SPICE Guest Tools 설치: VirtIO ISO의 spice-guest-tools-latest.exe 실행
# PowerShell로 RDP 활성화
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -Name "fDenyTSConnections" -Value 0
# NLA (Network Level Authentication) 활성화
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name "UserAuthentication" -Value 1
# 방화벽 규칙 활성화
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"가상 환경에서의 라이선싱은 복잡하지만 중요한 부분입니다.
권장사항: 클론 전 Sysprep 실행으로 새 SID 생성, KMS 또는 MAK 활성화 사용 (AVMA는 Hyper-V 전용)
아래는 모든 최적화가 적용된 Windows Server 2022 VM 설정입니다:
<domain type='kvm'>
<name>win2022-production</name>
<memory unit='GiB'>8</memory>
<vcpu placement='static'>8</vcpu>
<os>
<type arch='x86_64' machine='q35'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<hyperv mode='custom'>
<relaxed state='on'/>
<vapic state='on'/>
<spinlocks state='on' retries='8191'/>
<vpindex state='on'/>
<synic state='on'/>
<stimer state='on'><direct state='on'/></stimer>
<frequencies state='on'/>
<tlbflush state='on'/>
<ipi state='on'/>
</hyperv>
</features>
<cpu mode='host-passthrough'>
<topology sockets='1' cores='4' threads='2'/>
</cpu>
<clock offset='localtime'>
<timer name='hypervclock' present='yes'/>
<timer name='hpet' present='no'/>
</clock>
<iothreads>2</iothreads>
<devices>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='writeback' io='native' iothread='1'/>
<source file='/var/lib/libvirt/images/win2022.qcow2'/>
<target dev='sda' bus='scsi'/>
</disk>
<controller type='scsi' model='virtio-scsi'>
<driver iothread='1' queues='4'/>
</controller>
<interface type='bridge'>
<source bridge='br0'/>
<model type='virtio'/>
</interface>
<graphics type='spice' autoport='yes'>
<listen type='address' address='127.0.0.1'/>
</graphics>
<video>
<model type='qxl' ram='65536' vram='65536' heads='1'/>
</video>
<channel type='spicevmc'>
<target type='virtio' name='com.redhat.spice.0'/>
</channel>
<channel type='unix'>
<target type='virtio' name='org.qemu.guest_agent.0'/>
</channel>
</devices>
</domain>성능 최적화:
cache=writeback, io=native 사용 (UPS/BBU 환경)스냅샷 관리:
qemu-img convert로 체인 병합네트워크:
GUI 접근:
이 가이드의 설정을 적용하면 CentOS Stream에서 네이티브에 근접한 성능으로 Windows Server 2022를 안정적으로 운영할 수 있으며, 스크립트 기반 자동화로 효율적인 VM 관리가 가능합니다.