Content is user-generated and unverified.

CentOS Stream에서 Windows Server 2022 가상화 완벽 가이드

KVM/QEMU 기반 가상화가 CentOS Stream에서 Windows Server 2022를 운영하는 최적의 솔루션입니다. VirtIO 드라이버와 Hyper-V enlightenments를 적용하면 네이티브에 가까운 성능을 달성할 수 있으며, qcow2 백킹 파일 전략을 통해 여러 소프트웨어 상태 간 수 초 내 전환이 가능합니다. 네트워크 접근성이 중요한 환경에서는 Bridge 네트워킹을 권장하며, 일상 작업에는 RDP, 콘솔 접근에는 SPICE/VNC를 병행 사용하는 것이 최선의 접근법입니다.

KVM/QEMU 플랫폼 설치 및 기본 구성

CentOS Stream 8과 9 모두 KVM/QEMU를 완벽히 지원하지만, 패키지 버전과 일부 기능에서 차이가 있습니다. CentOS Stream 9는 QEMU 7.x-9.x 버전을 제공하며, 최신 보안 기능과 성능 개선이 포함되어 있습니다.

핵심 패키지 설치

CentOS Stream 9 설치:

bash
# 핵심 가상화 패키지
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-tools

CentOS Stream 8 설치:

bash
# 가상화 그룹 설치
sudo yum install @virtualization-host

# 또는 개별 패키지
sudo yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install virt-manager

서비스 활성화 및 검증:

bash
# libvirtd 시작 및 자동 시작 설정
sudo systemctl enable --now libvirtd

# KVM 모듈 확인
lsmod | grep kvm   # kvm_intel 또는 kvm_amd 확인

# 가상화 확장 지원 확인
grep -E '(vmx|svm)' /proc/cpuinfo

버전별 주요 차이점

기능CentOS Stream 8CentOS Stream 9
QEMU 버전4.2-6.x7.x-9.x
기본 머신 타입pc, q35q35 권장
SPICE 지원완전 지원제한적 (VNC 기본)
Cockpit 통합사용 가능cockpit-machines 개선

CentOS Stream 9에서는 Red Hat이 SPICE를 점진적으로 deprecated 처리하고 있어 VNC가 기본값입니다. 그러나 SPICE는 여전히 작동하며, USB 리다이렉션이나 클립보드 공유가 필요한 경우 별도 설정으로 사용할 수 있습니다.

VirtIO 드라이버 설치와 Windows 최적화

VirtIO 드라이버는 Windows 게스트의 I/O 성능을 300% 이상 향상시키는 핵심 컴포넌트입니다. Windows Server 2022는 2k22 버전 드라이버를 사용합니다.

드라이버 다운로드 및 설치

bash
# 안정 버전 다운로드
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.iso

Windows 설치 중 드라이버 로드 순서:

  1. VM 생성 시 VirtIO ISO를 두 번째 CD/DVD로 연결
  2. Windows 설치 화면에서 "사용자 지정(고급)" 선택
  3. "드라이버 로드" 클릭 → CD 드라이브 탐색
  4. 필수 드라이버 경로:
    • SCSI: vioscsi\2k22\amd64
    • 네트워크: NetKVM\2k22\amd64
    • Balloon: Balloon\2k22\amd64

설치 후 간편 방법: Windows 부팅 후 VirtIO ISO에서 virtio-win-gt-x64.msi 실행으로 모든 드라이버 및 QEMU Guest Agent 자동 설치

Hyper-V Enlightenments 활성화

Windows 게스트 성능을 극대화하는 핵심 설정입니다. 이 기능들은 Windows가 KVM 위에서 실행됨을 인지하고 최적화된 코드 경로를 사용하도록 합니다.

xml
<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% 성능 향상이 확인됩니다.

디스크 I/O 최적화 설정

xml
<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 백킹 파일 전략이 내부 스냅샷보다 효율적입니다.

내부 스냅샷 vs 외부 스냅샷 비교

