Windows 환경 구축

Windows에서 QEMU + Linux 5.18 실습 환경 구축

Windows
English
← DPAS 실습 가이드로 돌아가기

0. 사전 확인

시스템 요구사항

가상화 지원 확인

작업 관리자 → 성능 → CPU → 가상화: 사용인지 확인

또는 PowerShell에서:

Get-ComputerInfo -Property HyperVisorPresent, HyperVRequirementVirtualizationFirmwareEnabled

두 가지 방법 선택

방법특징권장 대상
방법 1: WSL2 + QEMULinux 명령어 환경, KVM 가속 지원개발 경험 있는 학생 (권장)
방법 2: Windows 네이티브 QEMUWindows 환경에서 직접 실행WSL2 없는 환경

방법 1: WSL2 + QEMU (권장)

WSL2 내부에서 QEMU를 실행하면 KVM 가속을 사용할 수 있어 성능이 좋습니다.

1-1. WSL2 설치

PowerShell을 관리자 권한으로 실행:

wsl --install

재부팅 후 Ubuntu 22.04 설정 완료 (사용자명/비밀번호 입력).

이미 WSL1이 설치된 경우 WSL2로 업그레이드:

wsl --set-default-version 2
wsl --set-version Ubuntu 2

버전 확인:

wsl --list --verbose
# NAME      STATE   VERSION
# Ubuntu    Running 2          ← 2 이어야 함

1-2. WSL2 내부에서 KVM 확인

WSL2 터미널(Ubuntu)을 열고:

# KVM 장치 존재 여부 확인
ls /dev/kvm
# 없으면: Windows 기능에서 "가상 머신 플랫폼" 활성화 필요 (아래 참조)

/dev/kvm이 없는 경우:

# PowerShell 관리자 권한으로
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
dism.exe /online /enable-feature /featurename:Microsoft-Hyper-V /all /norestart

재부팅 후 WSL2 재시작:

wsl --shutdown
wsl

1-3. WSL2에서 QEMU 설치

sudo apt update
sudo apt install -y qemu-system-x86 qemu-utils

qemu-system-x86_64 --version

1-4. 이후 진행

이후 모든 단계는 WSL2 터미널에서 진행합니다. Linux 가이드 (setup-linux.md)의 2단계부터 동일하게 진행합니다.

mkdir -p ~/qemu-lab && cd ~/qemu-lab

# ISO 다운로드
wget -O ubuntu-22.04-server-amd64.iso \
  https://releases.ubuntu.com/22.04/ubuntu-22.04.5-live-server-amd64.iso

# 디스크 이미지 생성 (OS는 virtio, 테스트는 NVMe로 분리)
qemu-img create -f qcow2 ubuntu.qcow2 30G
qemu-img create -f raw nvme_disk.raw 16G
디스크 분리 이유 실습 중 NVMe 드라이버를 rmmod/insmod로 반복 로드합니다. OS가 NVMe 위에 있으면 드라이버 제거 시 시스템이 멈추므로, OS는 virtio 디스크(/dev/vda)에, 테스트 디스크는 NVMe 디바이스(/dev/nvme0n1)에 분리합니다.

Ubuntu 설치:

qemu-system-x86_64 \
  -m 4G -smp 4 \
  -enable-kvm \
  -drive file=ubuntu.qcow2,if=virtio,format=qcow2 \
  -cdrom ubuntu-22.04-server-amd64.iso \
  -boot d \
  -net nic -net user,hostfwd=tcp::2222-:22 \
  -nographic

설치 후 NVMe 포함 기동:

qemu-system-x86_64 \
  -m 4G -smp 4 \
  -enable-kvm \
  -drive file=ubuntu.qcow2,if=virtio,format=qcow2 \
  -drive file=nvme_disk.raw,id=nvm,if=none,format=raw \
  -device nvme,id=nvme0,serial=deadbeef \
  -device nvme-ns,drive=nvm,bus=nvme0,nsid=1,logical_block_size=512,physical_block_size=512 \
  -net nic -net user,hostfwd=tcp::2222-:22 \
  -nographic

SSH 접속:

ssh -p 2222 <username>@localhost

커널 5.18 설치 및 NVMe 확인은 8단계, 9단계와 동일합니다.

방법 2: Windows 네이티브 QEMU

WSL2를 사용하지 않고 Windows에서 직접 QEMU를 실행합니다. 가속에는 WHPX (Windows Hypervisor Platform)을 사용합니다.

2-1. Windows 기능 활성화

PowerShell을 관리자 권한으로 실행:

# Windows Hypervisor Platform 활성화 (WHPX 가속용)
dism.exe /online /enable-feature /featurename:HypervisorPlatform /all /norestart

