macOS에서 QEMU + Linux 5.18 실습 환경 구축
macOSuname -m
x86_64 → Intel Mac → 3단계로 바로 진행arm64 → Apple Silicon (M1/M2/M3/M4) → 1단계에서 주의사항 확인Apple Silicon은 ARM 아키텍처이므로 x86_64 VM을 HVF 가속으로 실행할 수 없습니다.
| 방법 | 속도 | 비고 |
|---|---|---|
qemu-system-x86_64 (소프트웨어 에뮬레이션) | 매우 느림 | 비추천 |
| UTM (x86_64 에뮬레이션) | 느림 | GUI 편의성 있음 |
qemu-system-aarch64 (ARM 네이티브 HVF) | 빠름 | 아래 가이드 기준 |
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install qemu
# Intel Mac
qemu-system-x86_64 --version
# Apple Silicon
qemu-system-aarch64 --version
# Ubuntu 22.04.4 LTS (x86_64)
curl -L -o ubuntu-22.04-server-amd64.iso \
https://releases.ubuntu.com/22.04/ubuntu-22.04.5-live-server-amd64.iso
# Ubuntu 22.04.4 LTS (ARM64)
curl -L -o ubuntu-22.04-server-arm64.iso \
https://cdimage.ubuntu.com/releases/22.04/release/ubuntu-22.04.5-live-server-arm64.iso
rmmod/insmod로 반복 로드합니다. OS가 NVMe 위에 있으면 드라이버 제거 시 시스템이 멈추므로, OS는 virtio 디스크(/dev/vda)에, 테스트 디스크는 NVMe 디바이스(/dev/nvme0n1)에 분리합니다.
mkdir -p ~/qemu-lab && cd ~/qemu-lab
# OS 디스크 (Ubuntu 설치용, virtio 연결)
qemu-img create -f qcow2 ubuntu.qcow2 30G
# NVMe 디스크 (실습용, raw 포맷 — O_DIRECT 지원을 위해 raw 필수)
qemu-img create -f raw nvme_disk.raw 16G
cd ~/qemu-lab
qemu-system-x86_64 \
-m 4G -smp 4 \
-accel hvf \
-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
# UEFI 펌웨어 경로 확인
ls $(brew --prefix)/share/qemu/edk2-aarch64-code.fd
cd ~/qemu-lab
qemu-system-aarch64 \
-M virt \
-cpu host \
-m 4G -smp 4 \
-accel hvf \
-bios $(brew --prefix)/share/qemu/edk2-aarch64-code.fd \
-drive file=ubuntu.qcow2,if=virtio,format=qcow2 \
-cdrom ubuntu-22.04-server-arm64.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"에서 전체 크기를 할당할 것설치 완료 후 -cdrom 없이, NVMe 디스크를 추가하여 기동합니다.
cd ~/qemu-lab
qemu-system-x86_64 \
-m 4G -smp 4 \
-accel hvf \
-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
cd ~/qemu-lab
qemu-system-aarch64 \
-M virt \
-cpu host \
-m 4G -smp 4 \
-accel hvf \
-bios $(brew --prefix)/share/qemu/edk2-aarch64-code.fd \
-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
Guest VM에 SSH 접속한 상태에서 진행합니다.
# 도구 설치
sudo apt update
sudo apt install -y wget curl
KVER=5.18.0-051800
mkdir -p /tmp/kernel
wget -P /tmp/kernel \
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
KVER=5.18.0-051800
mkdir -p /tmp/kernel
wget -P /tmp/kernel \
https://kernel.ubuntu.com/mainline/v5.18/arm64/linux-image-unsigned-${KVER}-generic_${KVER}.202205222030_arm64.deb \
https://kernel.ubuntu.com/mainline/v5.18/arm64/linux-modules-${KVER}-generic_${KVER}.202205222030_arm64.deb \
https://kernel.ubuntu.com/mainline/v5.18/arm64/linux-headers-${KVER}-generic_${KVER}.202205222030_arm64.deb \
https://kernel.ubuntu.com/mainline/v5.18/amd64/linux-headers-${KVER}_${KVER}.202205222030_all.deb
sudo dpkg -i /tmp/kernel/*.deb
sudo reboot
재부팅 후 버전 확인:
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
# 소스 다운로드 (rc6 기준)
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
# 컴파일 (코어 수에 맞게 -j 조정)
make -j$(nproc) bindeb-pkg
# 설치
sudo dpkg -i ../linux-image-*.deb ../linux-headers-*.deb
sudo reboot
재부팅 후 SSH 재접속:
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 설치 및 polling 테스트
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
반복 기동을 위한 스크립트를 저장해 두면 편리합니다.
cat > ~/qemu-lab/start-vm.sh << 'EOF'
#!/bin/bash
cd ~/qemu-lab
qemu-system-x86_64 \
-m 4G -smp 4 \
-accel hvf \
-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
# ~/.zshrc 또는 ~/.bashrc에 추가
alias vm-start="~/qemu-lab/start-vm.sh"
alias vm-ssh="ssh -p 2222 <username>@localhost"
| 증상 | 원인 | 해결 |
|---|---|---|
Could not access KVM kernel module | macOS에서 -enable-kvm 사용 | -accel hvf 로 변경 |
hvf: Error initializing HVF | Apple Silicon에서 x86_64 VM 실행 시도 | ARM64 이미지로 전환 |
nvme0n1 디바이스 없음 | poll_queues 옵션 누락 | QEMU 실행 명령 확인 |
io_poll 값이 0 | 커널 5.19+ 또는 CONFIG 미설정 | 커널 5.18 설치 재확인 |
| SSH 접속 불가 | VM 아직 부팅 중 | 30초 대기 후 재시도 |
edk2-aarch64-code.fd 없음 | QEMU brew 버전 문제 | brew reinstall qemu |