Linux에서 QEMU + Linux 5.18 실습 환경 구축
Linux# 아키텍처 확인
uname -m # x86_64 이어야 함
# KVM 하드웨어 가상화 지원 확인
egrep -c '(vmx|svm)' /proc/cpuinfo # 0이면 KVM 사용 불가 (VirtualBox 등 nested VM 환경)
# KVM 모듈 로드 여부 확인
lsmod | grep kvm
vmx: Intel VT-x 지원svm: AMD-V 지원이미 VirtualBox/VMware VM 안에서 작업 중이라면 nested KVM이 필요합니다.
# VirtualBox: 가상머신 설정 > 시스템 > 가속 > "VT-x/AMD-V 중첩 페이징" 활성화 필요
# VMware: VMX 파일에 아래 추가 후 재시작
# vhv.enable = "TRUE"
# nested KVM 활성화 확인
cat /sys/module/kvm_intel/parameters/nested # Y 이면 OK
cat /sys/module/kvm_amd/parameters/nested # (AMD의 경우)
KVM을 사용할 수 없는 경우 -enable-kvm을 제거하고 소프트웨어 에뮬레이션으로 실행합니다 (느림).
sudo apt update
sudo apt install -y qemu-system-x86 qemu-utils
sudo dnf install -y qemu-system-x86 qemu-img
sudo pacman -S qemu-system-x86 qemu-img
qemu-system-x86_64 --version
qemu-img --version
# 현재 사용자를 kvm 그룹에 추가
sudo usermod -aG kvm $USER
# 재로그인 또는 newgrp으로 즉시 적용
newgrp kvm
# 확인
ls -l /dev/kvm # crw-rw---- group: kvm 이면 OK
mkdir -p ~/qemu-lab && cd ~/qemu-lab
wget -O ubuntu-22.04-server-amd64.iso \
https://releases.ubuntu.com/22.04/ubuntu-22.04.5-live-server-amd64.iso
# 다운로드 확인
ls -lh ubuntu-22.04-server-amd64.iso
rmmod/insmod로 반복 로드합니다. OS가 NVMe 위에 있으면 드라이버 제거 시 시스템이 멈추므로, OS는 virtio 디스크(/dev/vda)에, 테스트 디스크는 NVMe 디바이스(/dev/nvme0n1)에 분리합니다.
cd ~/qemu-lab
# OS 디스크 (Ubuntu 설치용, 30GB, virtio 연결)
qemu-img create -f qcow2 ubuntu.qcow2 30G
# NVMe 디스크 (실습용, 16GB, raw 포맷 — O_DIRECT 지원을 위해 raw 필수)
qemu-img create -f raw nvme_disk.raw 16G
ls -lh *.qcow2 *.raw
sudo usermod -aG kvm $USER)을 완료했는지 확인하세요. 설정하지 않으면 qemu-system-x86_64 실행 시 permission denied /dev/kvm 오류가 발생합니다.
-nographic 옵션이 설치 과정에서 문제를 일으킬 수 있습니다. -nographic를 제거하면 WSLg가 QEMU GUI 창을 자동으로 띄워 정상적으로 설치할 수 있습니다. 설치 완료 후 Guest의 GRUB 설정에 console=ttyS0을 추가하면 이후 -nographic 모드를 사용할 수 있습니다:
sudo sed -i 's/^GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"/' /etc/default/grub
sudo update-grub
cd ~/qemu-lab
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
sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv && sudo resize2fs /dev/ubuntu-vg/ubuntu-lv 로 확장하거나, 설치 중 "Custom storage layout"에서 전체 크기를 할당할 것Ctrl+A X로 QEMU 종료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
VM 부팅 완료 후 SSH 접속:
ssh -p 2222 <username>@localhost
yes 입력
Guest VM에 SSH 접속한 상태에서 진행합니다.
# 도구 설치
sudo apt update
sudo apt install -y wget
# 커널 패키지 다운로드 (x86_64)
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
# GRUB 확인 후 재부팅
sudo reboot
재부팅 후 SSH 재접속하여 버전 확인:
ssh -p 2222 <username>@localhost
uname -r
# 5.18.0-051800-generic
5.18.0-rc6-dpas-fast26 필요 시)# 빌드 의존성 설치
sudo apt install -y \
build-essential libncurses-dev bison flex \
libssl-dev libelf-dev bc pahole dwarves zstd
# 소스 다운로드
cd ~
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
# 현재 커널 config 기반으로 시작
cp /boot/config-$(uname -r) .config
make olddefconfig
# localversion 설정 (선택)
echo "-dpas-fast26" > localversion
# 컴파일 (vCPU 수만큼 병렬 빌드)
make -j$(nproc) bindeb-pkg
# 설치
sudo dpkg -i ../linux-image-*.deb ../linux-headers-*.deb
sudo reboot
ssh -p 2222 <username>@localhost
# 커널 버전 확인
uname -r
# NVMe 디바이스 인식 확인
lsblk | grep nvme
# poll_queues 활성화 (nvme 모듈 재로드)
sudo rmmod nvme
sudo modprobe nvme poll_queues=2
# polling 활성화 확인
cat /sys/block/nvme0n1/queue/io_poll # 1
cat /sys/block/nvme0n1/queue/io_poll_delay # -1 (adaptive)
# fio 설치
sudo apt install -y fio
# polling 테스트
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
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
# ~/.bashrc 또는 ~/.zshrc에 추가
echo 'alias vm-start="~/qemu-lab/start-vm.sh"' >> ~/.bashrc
echo 'alias vm-ssh="ssh -p 2222 <username>@localhost"' >> ~/.bashrc
source ~/.bashrc
# 백그라운드로 VM 시작
~/qemu-lab/start-vm.sh -daemonize -pidfile ~/qemu-lab/vm.pid
# VM 종료
kill $(cat ~/qemu-lab/vm.pid)
| 증상 | 원인 | 해결 |
|---|---|---|
Could not access KVM kernel module: No such file or directory | KVM 모듈 미로드 또는 권한 없음 | sudo modprobe kvm_intel (또는 kvm_amd), sudo usermod -aG kvm $USER |
permission denied /dev/kvm | kvm 그룹 미등록 | newgrp kvm 후 재시도 |
nvme0n1 디바이스 없음 | -device nvme 옵션 누락 | QEMU 실행 명령 확인 |
io_poll 값이 0 | 커널 5.19+ 사용 중 | Guest 커널 5.18 설치 재확인 (uname -r) |
| GRUB에서 5.18 선택 안 됨 | 기본 커널이 이전 버전 | GRUB 메뉴에서 "Advanced options" → 5.18 선택, 또는 /etc/default/grub 수정 |
| SSH 접속 거부 | openssh-server 미설치 | sudo apt install openssh-server 후 VM 재시작 |
| nested KVM 미지원 | VM 내 VM 환경 | 호스트 hypervisor에서 nested 가상화 활성화 또는 -enable-kvm 제거 |