# Hyper-V 활성화
dism.exe /online /enable-feature /featurename:Microsoft-Hyper-V-All /all /norestart

재부팅 후 활성화 확인:

Get-WindowsOptionalFeature -Online -FeatureName HypervisorPlatform | Select-Object State
# State: Enabled

2-2. QEMU 설치

방법 A: Scoop 이용 (권장)

# Scoop 설치 (없는 경우)
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
irm get.scoop.sh | iex

# QEMU 설치
scoop install qemu

방법 B: Chocolatey 이용

# Chocolatey 설치 (없는 경우, 관리자 PowerShell)
Set-ExecutionPolicy Bypass -Scope Process -Force
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

# QEMU 설치
choco install qemu

방법 C: 공식 인스톨러

https://www.qemu.org/download/#windows 에서 최신 Windows 인스톨러 다운로드 후 설치.

설치 경로 예: C:\Program Files\qemu

PATH 추가 (PowerShell):

$env:PATH += ";C:\Program Files\qemu"
# 영구 등록
[System.Environment]::SetEnvironmentVariable("PATH", $env:PATH, "Machine")

설치 확인:

qemu-system-x86_64 --version
qemu-img --version

2-3. Ubuntu 22.04 ISO 다운로드

PowerShell:

mkdir $HOME\qemu-lab
cd $HOME\qemu-lab

# PowerShell 7+ 또는 curl 사용
curl.exe -L -o ubuntu-22.04-server-amd64.iso `
  https://releases.ubuntu.com/22.04/ubuntu-22.04.5-live-server-amd64.iso

또는 브라우저에서 직접 다운로드 후 C:\Users\<username>\qemu-lab\에 이동.

2-4. 디스크 이미지 생성

디스크 분리 이유 실습 중 NVMe 드라이버를 rmmod/insmod로 반복 로드합니다. OS가 NVMe 위에 있으면 드라이버 제거 시 시스템이 멈추므로, OS는 virtio 디스크(/dev/vda)에, 테스트 디스크는 NVMe 디바이스(/dev/nvme0n1)에 분리합니다.
cd $HOME\qemu-lab

qemu-img create -f qcow2 ubuntu.qcow2 30G
qemu-img create -f raw nvme_disk.raw 16G

2-5. Ubuntu 설치

cd $HOME\qemu-lab

qemu-system-x86_64 `
  -m 4G -smp 4 `
  -accel whpx `
  -drive file=ubuntu.qcow2,if=virtio,format=qcow2 `
  -cdrom ubuntu-22.04-server-amd64.iso `
  -boot d `
  -net nic -net user,hostfwd=tcp::2222-:22 `
  -nographic
WHPX 가속 불가 시 오류 발생 시 -accel whpx 대신 -accel tcg로 변경 (소프트웨어 에뮬레이션, 느림)
Ubuntu 설치 시 주의사항
  • OpenSSH server 반드시 선택
  • Storage: LVM 설정 시 전체 디스크를 사용하도록 설정 (커널 빌드에 최소 20GB 이상 필요). 기본값이 디스크의 절반만 할당하므로, 설치 후 sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv && sudo resize2fs /dev/ubuntu-vg/ubuntu-lv 로 확장할 것
  • 설치 완료 후 Ctrl+A X로 QEMU 종료

2-6. 설치 후 VM 기동 (NVMe 포함)

cd $HOME\qemu-lab

qemu-system-x86_64 `
  -m 4G -smp 4 `
  -accel whpx `
  -drive file=ubuntu.qcow2,if=virtio,format=qcow2 `
  -drive file=nvme_disk.raw,id=nvm,if=none,format=raw `
  -device nvme,id=nvme0,serial=deadbeef `
  -device nvme-ns,drive=nvm,bus=nvme0,nsid=1,logical_block_size=512,physical_block_size=512 `
  -net nic -net user,hostfwd=tcp::2222-:22 `
  -nographic

2-7. SSH 접속

Windows 10/11에는 OpenSSH 클라이언트가 기본 내장됩니다.

ssh -p 2222 <username>@localhost

SSH가 없는 경우:

# OpenSSH 클라이언트 설치 (관리자 PowerShell)
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

또는 PuTTY 사용:

8단계: Guest 내부 — 커널 5.18 설치

(방법 1, 2 공통 — SSH 접속 후 Guest VM 내부에서 진행)

방법 A: Ubuntu Mainline PPA (권장)

sudo apt update && sudo apt install -y wget

KVER=5.18.0-051800
mkdir -p /tmp/kernel && cd /tmp/kernel

