macOS 환경 구축

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

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

0. 사전 확인: Mac 아키텍처 확인

uname -m

Apple Silicon 주의사항

Apple Silicon은 ARM 아키텍처이므로 x86_64 VM을 HVF 가속으로 실행할 수 없습니다.

방법속도비고
qemu-system-x86_64 (소프트웨어 에뮬레이션)매우 느림비추천
UTM (x86_64 에뮬레이션)느림GUI 편의성 있음
qemu-system-aarch64 (ARM 네이티브 HVF)빠름아래 가이드 기준
권장 Apple Silicon에서는 ARM64 Ubuntu 22.04 + ARM 커널 5.18 조합으로 진행합니다. NVMe polling 동작 원리(poll_queues, io_poll sysfs, fio hipri)는 ARM에서도 동일하게 실습 가능합니다.

1단계: QEMU 설치

Homebrew 설치 (없는 경우)

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

QEMU 설치

brew install qemu

설치 확인

# Intel Mac
qemu-system-x86_64 --version

# Apple Silicon
qemu-system-aarch64 --version

2단계: Ubuntu 22.04 ISO 다운로드

Intel Mac

# 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

Apple Silicon

# 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

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

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

4단계: Ubuntu 설치

Intel Mac

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

Apple Silicon

# 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
Ubuntu 서버 설치 시 주의사항
  • 언어/키보드/네트워크는 기본값
  • 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"에서 전체 크기를 할당할 것
  • 재부팅 후 ISO 제거

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

설치 완료 후 -cdrom 없이, NVMe 디스크를 추가하여 기동합니다.

Intel Mac

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

Apple Silicon

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

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

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

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

# 도구 설치
sudo apt update
sudo apt install -y wget curl

Intel Mac (x86_64) Guest

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

Apple Silicon (arm64) Guest

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

방법 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

# 소스 다운로드 (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

7단계: NVMe Polling 동작 확인

재부팅 후 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

편의 스크립트

반복 기동을 위한 스크립트를 저장해 두면 편리합니다.

Intel Mac: ~/qemu-lab/start-vm.sh

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

접속 alias

# ~/.zshrc 또는 ~/.bashrc에 추가
alias vm-start="~/qemu-lab/start-vm.sh"
alias vm-ssh="ssh -p 2222 <username>@localhost"

트러블슈팅

증상원인해결
Could not access KVM kernel modulemacOS에서 -enable-kvm 사용-accel hvf 로 변경
hvf: Error initializing HVFApple 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
← Step 6. 환경 설정 목차 Step 7. 커널 실습 →