목차
[Proxmox] PCIe 패스스루 오류: vGPU 가상화 실패 디버깅 사례
안녕하세요, 13년차 서버실 지킴이, '13년차의 서버실'입니다. 홈랩에서 다양한 장비들을 만져보며 삽질을 즐기는 저에게, 가장 큰 도전 중 하나는 역시 Proxmox PCIe 패스스루(Passthrough)더라고요. 특히 고성능 GPU를 가상 머신(Virtual Machine, VM)에 넘겨줘서 게임이나 AI 연산, 아니면 고사양 CAD 작업을 해보겠다고 마음먹었을 때의 그 설렘, 다들 경험해보셨죠?
근데 이게 말처럼 쉽지가 않더라고요. 분명히 공식 문서와 수많은 가이드를 따라했는데도, VM에서는 GPU를 제대로 인식 못 하거나, 인식하더라도 알 수 없는 오류 코드(Error Code)를 뿜어내며 vGPU 가상화 실패를 알리는 경우가 많았습니다. 저도 처음엔 이게 뭔가 싶었는데, 결국 삽질 끝에 해결했던 경험을 여러분과 공유하려고 합니다. 혹시 저와 비슷한 문제로 골머리를 앓고 계시다면, 이 글이 작은 도움이 되기를 바랍니다.
그림 1: Proxmox와 PCIe 패스스루의 개념적 아키텍처. 호스트의 물리 GPU가 VM에 직접 연결되는 모습을 보여줍니다.
PCIe 패스스루와 vGPU, 그리고 VFIO: 왜 이렇게 복잡할까?
먼저, 우리가 이야기할 핵심 개념들을 간단히 짚어볼게요. 저도 처음엔 용어 때문에 많이 헤맸거든요.
- PCIe Passthrough (PCIe 패스스루): 쉽게 말해, Proxmox 호스트 서버에 꽂혀 있는 물리적인 PCIe 장치(예: 그래픽 카드, NVMe SSD, 네트워크 카드)를 가상 머신(VM)이 마치 자기 것처럼 직접 사용할 수 있도록 '직통'으로 연결해주는 기술이에요. 호스트의 간섭 없이 장치의 모든 성능을 VM이 온전히 활용할 수 있게 해줍니다.
- vGPU (Virtual GPU): 하나의 물리적인 GPU를 여러 가상 머신이 나눠 쓸 수 있도록 해주는 기술예요. NVIDIA GRID나 AMD MxGPU 같은 솔루션들이 대표적이죠. 하지만 우리가 보통 홈랩에서 시도하는 건, 하나의 물리 GPU를 하나의 VM에 통째로 넘겨주는 싱글 GPU 패스스루(Single GPU Passthrough)가 대부분입니다.
- IOMMU (Input/Output Memory Management Unit): CPU가 메모리를 관리하는 MMU(Memory Management Unit)처럼, IOMMU는 입출력(I/O) 장치들이 메모리에 직접 접근하는 방식(DMA, Direct Memory Access)을 관리하고 격리시켜줘요. 이 기능이 활성화되어야만 PCIe 장치를 안전하게 VM에 넘겨줄 수 있습니다. BIOS/UEFI에서 VT-d (Intel) 또는 AMD-Vi (AMD)라는 이름으로 찾아볼 수 있어요.
- VFIO (Virtual Function I/O): Linux 커널이 제공하는 표준 인터페이스로, 안전하게 PCIe 장치를 사용자 공간(user-space) 애플리케이션(여기서는 QEMU/KVM)에 전달하는 역할을 합니다. Proxmox에서 PCIe 패스스루를 구현할 때
vfio-pci라는 커널 모듈이 핵심적인 역할을 하죠.
결국, 이 모든 기술들이 잘 맞물려야 비로소 VM에서 GPU를 사용할 수 있게 되는 거더라고요. 어느 하나라도 삐끗하면 가상화 오류가 발생하는 겁니다.
실전 구현: 기본 패스스루 설정 과정
제가 Proxmox에서 NVIDIA RTX 3060 그래픽 카드를 Windows VM에 패스스루 하려고 시도했던 과정을 예시로 들어볼게요. 기본적인 설정은 다음과 같습니다.
- BIOS/UEFI 설정 확인: 메인보드 BIOS/UEFI 설정에서 IOMMU, VT-d (Intel) 또는 AMD-Vi (AMD) 기능을 'Enabled'로 활성화해야 합니다. 이 단계를 빼먹으면 모든 것이 시작도 안 돼요! ⚠️
- GRUB 설정 수정: Proxmox 호스트의 GRUB 부트로더 설정에 IOMMU를 활성화하는 파라미터를 추가합니다.
# /etc/default/grub 파일 편집 sudo 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" # 변경사항 적용 sudo update-grub sudo reboot - VFIO 모듈 로드 및 블랙리스트 설정: Proxmox가 GPU 드라이버를 로드하지 않고, VFIO 모듈이 GPU를 점유하도록 설정합니다.
# /etc/modules 파일에 다음 추가 sudo nano /etc/modules # vfio_pci # vfio_iommu_type1 # vfio # vfio_virqfd # 호스트 OS에서 GPU 드라이버 블랙리스트 처리 sudo nano /etc/modprobe.d/blacklist.conf # blacklist nouveau # blacklist amdgpu # blacklist radeon # blacklist nvidiafb # blacklist snd_hda_intel # HDMI 오디오도 같이 넘길 경우 # VFIO가 GPU ID를 잡도록 설정 (Vendor ID:Device ID) # GPU ID는 'lspci -nnk' 명령어로 확인합니다. # 예시: NVIDIA RTX 3060 (10de:2503) / HDMI Audio (10de:228e) sudo nano /etc/modprobe.d/vfio.conf # options vfio-pci ids=10de:2503,10de:228e disable_vga=1 # 변경사항 적용 및 램디스크 업데이트 sudo update-initramfs -u -k all sudo reboot - IOMMU 그룹 확인: 재부팅 후, GPU가 제대로 VFIO 그룹에 할당되었는지 확인합니다.
여기서 GPU와 HDMI 오디오가 같은 IOMMU 그룹에 속해 있고, 다른 불필요한 장치들과 섞여 있지 않아야 해요. 만약 다른 장치와 섞여 있다면, 다음 섹션의 IOMMU Grouping 문제를 의심해봐야 합니다.# IOMMU 그룹 확인 스크립트 (예시) # /usr/src/pve/iommu.sh 같은 이름으로 저장 후 실행 #!/bin/bash for d in $(find /sys/kernel/iommu_groups/*/devices -type l | sort -V); do n=${d#*/iommu_groups/*} printf 'IOMMU Group %s ' "${n%%/*}" lspci -nns "${d##*/}" done - Proxmox VM에 PCIe 장치 추가: Proxmox 웹 UI에서 VM 하드웨어 설정으로 들어가 'PCI 장치'를 추가하거나,
qm set명령어를 사용합니다. 중요한 것은 '모든 PCI 익스프레스 포트'를 활성화하고, '고급' 옵션에서 'ROM-Bar'를 체크해주는 거예요.
그림 2: Proxmox VM 설정 화면. PCI Device를 추가하고 'ROM-Bar' 옵션을 활성화하는 모습입니다.
⚠️ 삽질의 시작: Proxmox vGPU 가상화 실패 디버깅 사례
자, 여기까지는 일반적인 가이드에 나오는 내용입니다. 그런데 저의 삽질은 바로 여기서부터 시작됐더라고요. VM을 부팅하고 Windows 장치 관리자를 열어보니, 여지없이 '오류 코드 43'이 뜨더라고요. 드라이버를 아무리 다시 깔아도 마찬가지였습니다. 아, 이거 진짜 미치겠더라고요! 🤬
제가 겪었던 주요 가상화 오류와 해결 과정은 다음과 같습니다.
1. IOMMU Grouping 문제
가장 흔한 문제더라고요. lspci -nns 명령어로 확인했을 때, GPU가 다른 불필요한 장치(예: USB 컨트롤러, SATA 컨트롤러)와 같은 IOMMU 그룹에 묶여 있는 경우가 있어요. IOMMU는 그룹 단위로만 패스스루를 허용하기 때문에, 이 경우 원하는 장치만 넘길 수가 없습니다.
- 증상: VM에 GPU를 추가하려 할 때 Proxmox에서 'Device is in use' 같은 에러가 발생하거나, 추가되더라도 VM에서 제대로 인식하지 못해요.
- 해결책 (ACS Override 패치): GRUB 설정에
pcie_acs_override=downstream,multifunction파라미터를 추가하여 IOMMU 그룹을 강제로 분리시키는 방법입니다. 저도 이 방법으로 많은 문제를 해결했어요.
⚠️ 주의: 이 방법은 IOMMU의 보안 기능을 약화시킬 수 있으니까, 보안에 민감한 환경에서는 신중하게 사용하셔야 해요. 홈랩 환경에서는 보통 큰 문제가 되지 않습니다.# /etc/default/grub 파일 수정 sudo nano /etc/default/grub # GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction" # 변경사항 적용 sudo update-grub sudo reboot
2. ROM BAR 또는 VBIOS 문제 (특히 NVIDIA 카드)
NVIDIA 그래픽 카드에서 '오류 코드 43'이 뜨는 가장 큰 원인 중 하나였더라고요. NVIDIA 드라이버가 가상 환경에서 실행되는 것을 감지하고 스스로 기능을 제한하는 경우가 많거든요. 또, Proxmox가 GPU의 VBIOS(Video BIOS)를 제대로 로드하지 못해서 생기는 문제도 있어요.
- 증상: Windows VM에서 장치 관리자에 '오류 코드 43'이 뜨거나, 화면이 나오지 않아요.
- 해결책 (VBIOS 덤프 및 직접 로드): 호스트에서 GPU의 VBIOS 롬 파일을 직접 추출(덤프)해서 VM 설정에 지정해주는 방법입니다. 저는 이 방법으로 RTX 3060의 '오류 코드 43'을 해결했어요! 🎉
- VBIOS 덤프: 리눅스 환경에서 GPU의 VBIOS를 추출합니다. 다른 PC에 GPU를 연결해서 GPU-Z 같은 툴로 덤프하는 방법도 있어요.
# VFIO에 바인딩되기 전의 GPU를 찾아서 롬 파일 덤프 # 예시: GPU가 /sys/bus/pci/devices/0000:01:00.0 에 있을 경우 sudo su echo 1 > /sys/bus/pci/devices/0000:01:00.0/rom cat /sys/bus/pci/devices/0000:01:00.0/rom > /var/lib/vz/snippets/vbios.rom echo 0 > /sys/bus/pci/devices/0000:01:00.0/rom exit - VM 설정에 VBIOS 파일 지정: 덤프한
vbios.rom파일을 Proxmox의 스니펫(Snippet) 경로(예:/var/lib/vz/snippets/)에 넣고, VM 설정에 추가합니다.
Proxmox 웹 UI에서 PCI 장치 추가 시 'ROM-Bar' 옵션을 체크하는 것으로도 해결될 때가 있긴 하지만, 직접 롬 파일을 지정하는 것이 더 확실한 경우가 많았어요.# VM ID가 100번일 경우 qm set 100 -args '-device vfio-pci,host=01:00.0,x-vga=on,romfile=/var/lib/vz/snippets/vbios.rom' # 또는 VM 설정 파일 직접 수정: /etc/pve/qemu-server/100.conf # args: -device vfio-pci,host=01:00.0,x-vga=on,romfile=/var/lib/vz/snippets/vbios.rom
- VBIOS 덤프: 리눅스 환경에서 GPU의 VBIOS를 추출합니다. 다른 PC에 GPU를 연결해서 GPU-Z 같은 툴로 덤프하는 방법도 있어요.
그림 3: IOMMU 그룹 문제와 해결책. ACS Override가 어떻게 장치 격리를 돕는지 보여줍니다.
3. `vfio-pci` 드라이버 바인딩 실패
가끔 Proxmox 호스트가 부팅될 때 GPU가 vfio-pci 드라이버에 제대로 바인딩(Binding)되지 않고, 다른 드라이버(예: nouveau, nvidia)에 먼저 잡히는 경우가 있어요. 이렇게 되면 VM에서 GPU를 사용할 수 없게 되죠.
- 증상:
lspci -nnk명령어로 확인했을 때, GPU 장치 아래에 'Kernel driver in use: vfio-pci' 대신 다른 드라이버가 표시돼요. - 해결책 (강제 바인딩): 부팅 시점에 스크립트를 통해 강제로
vfio-pci에 바인딩하도록 만들 수 있습니다. 보통은/etc/modprobe.d/vfio.conf설정으로 충분하지만, 간혹 필요한 경우도 있어요.# 부팅 스크립트 (예: /etc/rc.local 또는 systemd 서비스) # PCI 장치 ID 확인 (lspci -nnk) PCI_ID="0000:01:00.0" # 예시 GPU 장치 ID VENDOR_ID="10de" # 예시 NVIDIA Vendor ID DEVICE_ID="2503" # 예시 RTX 3060 Device ID if [ -e /sys/bus/pci/drivers/nvidia ]; then echo "$PCI_ID" > /sys/bus/pci/drivers/nvidia/unbind fi if [ -e /sys/bus/pci/drivers/nouveau ]; then echo "$PCI_ID" > /sys/bus/pci/drivers/nouveau/unbind fi echo "$VENDOR_ID $DEVICE_ID" > /sys/bus/pci/drivers/vfio-pci/new_id
4. Proxmox 커널 버전 문제
간혹 특정 Proxmox 커널 버전에서 PCIe 패스스루 관련 버그가 발생하기도 해요. 특히 최신 커널로 업데이트한 후에 문제가 생겼다면 의심해볼 만합니다.
- 증상: 이전에는 잘 되던 패스스루가 특정 커널 업데이트 후 작동하지 않거나, 예상치 못한 오류가 발생해요.
- 해결책: Proxmox의 이전 커널 버전으로 부팅하거나, 커널을 업데이트 또는 다운그레이드하는 것을 고려해봐야 합니다. Proxmox는 여러 커널을 설치하고 선택적으로 부팅할 수 있게 지원하거든요.
검증과 결과: 드디어 성공!
앞서 언급한 삽질을 거쳐 모든 설정을 마치고 VM을 부팅했을 때의 쾌감이란! 🥳 Windows VM의 장치 관리자를 열었을 때, 더 이상 '오류 코드 43'이 뜨지 않고 NVIDIA GeForce RTX 3060이 정상적으로 인식되는 것을 확인했어요. GPU-Z 같은 툴로도 모든 정보가 정확하게 표시되는 것을 보니 정말 뿌듯하더라고요.
그리고 가장 중요한 것은, 실제 벤치마크 프로그램이나 게임을 돌렸을 때 물리 머신에 준하는 성능이 나오는 것을 확인했을 때예요. 이 순간을 위해 그렇게 많은 밤을 새워가며 디버깅했던 거겠죠.
호스트에서도 lspci -nnk 명령어를 다시 실행하여 GPU가 여전히 vfio-pci에 바인딩되어 있는지 확인하는 것도 중요해요. ✅
그림 4: Windows VM에서 NVIDIA GPU가 정상 인식되고 GPU-Z로 상세 정보가 확인되는 모습입니다.
마무리하며: 삽질은 경험이 됩니다
Proxmox PCIe 패스스루는 인프라 엔지니어에게 정말 까다로운 도전 과제 중 하나예요. 수많은 변수와 시스템 환경에 따라 다른 문제를 일으키기 때문에, 정답이 하나로 정해져 있지 않거든요. 저도 수많은 가상화 오류를 겪었고, 그때마다 로그를 뒤지고 포럼을 찾아보며 디버깅했어요. 이 과정 자체가 저에게는 소중한 경험과 지식으로 남더라고요.
핵심은 문제 발생 시 당황하지 않고, dmesg, journalctl -xe 같은 시스템 로그를 꼼꼼히 확인하고, IOMMU 그룹핑이나 VBIOS 문제 등 알려진 원인들을 하나씩 점검해나가는 끈기인 것 같아요. 그리고 가장 중요한 것은, 다양한 커뮤니티와 포럼에서 얻을 수 있는 정보들이에요. 비슷한 문제를 겪은 사람들의 경험담은 정말 큰 도움이 되거든요.
이 글이 Proxmox PCIe 패스스루와 vGPU 가상화 실패로 고생하는 분들께 작은 등불이 되기를 바랍니다. 다음번에는 vGPU Manager를 활용해서 하나의 GPU를 여러 VM이 나눠 쓰는 방법을 다뤄볼까 합니다. 그때까지 다들 즐거운 삽질(?) 되세요! 😊
'IT > Proxmox' 카테고리의 다른 글
| [Proxmox] Proxmox Ceph 스토리지 1년 실사용 후기: 장점, 단점, 비용 분석 (0) | 2026.06.03 |
|---|---|
| [Proxmox] VMware ESXi에서 Proxmox 마이그레이션: 성공적인 전환을 위한 결정 기준과 고려사항 (0) | 2026.06.02 |
| [홈랩] Proxmox OMV 연동: NAS 구축을 위한 최적의 조합 분석 (1) | 2026.05.29 |
| [Proxmox] ZFS vs Btrfs 비교: Proxmox 홈랩에서의 실측 성능과 데이터 무결성 분석 (1) | 2026.05.28 |
| [Proxmox] Proxmox Backup Server (PBS) vs. 스크립트 백업: 홈랩 비용 효율성 비교 (0) | 2026.05.27 |
| [Proxmox] GPU 패스스루: 가상 머신 성능 문제 디버깅하기 (0) | 2026.05.25 |