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 |