목차
- 1. GPU 패스스루가 뭔지 먼저 이해하고 가요
- 2. 사전 조건 확인: 이것부터 체크하세요
- 하드웨어 요구사항
- BIOS/UEFI 설정 확인
- 3. Proxmox 호스트 설정: GRUB부터 손봐야 해요
- 3-1. GRUB 부트 파라미터 수정
- 3-2. 필요한 커널 모듈 로드
- 3-3. GPU 드라이버 블랙리스트 처리
- 3-4. VFIO가 GPU를 먼저 가져가도록 설정
- 3-5. IOMMU 활성화 확인
- 4. VM에 GPU 연결하기: Proxmox 웹 UI 설정
- VM 설정 파일 직접 확인
- 5. VM 내부 드라이버 설치
- Windows VM의 경우
- Linux VM의 경우
- 6. 트러블슈팅: 실제 겪은 문제들
- 문제 1: VM이 부팅 자체가 안 돼요
- 문제 2: GPU는 인식되는데 드라이버 설치 후 화면이 안 나와요
- 문제 3: NVIDIA Code 43 오류
- 문제 4: 재부팅 후 vfio-pci 대신 원래 드라이버가 잡혀요
- 7. 결과 확인: 제대로 동작하는지 검증해봐요
- Linux VM에서 확인
- Windows VM에서 확인
- 8. 정리 및 다음 단계
- 다음에 다룰 주제들
- 자주 묻는 질문 (FAQ)
- Q. Proxmox GPU 패스스루에 특별한 GPU 모델이 필요한가요?
- Q. 패스스루한 GPU를 호스트와 VM이 동시에 쓸 수 있나요?
- Q. VM이 꺼진 후 GPU를 다른 VM에 줄 수 있나요?
- Q. Proxmox 호스트 자체 콘솔이 까맣게 되는데 정상인가요?
Proxmox GPU 패스스루 완벽 가이드: 가상 머신에서 고성능 그래픽 활용
홈랩을 운영하다 보면 한 번쯤은 이런 생각이 드시죠. "Proxmox에서 가상 머신 하나에 GPU를 통째로 붙여서 쓸 수 없을까?" 저도 처음에 이 생각이 들었을 때, 반신반의하면서 시도했다가 꽤 오래 삽질을 했거든요. 결론부터 말씀드리면 — 됩니다. 그것도 꽤 잘 됩니다.
Proxmox GPU 패스스루(GPU Passthrough)는 가상화 호스트에 장착된 물리 GPU를 특정 VM(가상 머신)에 직접 할당해서, 마치 그 VM이 GPU를 단독으로 소유한 것처럼 쓸 수 있게 해주는 기술입니다. 머신러닝 학습 환경 구성, 게임 VM, 렌더링 워크스테이션 등 다양한 용도로 활용할 수 있어서, 인프라 엔지니어로서 이 기능은 정말 게임 체인저였어요.
이 글에서는 제가 직접 수십 번의 시도 끝에 정리한 Proxmox GPU 패스스루 설정 전 과정을 단계별로 공유해 드릴게요. NVIDIA와 AMD 양쪽 다 다뤄보겠습니다.
▲ Proxmox 호스트에서 GPU 패스스루가 이루어지는 전체 아키텍처. 물리 GPU가 IOMMU를 통해 VM에 직접 연결되는 구조를 보여줍니다.
1. GPU 패스스루가 뭔지 먼저 이해하고 가요
쉽게 말해서, 일반적인 가상화에서는 VM들이 가상화된(에뮬레이션된) 하드웨어를 씁니다. GPU도 마찬가지로 가상의 그래픽 카드를 쓰게 되죠. 근데 이렇게 하면 성능이 많이 깎여요. 특히 GPU 연산 집약적인 작업에서는 더더욱.
패스스루(Passthrough)는 이 중간 에뮬레이션 레이어를 없애고, 물리 하드웨어를 VM에 직접 넘겨주는 방식이에요. 이걸 가능하게 해주는 핵심 기술이 바로 IOMMU(Input-Output Memory Management Unit)입니다.
| 구분 | 일반 가상 GPU | GPU 패스스루 |
|---|---|---|
| 방식 | 소프트웨어 에뮬레이션 | 물리 하드웨어 직접 할당 |
| 성능 | 물리 대비 크게 저하 | 물리 성능과 거의 동일 |
| 여러 VM 공유 | 가능 | 불가능 (1 GPU = 1 VM) |
| 드라이버 | Proxmox 제공 가상 드라이버 | 실제 벤더 드라이버 (NVIDIA/AMD) |
| 주요 용도 | 일반 데스크톱 환경 | 머신러닝, 게임, 렌더링 |
한 가지 알아두실 점은, GPU 패스스루를 하면 해당 GPU는 그 VM 전용이 됩니다. Proxmox 호스트 자체나 다른 VM은 그 GPU를 쓸 수 없어요. 그래서 보통 홈랩에서는 GPU가 2개이거나, 아니면 iGPU(내장 그래픽)와 dGPU(외장 그래픽)를 분리해서 쓰는 경우가 많습니다.
2. 사전 조건 확인: 이것부터 체크하세요
본격적으로 시작하기 전에 몇 가지 반드시 확인해야 할 게 있어요. 여기서 막히면 아무리 설정을 잘 해도 안 됩니다. 제가 처음에 이걸 무시하고 진행했다가 몇 시간을 날렸거든요 😅
하드웨어 요구사항
- CPU: Intel VT-d 또는 AMD-Vi(AMD IOMMU) 지원 필수
- 메인보드: IOMMU 지원 + BIOS/UEFI에서 활성화 가능해야 함
- GPU: 패스스루할 GPU (NVIDIA, AMD 모두 가능)
- Proxmox 버전: 7.x 이상 권장 (이 글은 Proxmox VE 7~8 기준)
BIOS/UEFI 설정 확인
메인보드 BIOS에 들어가서 다음 항목들을 활성화해야 합니다.
- Intel 시스템: VT-d (Virtualization Technology for Directed I/O) 활성화
- AMD 시스템: AMD-Vi 또는 IOMMU 활성화
- 가능하다면 Above 4G Decoding도 활성화 권장
💡 팁: BIOS 설정 후 Proxmox에서 IOMMU가 제대로 인식됐는지 확인하는 방법은 아래에서 알려드릴게요.
3. Proxmox 호스트 설정: GRUB부터 손봐야 해요
자, 이제 실제 설정 들어갑니다. Proxmox 호스트에 SSH로 접속하거나 콘솔을 열어주세요.
3-1. GRUB 부트 파라미터 수정
먼저 GRUB 설정 파일을 열어야 합니다.
nano /etc/default/grub
파일 안에서 GRUB_CMDLINE_LINUX_DEFAULT 항목을 찾아서 수정합니다.
Intel CPU인 경우:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
AMD CPU인 경우:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"
여기서 iommu=pt는 passthrough 모드를 뜻하는데, 이걸 넣어주면 IOMMU를 사용하지 않는 디바이스들의 성능 저하를 방지해줍니다. 꼭 같이 넣어주세요.
수정 후 GRUB을 업데이트합니다.
update-grub
3-2. 필요한 커널 모듈 로드
/etc/modules 파일에 VFIO 관련 모듈을 추가해줍니다. VFIO(Virtual Function I/O)는 리눅스에서 디바이스 패스스루를 담당하는 프레임워크예요.
nano /etc/modules
아래 내용을 파일 끝에 추가합니다.
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
3-3. GPU 드라이버 블랙리스트 처리
이 부분이 정말 중요합니다. 호스트 OS가 패스스루할 GPU를 먼저 가져가버리면 VM에 넘겨줄 수가 없거든요. 그래서 호스트에서 해당 GPU 드라이버를 블랙리스트(blacklist) 처리해서 로드되지 않도록 해야 해요.
NVIDIA GPU 블랙리스트:
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidiafb" >> /etc/modprobe.d/blacklist.conf
AMD GPU 블랙리스트:
echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf
echo "blacklist amdgpu" >> /etc/modprobe.d/blacklist.conf
3-4. VFIO가 GPU를 먼저 가져가도록 설정
먼저 패스스루할 GPU의 PCI ID를 확인합니다.
lspci -nn | grep -i nvidia
# 또는 AMD의 경우
lspci -nn | grep -i amd
출력 결과에서 GPU와 관련된 항목들의 ID를 메모해두세요. 보통 이런 형식으로 나옵니다.
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation ... [10de:2204]
01:00.1 Audio device [0403]: NVIDIA Corporation ... [10de:1aef]
여기서 대괄호 안의 10de:2204, 10de:1aef 같은 숫자가 바로 Vendor ID:Device ID입니다. 이걸 VFIO 설정에 넣어줍니다.
echo "options vfio-pci ids=10de:2204,10de:1aef" >> /etc/modprobe.d/vfio.conf
⚠️ 중요: 위 ID는 예시입니다. 반드시 본인 시스템에서 lspci -nn으로 확인한 실제 ID를 사용하세요!
모든 설정을 적용하고 재부팅합니다.
update-initramfs -u -k all
reboot
3-5. IOMMU 활성화 확인
재부팅 후 IOMMU가 제대로 활성화됐는지 확인해봅시다.
dmesg | grep -e DMAR -e IOMMU
출력에 IOMMU enabled 또는 Intel-IOMMU: enabled 같은 문구가 보이면 성공입니다. 🎉
VFIO가 GPU를 제대로 가져갔는지도 확인해봅시다.
lspci -nnk | grep -A3 "VGA\|3D\|Display"
# 출력에서 'Kernel driver in use: vfio-pci' 가 보이면 성공
▲ Proxmox 웹 UI의 VM 하드웨어 설정에서 PCI 디바이스(GPU)를 추가하는 과정. Add > PCI Device 메뉴에서 패스스루할 GPU를 선택합니다.
4. VM에 GPU 연결하기: Proxmox 웹 UI 설정
호스트 설정이 끝났으면 이제 VM에 GPU를 붙여줄 차례입니다. Proxmox 웹 UI에서 진행할 수 있어요.
- Proxmox 웹 UI에서 패스스루할 VM을 선택합니다.
- VM이 꺼진 상태에서 Hardware(하드웨어) 탭으로 이동합니다.
- Add > PCI Device를 클릭합니다.
- 드롭다운에서 패스스루할 GPU를 선택합니다.
- 다음 옵션들을 설정합니다:
- All Functions: 체크 — GPU와 연결된 오디오 장치 등 모든 기능 함께 패스스루
- ROM-Bar: 체크 — GPU ROM 접근 허용
- PCI-Express: 체크 — PCIe 방식으로 연결 (성능상 유리)
- Primary GPU: 체크 — VM의 주 GPU로 설정 (디스플레이 출력 필요시)
CLI로 직접 VM 설정을 수정하고 싶다면 아래처럼 할 수도 있습니다.
# VM ID가 100이고, GPU가 PCI 01:00.0에 있는 경우
qm set 100 -hostpci0 01:00.0,allfunctions=1,pcie=1,rombar=1,x-vga=1
VM 설정 파일 직접 확인
cat /etc/pve/qemu-server/100.conf
설정 파일에 아래와 같은 내용이 들어가 있으면 정상입니다.
hostpci0: 0000:01:00,allfunctions=1,pcie=1,rombar=1,x-vga=1
machine: q35
bios: ovmf
💡 중요한 포인트: GPU 패스스루에는 OVMF(UEFI 펌웨어)와 q35 머신 타입이 필수입니다. 구형 SeaBIOS나 i440fx 머신 타입에서는 동작하지 않는 경우가 많아요. VM 생성 시 처음부터 이 설정으로 만드는 게 나중에 편합니다.
5. VM 내부 드라이버 설치
VM을 부팅하면 이제 GPU가 인식될 겁니다. 여기서부터는 VM 안에서 작업합니다.
Windows VM의 경우
Windows VM에서 GPU 패스스루를 쓰는 가장 흔한 케이스죠. 부팅 후 장치 관리자를 열어보면 GPU가 인식은 되지만 드라이버가 없는 상태일 거예요.
- NVIDIA 또는 AMD 공식 사이트에서 드라이버를 다운로드합니다.
- 일반 드라이버 설치하듯 설치하면 됩니다.
- 설치 완료 후 재부팅하면 GPU가 정상 동작합니다.
⚠️ NVIDIA 드라이버 오류 코드 43 문제: NVIDIA GPU를 Windows VM에 패스스루할 때 오류 코드 43(Code 43)이 발생하는 경우가 있습니다. NVIDIA 드라이버가 가상 환경을 감지하고 동작을 거부하는 거예요. 이럴 때는 VM 설정 파일에 다음을 추가하면 대부분 해결됩니다.
nano /etc/pve/qemu-server/100.conf
# 아래 내용 추가
args: -cpu host,kvm=off
cpu: host,hidden=1,flags=+pcid
또는 웹 UI의 Options > CPU에서 추가 CPU 플래그를 설정해도 됩니다. kvm=off는 VM에서 KVM을 쓰고 있다는 걸 드라이버가 감지하지 못하게 숨겨주는 역할을 합니다.
Linux VM의 경우
Ubuntu 기준으로 NVIDIA 드라이버를 설치해봅시다.
# 사용 가능한 드라이버 확인
ubuntu-drivers devices
# 권장 드라이버 자동 설치
sudo ubuntu-drivers autoinstall
# 또는 특정 버전 지정 설치
sudo apt install nvidia-driver-535
# 재부팅 후 확인
nvidia-smi
AMD GPU라면 Ubuntu에서는 대부분 자동으로 amdgpu 드라이버가 잡힙니다. 추가 작업 없이도 동작하는 경우가 많아요.
6. 트러블슈팅: 실제 겪은 문제들
이 섹션이 가장 실용적일 거예요. 이론대로 안 되는 경우가 정말 많거든요. 제가 직접 겪었던 문제들만 정리했습니다.
▲ GPU 패스스루 설정 중 자주 만나는 오류 상황별 트러블슈팅 흐름도. 각 단계에서 확인해야 할 포인트를 정리했습니다.
문제 1: VM이 부팅 자체가 안 돼요
OVMF(UEFI) 설정이 제대로 안 됐거나, GPU가 IOMMU 그룹에서 다른 디바이스와 묶여 있는 경우입니다.
IOMMU 그룹 확인 스크립트를 실행해보세요.
#!/bin/bash
for d in /sys/kernel/iommu_groups/*/devices/*; do
n=${d#*/iommu_groups/*}; n=${n%%/*}
printf 'IOMMU Group %s ' "$n"
lspci -nns "${d##*/}"
done
GPU가 속한 IOMMU 그룹에 다른 디바이스(예: PCIe 루트 포트)가 함께 있다면, 해당 디바이스들도 전부 같이 패스스루해야 합니다. 이게 안 되면 ACS(Access Control Services) 패치 커널을 사용해야 하는데, 이건 꽤 복잡한 주제라 별도 글에서 다룰 예정입니다.
문제 2: GPU는 인식되는데 드라이버 설치 후 화면이 안 나와요
Primary GPU 옵션을 켰는데 Proxmox 기본 디스플레이(VirtIO 또는 Bochs)와 충돌하는 경우입니다. VM 설정에서 Display를 None으로 바꿔보세요.
qm set 100 -vga none
이렇게 하면 기본 가상 디스플레이가 비활성화되고 패스스루된 GPU의 출력만 사용하게 됩니다. 물리 모니터를 GPU에 직접 연결하거나, Looking Glass 같은 도구를 활용하면 됩니다.
문제 3: NVIDIA Code 43 오류
위에서 언급한 것처럼 kvm=off와 hidden=1 플래그로 해결하세요. 추가로 VM 설정 파일에 아래도 넣어보세요.
# /etc/pve/qemu-server/100.conf 에 추가
args: -cpu host,kvm=off
cpu: host,hidden=1
문제 4: 재부팅 후 vfio-pci 대신 원래 드라이버가 잡혀요
update-initramfs를 빠뜨린 경우가 많습니다. 다시 실행해주세요.
update-initramfs -u -k all
reboot
7. 결과 확인: 제대로 동작하는지 검증해봐요
드라이버 설치까지 완료했다면, 이제 GPU가 정상 동작하는지 확인할 차례입니다.
Linux VM에서 확인
# NVIDIA
nvidia-smi
# 출력 예시
+-----------------------------------------------------------------------------+
| NVIDIA-SMI ... Driver Version: ... CUDA Version: ... |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
...
# AMD
rocm-smi # ROCm 설치 후
# 또는
glxinfo | grep "OpenGL renderer"
CUDA가 필요한 환경이라면 간단한 테스트도 해볼 수 있어요.
import torch
print(torch.cuda.is_available()) # True 가 나오면 성공!
print(torch.cuda.get_device_name(0)) # GPU 이름 출력
드디어 True와 GPU 이름이 출력되는 걸 처음 봤을 때의 그 쾌감... 진짜 잊을 수가 없더라고요. 😄
Windows VM에서 확인
- 장치 관리자에서 GPU에 노란 느낌표 없이 정상 표시
- DirectX 진단 도구(
dxdiag)에서 GPU 정보 확인 - GPU-Z 같은 도구로 실제 물리 GPU 정보 확인
▲ GPU 패스스루 성공 후 Linux VM에서의 nvidia-smi 출력과 Windows VM에서의 GPU-Z 결과. 물리 GPU 정보가 그대로 보이는 것을 확인할 수 있습니다.
8. 정리 및 다음 단계
여기까지 따라오셨으면 Proxmox GPU 패스스루 기본 설정은 완료입니다! 전체 과정을 한 번 정리해볼게요.
- ✅ BIOS에서 VT-d / AMD-Vi 활성화
- ✅ GRUB에 IOMMU 파라미터 추가
- ✅ VFIO 모듈 로드 설정
- ✅ 호스트에서 GPU 드라이버 블랙리스트 처리
- ✅ VFIO가 GPU PCI ID 선점하도록 설정
- ✅ initramfs 업데이트 후 재부팅
- ✅ VM에 PCI 디바이스로 GPU 추가 (q35 + OVMF 필수)
- ✅ VM 내부에서 드라이버 설치 및 확인
처음에는 복잡해 보이지만, 한 번 제대로 이해하고 나면 다음에는 훨씬 빠르게 할 수 있어요. 저도 지금은 새 시스템에 설정하는 데 30분도 안 걸립니다.
다음에 다룰 주제들
- 🔜 Looking Glass: 패스스루 GPU 화면을 호스트에서 보는 방법
- 🔜 vGPU (MIG/SR-IOV): GPU 하나를 여러 VM에 나눠 쓰는 방법
- 🔜 IOMMU 그룹 분리 (ACS 패치): 같은 그룹 문제 해결하기
- 🔜 머신러닝 VM 구성 완전 가이드
궁금하신 점이나 안 되는 부분이 있으면 댓글로 남겨주세요. 제가 직접 겪은 문제라면 같이 해결해 드릴 수 있을 것 같습니다. 그리고 혹시 이 글이 도움이 됐다면, 비슷한 삽질을 하고 있을 동료 엔지니어에게 공유해주시면 감사하겠습니다! 🙏
자주 묻는 질문 (FAQ)
Q. Proxmox GPU 패스스루에 특별한 GPU 모델이 필요한가요?
아니요. 대부분의 NVIDIA GeForce, Quadro, AMD Radeon, Radeon Pro 등 PCIe GPU는 패스스루가 가능합니다. 단, 호스트 시스템이 IOMMU를 지원해야 합니다.
Q. 패스스루한 GPU를 호스트와 VM이 동시에 쓸 수 있나요?
기본 패스스루로는 불가능합니다. 패스스루된 GPU는 해당 VM 전용이 됩니다. 여러 VM이 GPU를 나눠 쓰려면 NVIDIA vGPU(엔터프라이즈 라이선스 필요) 또는 AMD SR-IOV 지원 GPU가 필요합니다.
Q. VM이 꺼진 후 GPU를 다른 VM에 줄 수 있나요?
네, 가능합니다. 한 VM을 종료하고 설정에서 GPU를 제거한 뒤, 다른 VM 설정에 추가하면 됩니다. 동시에 두 VM이 쓰는 건 안 되지만, 순차적으로는 얼마든지 가능합니다.
Q. Proxmox 호스트 자체 콘솔이 까맣게 되는데 정상인가요?
GPU를 블랙리스트 처리하면 호스트가 그 GPU로 화면 출력을 못 하게 됩니다. 만약 그 GPU가 유일한 그래픽이라면 호스트 화면은 안 나올 수 있어요. iGPU나 별도 GPU를 호스트용으로 쓰거나, SSH/웹 UI로만 관리하는 방식을 권장합니다.
'IT > Proxmox' 카테고리의 다른 글
| [Proxmox] LXC 컨테이너 심화 활용: Docker 연동 및 성능 최적화 (Proxmox VE 9.1) (1) | 2026.05.10 |
|---|---|
| [Proxmox] HA 클러스터 구축 및 트러블슈팅: 고가용성 완벽 가이드 (1) | 2026.05.10 |
| [Proxmox] Proxmox HA 클러스터: 고가용성 구축 및 장애 복구 전략 (0) | 2026.05.09 |
| [Proxmox] VE 8.2 네트워크 고급 설정: VLAN, 브릿지, nftables 방화벽 완벽 가이드 (0) | 2026.05.03 |
| [Proxmox] Proxmox VE 설치 후 필수 초기 설정: 8단계 완벽 가이드 (0) | 2026.05.03 |
| [Proxmox VE] VM 백업 및 복구 완벽 가이드: 데이터 손실 방지 전략 (1) | 2026.05.01 |