본문 바로가기

GPU

GPU PCIe Passthrough 를 통해 VM에 GPU 할당하여 사용하기 (1)

Ubuntu 22.04 KVM GPU Passthrough with VFIO - Full Guide

이 문서는 Ubuntu 22.04 환경에서 KVM 가상 머신에 GPU를 Passthrough 하기 위해 VFIO를 활용한 전체 설정 과정 입니다.


✅ 사전 준비

하드웨어 요구사항

  • VT-d(Intel) 또는 AMD-Vi 지원 CPU
  • IOMMU 지원 메인보드
  • Passthrough 가능한 NVIDIA GPU (ex. RTX 4090)

소프트웨어 구성

sudo apt update
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager ovmf pciutils

✅ IOMMU 활성화

GRUB 설정

sudo nano /etc/default/grub

Intel

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on iommu=pt"

AMD

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=on iommu=pt"
sudo update-grub
sudo reboot

✅ VFIO 바인딩 설정

VFIO 관련 모듈 로드 설정

sudo tee /etc/modules-load.d/vfio.conf <<EOF
vfio
vfio_pci
vfio_virqfd
vfio_iommu_type1
EOF

NVIDIA 드라이버 블랙리스트

sudo tee /etc/modprobe.d/blacklist-nvidia.conf <<EOF
blacklist nouveau
blacklist nvidia
blacklist nvidiafb
blacklist nvidia_drm
blacklist nvidia_uvm
blacklist gdrdrv
blacklist snd_hda_intel
EOF

✅ VFIO 바인딩 장치 ID 지정

4090 GPU + 오디오 장치 ID 기준:

sudo tee /etc/modprobe.d/vfio-pci.conf <<EOF
options vfio-pci ids=10de:2684,10de:22ba
EOF

✅ initramfs 재생성

sudo update-initramfs -u
sudo reboot

❗ 문제 상황: VFIO 바인딩 실패

현상

  • lspci -nnk에서 Kernel driver in use: 비어 있음
  • vfio-pci로 바인딩되지 않고, NVIDIA 드라이버도 사용하지 않는 상태

해결: 수동 바인딩

echo 10de 2684 > /sys/bus/pci/drivers/vfio-pci/new_id
echo 10de 22ba > /sys/bus/pci/drivers/vfio-pci/new_id

echo 0000:1a:00.0 > /sys/bus/pci/devices/0000:1a:00.0/driver/unbind
echo 0000:1a:00.1 > /sys/bus/pci/devices/0000:1a:00.1/driver/unbind
echo 0000:68:00.0 > /sys/bus/pci/devices/0000:68:00.0/driver/unbind
echo 0000:68:00.1 > /sys/bus/pci/devices/0000:68:00.1/driver/unbind

echo 0000:1a:00.0 > /sys/bus/pci/drivers/vfio-pci/bind
echo 0000:1a:00.1 > /sys/bus/pci/drivers/vfio-pci/bind
echo 0000:68:00.0 > /sys/bus/pci/drivers/vfio-pci/bind
echo 0000:68:00.1 > /sys/bus/pci/drivers/vfio-pci/bind

✅ 자동 바인딩 스크립트 설정

설정 파일

echo "ENABLE=1" | sudo tee /etc/vfio-bind.conf

스크립트 생성 (현재 수정중입니다. 사용하지 마세요.)

sudo nano /etc/initramfs-tools/scripts/init-top/vfio-bind
#!/bin/sh

CONFIG=/etc/vfio-bind.conf
if [ -f "$CONFIG" ]; then
    . "$CONFIG"
else
    ENABLE=1
fi

if [ "$ENABLE" != "1" ]; then
    echo "VFIO Bind: Skipped (disabled in config)"
    exit 0
fi

echo "VFIO Bind: Running..."

DEVICES="0000:1a:00.0 0000:1a:00.1 0000:68:00.0 0000:68:00.1"

for dev in $DEVICES; do
    if [ -e "/sys/bus/pci/devices/$dev/driver" ]; then
        echo $dev > "/sys/bus/pci/devices/$dev/driver/unbind"
    fi
    echo vfio-pci > "/sys/bus/pci/devices/$dev/driver_override"
done

for dev in $DEVICES; do
    echo $dev > /sys/bus/pci/drivers_probe
done
sudo chmod +x /etc/initramfs-tools/scripts/init-top/vfio-bind
sudo update-initramfs -u

✅ VFIO ON/OFF 스위치 사용법

동작 명령어
VFIO 바인딩 활성화 `echo "ENABLE=1"
VFIO 비활성화 (드라이버 원복) `echo "ENABLE=0"
설정 반영 sudo update-initramfs -u && sudo reboot

🎉 최종 결과

lspci -nnk | grep -A 3 -i nvidia

출력에 Kernel driver in use: vfio-pci가 나올 경우 성공!

'GPU' 카테고리의 다른 글

GPU를 통한 AI 연구시 OS 결정요소 (Linux vs Windows)  (0) 2025.05.07