특성내부 스냅샷외부 스냅샷
저장 방식단일 qcow2 파일에 내장별도 오버레이 파일
복구 지원virsh snapshot-revert 완전 지원수동 프로세스 필요
생성 속도상대적으로 느림디스크 전용 시 빠름
UEFI VMlibvirt 지원 제한적더 유연함
GUI 지원virt-manager 지원GUI 미노출

권장: 단순한 백업/테스트에는 내부 스냅샷, 빈번한 상태 전환에는 백킹 파일 방식 사용

기본 스냅샷 명령어

bash
# 스냅샷 생성 (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               (현재 활성 오버레이)

상태 전환 스크립트:

bash
#!/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 템플릿 생성 워크플로

  1. 기본 VM 생성: VirtIO 드라이버와 함께 Windows Server 2022 설치
  2. 기본 소프트웨어 설치: 패치, 드라이버, QEMU Guest Agent
  3. Sysprep 실행:
powershell
# Windows에서 실행
c:\windows\system32\sysprep\sysprep.exe /generalize /oobe /shutdown
  1. 템플릿 클론:
bash
virt-clone --original win2022-template --name win2022-base \
  --file /var/lib/libvirt/images/Templates/win2022-base.qcow2

중요: Sysprep 후 복잡한 애플리케이션이 손상될 수 있으므로 철저한 테스트가 필요합니다. 업데이트가 필요한 경우를 대비해 템플릿을 VM 형태로 유지하는 것이 좋습니다.

네트워크 구성 가이드

네트워크 구성은 VM의 접근성과 성능에 직접적인 영향을 미칩니다. 용도에 따라 적절한 모드를 선택해야 합니다.

네트워크 모드 비교 및 선택

시나리오권장 모드이유
프로덕션 Windows ServerBridge외부 접근성, 최적 성능
개발/테스트 환경NAT (기본)설정 간편, 격리됨
고성능 워크로드SR-IOV 또는 macvtap최소 오버헤드
무선 전용 호스트NATBridge 불가
보안 격리 필요Isolated외부 접근 차단
VLAN 필요Open vSwitch표준 Linux 브릿지 VLAN 미지원

Bridge 네트워킹 설정 (권장)

Bridge 네트워킹은 VM이 물리 네트워크에서 독립적인 장치로 인식되어 직접 IP를 할당받습니다. Active Directory 통합이 필요한 Windows Server 환경에 적합합니다.

bash
# 브릿지 인터페이스 생성
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 br0

libvirt에 브릿지 등록:

xml
<!-- /tmp/bridge.xml -->
<network>
  <name>br0</name>
  <forward mode="bridge"/>
  <bridge name="br0"/>
</network>
bash
virsh net-define /tmp/bridge.xml
virsh net-start br0
virsh net-autostart br0

NAT 네트워크 포트 포워딩

외부에서 NAT 네트워크의 VM에 접근하려면 포트 포워딩이 필요합니다. libvirt hooks를 사용하면 VM 시작/중지 시 자동으로 규칙이 적용됩니다.

/etc/libvirt/hooks/qemu 파일 생성:

bash
#!/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
fi
bash
chmod +x /etc/libvirt/hooks/qemu
systemctl restart libvirtd

고정 IP 할당 (DHCP 예약)

bash
# 라이브 업데이트 (재시작 불필요)
virsh net-update default add ip-dhcp-host \
  "<host mac='52:54:00:4c:40:1c' name='winserver2022' ip='192.168.122.50'/>" \
  --live --config

자동화 및 CLI 도구

virsh 명령어와 스크립팅을 통해 VM 라이프사이클을 완전히 자동화할 수 있습니다.

핵심 virsh 명령어 참조

작업명령어
모든 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

자동 스냅샷 로테이션 스크립트

bash
#!/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
fi

Cron 등록:

bash
# /etc/cron.d/kvm-automation
# 매시간 스냅샷
0 * * * * root /usr/local/bin/auto-snapshot.sh win2022-vm

