Linux 환경 구축

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

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

0. 사전 확인

아키텍처 및 가상화 지원 확인

# 아키텍처 확인
uname -m   # x86_64 이어야 함

# KVM 하드웨어 가상화 지원 확인
egrep -c '(vmx|svm)' /proc/cpuinfo   # 0이면 KVM 사용 불가 (VirtualBox 등 nested VM 환경)

# KVM 모듈 로드 여부 확인
lsmod | grep kvm

KVM 사용 불가 환경

이미 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을 제거하고 소프트웨어 에뮬레이션으로 실행합니다 (느림).

1단계: QEMU 설치

Ubuntu / Debian

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

Fedora / RHEL / CentOS Stream

sudo dnf install -y qemu-system-x86 qemu-img

Arch Linux

sudo pacman -S qemu-system-x86 qemu-img

설치 확인

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

KVM 권한 설정

# 현재 사용자를 kvm 그룹에 추가
sudo usermod -aG kvm $USER

# 재로그인 또는 newgrp으로 즉시 적용
newgrp kvm

# 확인
ls -l /dev/kvm   # crw-rw----  group: kvm 이면 OK

2단계: Ubuntu 22.04 ISO 다운로드

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

3단계: 디스크 이미지 생성

디스크 분리 이유 실습 중 NVMe 드라이버를 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

4단계: Ubuntu 22.04 설치

사전 확인 1단계의 KVM 권한 설정(sudo usermod -aG kvm $USER)을 완료했는지 확인하세요. 설정하지 않으면 qemu-system-x86_64 실행 시 permission denied /dev/kvm 오류가 발생합니다.
WSL 사용자 주의 WSL 환경에서는 -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
설치 중 주의사항
  • 언어/키보드/네트워크: 기본값 유지
  • OpenSSH server 설치: 반드시 선택 (스페이스바로 체크)
  • Storage: LVM 설정 시 전체 디스크를 사용하도록 설정 (커널 빌드에 최소 20GB 이상 필요). 기본값이 디스크의 절반만 할당하므로, 설치 후 sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv && sudo resize2fs /dev/ubuntu-vg/ubuntu-lv 로 확장하거나, 설치 중 "Custom storage layout"에서 전체 크기를 할당할 것
  • 추가 패키지: 선택 안 해도 됨
  • 설치 완료 후 "Reboot Now" → 콘솔에서 Ctrl+A X로 QEMU 종료

5단계: 설치 후 VM 기동 (NVMe 포함)

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
참고 처음 접속 시 host key 경고가 나오면 yes 입력

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

Guest VM에 SSH 접속한 상태에서 진행합니다.

방법 A: Ubuntu Mainline PPA 이용 (권장, 빠름)

# 도구 설치
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

방법 B: 소스 컴파일 (커스텀 커널 5.18.0-rc6-dpas-fast26 필요 시)

참고 강의에서 별도 config 파일이 제공되는 경우 사용
# 빌드 의존성 설치
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

7단계: NVMe Polling 동작 확인

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

편의 스크립트

VM 시작 스크립트

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

alias 등록

# ~/.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 directoryKVM 모듈 미로드 또는 권한 없음sudo modprobe kvm_intel (또는 kvm_amd), sudo usermod -aG kvm $USER
permission denied /dev/kvmkvm 그룹 미등록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 제거
← Step 6. 환경 설정 목차 Step 7. 커널 실습 →