wget \
  https://kernel.ubuntu.com/mainline/v5.18/amd64/linux-image-unsigned-${KVER}-generic_${KVER}.202205222030_amd64.deb \
  https://kernel.ubuntu.com/mainline/v5.18/amd64/linux-modules-${KVER}-generic_${KVER}.202205222030_amd64.deb \
  https://kernel.ubuntu.com/mainline/v5.18/amd64/linux-headers-${KVER}-generic_${KVER}.202205222030_amd64.deb \
  https://kernel.ubuntu.com/mainline/v5.18/amd64/linux-headers-${KVER}_${KVER}.202205222030_all.deb

sudo dpkg -i /tmp/kernel/*.deb
sudo reboot

재접속 후 확인:

ssh -p 2222 <username>@localhost
uname -r
# 5.18.0-051800-generic

방법 B: 소스 컴파일

sudo apt install -y build-essential libncurses-dev bison flex \
  libssl-dev libelf-dev bc pahole dwarves zstd

wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.18-rc6.tar.xz
tar xf linux-5.18-rc6.tar.xz && cd linux-5.18-rc6

cp /boot/config-$(uname -r) .config
make olddefconfig
echo "-dpas-fast26" > localversion

make -j$(nproc) bindeb-pkg
sudo dpkg -i ../linux-image-*.deb ../linux-headers-*.deb
sudo reboot

9단계: NVMe Polling 동작 확인

uname -r
lsblk | grep nvme

# poll_queues 활성화 (nvme 모듈 재로드)
sudo rmmod nvme
sudo modprobe nvme poll_queues=2

cat /sys/block/nvme0n1/queue/io_poll        # 1
cat /sys/block/nvme0n1/queue/io_poll_delay  # -1

sudo apt install -y fio
sudo fio --name=poll_test --filename=/dev/nvme0n1 \
  --ioengine=io_uring --hipri=1 \
  --rw=randread --bs=4k --direct=1 \
  --iodepth=1 --numjobs=1 --runtime=10

편의 스크립트

방법 1 (WSL2): start-vm.sh

WSL2 터미널에서:

cat > ~/qemu-lab/start-vm.sh << 'EOF'
#!/bin/bash
cd ~/qemu-lab
qemu-system-x86_64 \
  -m 4G -smp 4 \
  -enable-kvm \
  -drive file=ubuntu.qcow2,if=virtio,format=qcow2 \
  -drive file=nvme_disk.raw,id=nvm,if=none,format=raw \
  -device nvme,id=nvme0,serial=deadbeef \
  -device nvme-ns,drive=nvm,bus=nvme0,nsid=1,logical_block_size=512,physical_block_size=512 \
  -net nic -net user,hostfwd=tcp::2222-:22 \
  -nographic "$@"
EOF
chmod +x ~/qemu-lab/start-vm.sh

방법 2 (네이티브): start-vm.ps1

# $HOME\qemu-lab\start-vm.ps1
$QEMU_LAB = "$HOME\qemu-lab"
qemu-system-x86_64 `
  -m 4G -smp 4 `
  -accel whpx `
  -drive "file=$QEMU_LAB\ubuntu.qcow2,if=virtio,format=qcow2" `
  -drive "file=$QEMU_LAB\nvme_disk.raw,id=nvm,if=none,format=raw" `
  -device nvme,id=nvme0,serial=deadbeef `
  -device nvme-ns,drive=nvm,bus=nvme0,nsid=1,logical_block_size=512,physical_block_size=512 `
  -net nic -net user,hostfwd=tcp::2222-:22 `
  -nographic

실행:

.\start-vm.ps1
# ExecutionPolicy 오류 시: Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

트러블슈팅

증상원인해결
WHPX: Failed to initializeWindows Hypervisor Platform 미활성PowerShell 관리자로 HypervisorPlatform 기능 활성화 후 재부팅
WHPX not supportedHyper-V와 충돌 또는 하드웨어 미지원-accel tcg 로 변경 (느림)
qemu-system-x86_64: command not foundPATH 미등록QEMU 설치 경로를 PATH에 추가
PowerShell 줄바꿈 오류백틱(`) 뒤 공백백틱(`) 뒤에 공백/탭 없도록 확인
SSH Connection refusedVM 부팅 중30~60초 대기 후 재시도
nvme0n1 없음-device nvme 누락QEMU 실행 명령 확인
io_poll 값이 0Guest 커널 5.19+uname -r 확인, 커널 5.18 재설치
WSL2에서 /dev/kvm 없음Hyper-V 비활성HypervisorPlatformMicrosoft-Hyper-V 기능 활성화
PuTTY Connection timed out포트 포워딩 오류QEMU에서 hostfwd=tcp::2222-:22 확인, Windows 방화벽 확인