Ansible을 통한 자동화

yaml
---
# 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: yes

Ansible 설치:

bash
ansible-galaxy collection install community.libvirt

Python libvirt API 예제

python
#!/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()

GUI 접근 방법

Windows Server 관리에는 용도별로 다른 접근 방법을 조합하여 사용하는 것이 효과적입니다.

접근 방법 비교

용도권장 방법이유
일상 관리 작업RDP최고 성능, 클립보드/프린터 공유
OS 설치/BIOS 접근VNC 또는 SPICE부팅 전 접근 가능
USB 장치 리다이렉션SPICE네이티브 USB 패스스루 지원
웹 기반 관리Cockpit브라우저에서 어디서나 접근
부팅 문제 해결VNC/SPICEOS 무관 접근

Cockpit 설치 및 사용

Cockpit은 웹 기반으로 VM을 관리할 수 있는 현대적인 도구입니다:

bash
# 설치
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 → 시스템 계정으로 로그인 → "가상 머신" 메뉴

SPICE 최적 설정 (USB/오디오 필요 시)

xml
<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 실행

RDP 활성화 (Windows Server 2022)

powershell
# 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"

Windows Server 2022 라이선싱 고려사항

가상 환경에서의 라이선싱은 복잡하지만 중요한 부분입니다.

핵심 라이선싱 규칙

  • Per Core 라이선싱: 최소 16코어 라이선스/서버, 8코어/프로세서
  • Standard Edition: 라이선스당 2개 VM 허용
  • Datacenter Edition: 무제한 VM 허용 (13개 이상 VM 시 경제적)
  • KVM (서드파티 하이퍼바이저): 모든 물리 코어에 대해 라이선싱 필요

스냅샷과 클론 관련

  • 스냅샷: 백업/테스트 목적 생성 허용, 추가 라이선스 불필요
  • 클론: 동시 실행되는 각 클론마다 별도 라이선스 필요
  • 순차 테스트: 원본 중지 후 클론 테스트 시 단일 라이선스 사용

권장사항: 클론 전 Sysprep 실행으로 새 SID 생성, KMS 또는 MAK 활성화 사용 (AVMA는 Hyper-V 전용)

완전한 VM 구성 예제

아래는 모든 최적화가 적용된 Windows Server 2022 VM 설정입니다:

xml
<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>

운영 권장사항 요약

성능 최적화:

  • VirtIO 드라이버와 QEMU Guest Agent는 필수 설치
  • Hyper-V enlightenments 전체 활성화로 20-30% 성능 향상
  • 디스크에 cache=writeback, io=native 사용 (UPS/BBU 환경)
  • CPU 피닝은 고성능 워크로드에서만 적용

스냅샷 관리:

  • 프로덕션에서 스냅샷 72시간 이상 유지 금지 (성능 저하)
  • 백킹 체인 깊이 4단계 이하 유지
  • 주기적으로 qemu-img convert로 체인 병합
  • 빈번한 상태 전환에는 내부 스냅샷 대신 백킹 파일 전략 사용

네트워크:

  • 외부 접근이 필요한 프로덕션 서버는 Bridge 네트워킹
  • VirtIO 네트워크 드라이버 필수 사용
  • Bridge에서 netfilter 비활성화로 성능 향상

GUI 접근:

  • 일상 작업: RDP (최고 성능, 완전한 Windows 기능)
  • 콘솔/비상 접근: SPICE 또는 VNC
  • 중앙 관리: Cockpit 웹 인터페이스 활용

이 가이드의 설정을 적용하면 CentOS Stream에서 네이티브에 근접한 성능으로 Windows Server 2022를 안정적으로 운영할 수 있으며, 스크립트 기반 자동화로 효율적인 VM 관리가 가능합니다.

Content is user-generated and unverified.
    CentOS Stream에서 Windows Server 2022 가상화 완벽 가이드 | Claude