본문 바로가기

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
PREREQ=""

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

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

echo "VFIO Bind: Running..."

# Auto-detect NVIDIA PCI devices
for dev_path in /sys/bus/pci/devices/*; do
    if [ -f "$dev_path/vendor" ] && [ -f "$dev_path/device" ]; then
        vendor=$(cat "$dev_path/vendor")
        device=$(cat "$dev_path/device")
        if [ "$vendor" = "0x10de" ]; then
            dev=$(basename "$dev_path")

            # Unbind from current driver
            if [ -e "$dev_path/driver" ]; then
                echo "$dev" > "$dev_path/driver/unbind"
            fi

            # Set override
            echo "vfio-pci" > "$dev_path/driver_override"
            echo "$dev" > /sys/bus/pci/drivers_probe
        fi
    fi
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' 카테고리의 다른 글

LLM에 따른 GPU Memory 활용안 #1  (0) 2025.07.08
GPU를 통한 AI 연구시 OS 결정요소 (Linux vs Windows)  (0) 2025.05.07