13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] Proxmox GPU 패스스루

  • [Proxmox] GPU 패스스루: 가상 머신 성능 문제 디버깅하기

    [Proxmox] GPU 패스스루: 가상 머신 성능 문제 디버깅하기

    [Proxmox] GPU 패스스루: 가상 머신 성능 문제 디버깅하기

    안녕하세요! 13년차의 서버실, 인프라 엔지니어 박 사장입니다. 오늘은 제가 홈랩에서 정말 많이 삽질했던 경험 중 하나인 Proxmox GPU 패스스루(Passthrough)에 대한 이야기를 해볼까 합니다. 다들 설레는 마음으로 Proxmox에 GPU 패스스루를 세팅하고, 가상 머신(VM)을 켰는데, 웬걸? 생각보다 성능이 안 나와서 당황한 경험 있으신가요? 저도 처음엔 이게 뭔가 싶어서 밤샘 디버깅을 밥 먹듯이 했었거든요. 오늘은 그 삽질의 결과물, 즉 GPU 패스스루 시 겪을 수 있는 성능 문제와 그 해결 과정을 멘토처럼 알려드리겠습니다. ⚠️ 특히 NVIDIA Error 43 같은 골치 아픈 문제 해결 팁도 있으니 끝까지 주목해주세요!

    Proxmox에서 GPU 패스스루를 구현했을 때의 전체적인 아키텍처를 시각화한 다이어그램이에요. 호스트와 게스트 OS 간의 GPU 자원 전달 과정이 어떻게 흘러가는지 한눈에 볼 수 있습니다.

    💡 Proxmox GPU 패스스루와 VFIO, 왜 중요할까요?

    Proxmox GPU 패스스루(Passthrough)는 쉽게 말해 물리적인 서버에 꽂힌 GPU(그래픽 처리 장치)를 가상 머신(VM, Virtual Machine)에 통째로 할당해주는 기술입니다. 호스트 OS(Proxmox가 설치된 리눅스)는 해당 GPU에 대한 제어권을 내려놓고, 그 제어권을 게스트 OS(VM 내부의 Windows나 Linux)가 직접 가져가서 사용하게 하는 거죠. 이렇게 하면 가상 환경에서도 물리 GPU의 성능을 거의 그대로 활용할 수 있게 됩니다. 게임 서버, AI 학습, 미디어 트랜스코딩 등 고성능 그래픽 처리가 필요한 작업에 필수적이죠.

    이 기술의 핵심에는 VFIO (Virtual Function I/O)라는 프레임워크가 있습니다. VFIO는 호스트 OS가 특정 하드웨어 장치(여기서는 GPU)에 대한 제어권을 포기하고, 그 제어권을 게스트 OS가 직접 가져갈 수 있도록 해주는 메커니즘을 제공합니다. 덕분에 게스트 OS는 GPU를 마치 물리 머신에 직접 연결된 것처럼 사용할 수 있게 되는 겁니다. 저도 처음엔 이 VFIO 개념이 좀 헷갈렸는데, 쉽게 생각하면 ‘직통 연결 통로’를 만들어주는 거라고 보시면 돼요.

    문제는 이 과정이 생각보다 복잡하고, 작은 설정 실수 하나로 성능 저하나 오류가 발생할 수 있다는 겁니다. 특히 Proxmox GPU 패스스루를 하려는 분들이 가장 많이 겪는 문제가 바로 ‘설정은 다 했는데 왜 성능이 안 나오지?’ 하는 부분이죠.

    🛠️ 기본적인 Proxmox GPU 패스스루 설정 요약

    사실 Proxmox에서 GPU 패스스루를 위한 기본적인 설정(BIOS에서 IOMMU 활성화, vfio 모듈 활성화, 커널 매개변수 추가 등)은 다른 좋은 자료들이 많으니 여기서는 간략히 언급하고 넘어가겠습니다. 오늘은 이미 기본적인 세팅은 마쳤다는 가정하에, 성능 문제 디버깅에 집중할 거거든요.

    1. BIOS/UEFI 설정: IOMMU (Intel VT-d 또는 AMD-Vi) 기능을 반드시 활성화해야 합니다. 이게 안 되면 VFIO 자체가 작동하지 않아요.
    2. 커널 모듈 활성화: vfio, vfio_iommu_type1, vfio_pci 등의 모듈을 로드하고, 블랙리스트에 GPU 드라이버(nouveau, amdgpu, nvidia)를 추가해 호스트 OS가 GPU를 점유하지 않도록 합니다.
    3. GPU ID 확인 및 격리: lspci -nns [PCI ID] 등으로 GPU의 Vendor ID와 Device ID를 확인하고, /etc/modprobe.d/vfio.conf 파일에 해당 ID를 추가하여 VFIO 모듈이 GPU를 독점하도록 설정합니다.
    4. VM 설정 변경: Proxmox 웹 UI에서 VM 하드웨어에 PCI Device로 GPU를 추가하고, 필요한 경우 Primary GPU 옵션이나 ROM-Bar 옵션을 활성화합니다.

    여기까지 했는데도 문제가 생겼다면, 이제부터가 진짜 디버깅의 시작입니다!

    Proxmox 가상 머신에 PCI 장치(GPU) 추가 설정 화면

    Proxmox 웹 UI에서 가상 머신에 PCI 장치(GPU)를 추가하는 설정 화면이에요. 이 화면에서 어떤 GPU를 선택하고 어떤 옵션을 적용할지 결정하게 됩니다.

    ⚠️ Proxmox GPU 패스스루 성능 문제 디버깅하기

    1. NVIDIA Error 43: 가장 흔하고 짜증나는 문제!

    제가 Proxmox GPU 패스스루를 하면서 제일 많이 삽질했던 부분이 바로 이 NVIDIA Error 43입니다. Windows VM에서 장치 관리자를 열었을 때 그래픽 카드에 느낌표가 뜨면서 Code 43 오류가 발생하면 정말 미쳐버리죠. 드라이버 문제인 줄 알고 온갖 버전을 다 깔아봤는데도 안 됐었거든요.

    원인: NVIDIA 드라이버가 가상 환경에서 실행 중임을 감지하고 기능을 제한해버린다는 거예요. 일종의 ‘가상화 감지’ 보호 메커니즘이죠.

    해결책:

    1. KVM 가상화 숨기기 (VM 설정): Proxmox가 KVM이라는 하이퍼바이저를 사용하고 있다는 사실을 게스트 OS에 숨겨야 합니다. VM 설정을 통해 QEMU 인자를 추가해줍니다.
    2. 
      qm set [VMID] -args '-cpu host,kvm=off,hv_vendor_id=null'
      # 예시: qm set 100 -args '-cpu host,kvm=off,hv_vendor_id=null'
      

      여기서 [VMID]는 여러분의 가상 머신 ID예요. kvm=off는 KVM 기능을 비활성화하는 것이 아니라, KVM 하이퍼바이저가 존재한다는 사실을 게스트 OS에 알리지 않는 역할을 합니다. hv_vendor_id=null은 하이퍼바이저 벤더 ID를 숨깁니다.

    3. KVM MSR(Model Specific Register) 무시 (호스트 설정): 호스트에서 KVM 모듈에 특정 MSR을 무시하도록 지시하여 가상화 감지를 더 어렵게 만듭니다.
    4. 
      echo "options kvm ignore_msrs=1" > /etc/modprobe.d/kvm.conf
      update-initramfs -u -k all
      reboot
      

      이 설정을 추가하고 update-initramfs로 initramfs를 업데이트한 뒤 재부팅하면, 게스트 OS가 가상 환경임을 감지하기가 정말 어려워진다는 거죠. 저도 이 방법을 쓰고 나서야 드디어 Error 43에서 벗어날 수 있었어요! 🎉

    2. IOMMU 그룹 분리 문제: 장치가 제대로 격리되지 않을 때

    IOMMU (Input/Output Memory Management Unit) 그룹은 패스스루의 근간입니다. IOMMU 그룹이 제대로 분리되지 않으면, 패스스루하려는 GPU와 다른 장치들이 같은 그룹에 묶여 있어 패스스루 자체가 안 되거나, 안정성 문제가 생기거든요.

    확인 방법:

    
    find /sys/kernel/iommu_groups/ -type l
    # 또는 특정 장치의 IOMMU 그룹 확인
    lspci -nnv | grep -i "VGA compatible controller"
    

    만약 GPU와 다른 중요한 장치(예: SATA 컨트롤러)가 같은 그룹에 묶여 있다면 문제가 됩니다.

    해결책:

    • PCIe 슬롯 변경: 물리적으로 GPU를 다른 PCIe 슬롯에 꽂아보세요. 간혹 슬롯에 따라 IOMMU 그룹이 달라지는 경우가 있습니다.
    • PCIe ACS Override 패치: Proxmox 호스트의 커널에 PCIe ACS Override 패치를 적용하는 방법이 있습니다. 이 패치는 IOMMU 그룹을 강제로 분리시키는 역할을 하지만, 시스템의 안정성을 해칠 수 있으므로 ⚠️ 주의해서 사용해야 합니다. 저도 정말 최후의 수단으로 사용했던 기억이 있네요.

    3. 성능 저하 (병목 현상): 할당 리소스 점검

    Error 43은 해결했지만 막상 게임이나 AI 학습을 돌려보니 성능이 기대에 못 미친다면, 리소스 할당이나 설정 최적화를 의심해봐야 합니다.

    • PCIe 슬롯 대역폭: 혹시 GPU를 낮은 대역폭의 PCIe 슬롯(예: x16 대신 x8, x4)에 꽂은 건 아닌지 확인해보세요. 대역폭이 충분하지 않으면 GPU 성능을 100% 활용하기 어렵습니다. 메인보드 매뉴얼을 확인하는 게 가장 정확합니다.
    • CPU 코어/스레드 할당: VM에 충분한 CPU 코어와 스레드를 할당했는지 확인해야 합니다. VM에 CPU 코어를 너무 적게 주면 GPU가 아무리 좋아도 병목이 생겨요. 보통 물리 코어 수의 절반 이상을 할당하는 것이 좋습니다.
    • RAM 할당: VRAM(GPU 자체 메모리) 외에 VM에 할당된 시스템 RAM도 중요합니다. 특히 고사양 게임이나 AI 학습 시에는 충분한 RAM이 필수적입니다.
    • QEMU/KVM 최적화 옵션: VM 설정에서 QEMU 인자를 추가하여 성능을 최적화할 수 있습니다.
    • 
      qm set [VMID] -args '-cpu host,hv_time,hv_vapic,hv_spinlocks=0x1fff,hv_relaxed,hv_reset,hv_vpindex,hv_runtime,hv_synic,hv_stimer,hv_ipi,hv_eoi,pv_unhalt,kvm=off,l3-cache=on'
      

      이 옵션들은 KVM의 하이퍼바이저 기능을 최적화하여 게스트 OS의 성능을 향상시키는 데 도움을 줍니다. l3-cache=on은 L3 캐시를 활성화하여 CPU 성능에 긍정적인 영향을 줍니다.

    • Display Output (VMware/SPICE) 비활성화: Proxmox GPU 패스스루를 사용하는 경우, VM의 디스플레이 장치로 VMware나 SPICE 같은 가상 디스플레이를 켜두면 충돌하거나 불필요한 오버헤드가 생길 수 있습니다. 패스스루한 GPU를 유일한 디스플레이 장치로 설정하고, 다른 가상 디스플레이는 모두 끄는 것이 좋습니다.

    4. 사운드 장치 패스스루: HDMI 오디오도 잊지 마세요!

    대부분의 최신 그래픽 카드에는 HDMI나 DisplayPort를 통한 오디오 출력 기능이 내장되어 있습니다. Proxmox GPU 패스스루를 할 때 이 오디오 장치를 함께 패스스루하지 않으면, VM에서 소리가 안 나오거나 문제가 발생할 수 있습니다.

    확인 및 해결:

    1. lspci -nnv | grep -i audio 명령어로 GPU에 연결된 오디오 장치의 ID를 확인합니다.
    2. GPU의 비디오 장치와 오디오 장치가 같은 IOMMU 그룹에 속해 있는지 확인합니다. 대부분은 같은 그룹에 있습니다.
    3. VM 설정에서 GPU의 비디오 장치와 함께 오디오 장치도 PCI Device로 추가해줍니다. 이 두 장치를 모두 한 VM에 할당해야 정상적으로 소리가 나옵니다.

    ✅ 검증 및 결과 확인

    모든 설정을 마치고 디버깅까지 끝냈다면, 이제 Proxmox GPU 패스스루가 제대로 작동하는지 확인해볼 차례입니다. 게스트 OS에 접속해서 다음을 확인해보세요.

    • 장치 관리자 (Windows) / nvidia-smi (Linux): GPU가 정상적으로 인식되고 드라이버가 잘 설치되었는지 확인합니다. 더 이상 느낌표나 오류 코드가 없어야 합니다.
    • 벤치마크 툴: 3DMark, FurMark, Unigine Heaven/Superposition 같은 벤치마크 툴을 실행하여 GPU의 실제 성능을 측정해봅니다. 예상했던 성능 수치가 나오는지 확인하는 것이 중요합니다.
    • 실제 사용: 게임을 돌려보거나, AI 학습 스크립트를 실행해 보면서 체감 성능을 확인합니다.

    드디어 제대로 된 성능이 나오는 걸 보면 그렇게 뿌듯할 수가 없어요! 🎉 그동안의 삽질이 보상받는 느낌이랄까요? 저도 처음엔 수많은 시행착오를 겪었지만, 하나씩 문제를 해결해나가는 과정이 결국 저의 경험치를 올려주더라고요.

    Proxmox GPU 패스스루 후 게스트 OS 벤치마크 결과

    가상 머신 내부에서 실행된 벤치마크 프로그램의 결과 화면이에요. 패스스루된 GPU가 정상적으로 작동하면서 기대하던 성능을 제대로 내고 있는 모습을 볼 수 있습니다.

    마무리하며: 삽질은 경험치를 올려주는 최고의 자산!

    오늘은 Proxmox GPU 패스스루 설정 후 가상 머신에서 발생할 수 있는 성능 문제들을 디버깅하는 저의 경험을 공유해드렸습니다. 특히 NVIDIA Error 43과 같은 고질적인 문제부터 IOMMU 그룹 분리, 그리고 리소스 할당 최적화까지 다양한 관점에서 살펴봤는데요. 사실 이 모든 과정이 결코 쉽지는 않았습니다. 저도 수많은 밤을 새워가며 구글링하고, 포럼을 뒤적이며 해결책을 찾아다녔으니까요. 😅

    하지만 결국 이런 ‘삽질’들이 쌓여서 지금의 제가 될 수 있었다고 생각합니다. 단순히 기술을 적용하는 것을 넘어, 문제가 생겼을 때 스스로 해결할 수 있는 능력이 인프라 엔지니어에게는 가장 중요한 자산이거든요. 혹시 여러분도 Proxmox VFIO-PCI 설정에 어려움을 겪고 있다면, 오늘 제가 알려드린 팁들이 도움이 되었으면 좋겠습니다.

    다음번엔 오늘 다룬 Proxmox 그래픽 카드 패스스루를 활용해서 홈랩에 AI/머신러닝 작업 환경을 구축하는 방법에 대해 이야기해볼까 합니다. 그때까지 여러분의 서버실에 평화가 가득하기를 바랍니다! 궁금한 점이 있다면 언제든지 댓글로 남겨주세요. 제가 아는 선에서 최대한 도와드리겠습니다.

    Proxmox GPU 패스스루 문제 해결을 위한 디버깅 흐름도

    Proxmox GPU 패스스루 설정 시 발생할 수 있는 주요 문제점과 그 해결책을 시각적으로 정리한 흐름도예요. 디버깅 과정에서 어떤 순서로 체크해야 할지 한눈에 알 수 있게 정리했습니다.

  • [Proxmox] Proxmox GPU 패스스루 완벽 가이드: 가상머신에서 그래픽카드 활용하기

    [Proxmox] Proxmox GPU 패스스루 완벽 가이드: 가상머신에서 그래픽카드 활용하기

    Proxmox GPU 패스스루 완벽 가이드: 가상머신에서 그래픽카드 활용하기

    안녕하세요, 13년차 서버실 지킴이 ’13년차의 서버실’입니다. 오늘은 많은 분들이 홈랩에서 꿈꾸는 로망 중 하나인 Proxmox GPU 패스스루에 대한 이야기를 해볼까 합니다. 하나의 강력한 서버로 여러 가상머신(VM)을 돌리면서, 특정 가상머신에 고성능 그래픽카드(GPU)를 통째로 할당해주는 기술이죠. 저도 처음엔 ‘이게 가능하다고?’ 싶었는데, 실제로 해보니 그 활용도가 무궁무진하더라고요. 게이밍 VM부터 AI/딥러닝 워크스테이션, 그리고 미디어 트랜스코딩 서버까지, 여러분의 상상력을 현실로 만들어줄 마법 같은 기술입니다. 저도 수많은 삽질 끝에 성공했고, 그 과정에서 얻은 소중한 경험과 팁들을 오늘 이 자리에서 아낌없이 풀어놓으려 합니다.

    혹시 여러분도 저처럼 비싼 장비 여러 대를 들이지 않고, 하나의 서버로 모든 것을 해결하고 싶은 꿈을 꾸고 계신가요? 그렇다면 이 글이 여러분의 길잡이가 되어줄 겁니다. 제가 직접 해보니 얻는 게 정말 많더라고요. 그럼, 함께 Proxmox GPU 패스스루의 세계로 떠나볼까요?

    Proxmox VE 환경에서 호스트 서버에 설치된 GPU가 가상머신으로 직접 연결되는 개념을 시각적으로 보여주는 다이어그램입니다.

    2. Proxmox GPU 패스스루, 대체 뭘까요? (개념 설명)

    Proxmox GPU 패스스루(GPU Passthrough)는 말 그대로 호스트 시스템(Proxmox VE)에 장착된 물리적인 그래픽카드를 특정 가상머신에 ‘통째로’ 넘겨주는 기술을 의미합니다. 보통 가상머신은 에뮬레이션된 가상 그래픽 장치를 사용하기 때문에 성능이 제한적이죠. 하지만 패스스루를 사용하면 가상머신이 마치 물리적인 컴퓨터에 그래픽카드가 직접 꽂혀있는 것처럼 GPU의 모든 성능을 활용할 수 있게 됩니다.

    이 기술의 핵심에는 IOMMU (Input/Output Memory Management Unit)라는 하드웨어 기능이 있습니다. IOMMU는 가상머신이 물리적인 장치에 직접 접근할 수 있도록 메모리 주소를 매핑해주는 역할을 해요. 그리고 리눅스 커널의 VFIO (Virtual Function I/O) 드라이버가 이 IOMMU 기능을 활용해서 PCI 장치(GPU 포함)를 가상머신으로 패스스루할 수 있도록 도와줍니다. 쉽게 말해, Proxmox VE 호스트가 GPU에 대한 통제권을 내려놓고, 그 통제권을 특정 가상머신에게 완전히 이양하는 것이라고 보시면 됩니다. 그래서 **Proxmox VE 그래픽카드**를 가상머신에서 완벽하게 활용할 수 있게 되는 거죠. 저도 처음엔 개념이 좀 어려웠는데, 직접 해보면서 ‘아, 이게 이런 원리로 돌아가는구나!’ 하고 깨달았어요.

    3. 실전 구현: Proxmox에서 GPU 패스스루 설정하기

    자, 이제 이론은 충분합니다. 저와 함께 실제로 Proxmox VE에 **가상머신 GPU** 패스스루를 설정해보는 시간을 가져볼까요? 제가 직접 해본 가장 안정적인 방법들을 단계별로 알려드릴게요. 저도 이 과정에서 수많은 시행착오를 겪었거든요. 하나하나 따라오시면 분명 성공하실 수 있을 겁니다! 💡

    1. BIOS/UEFI 설정 확인 및 활성화

      가장 먼저 할 일은 서버의 BIOS/UEFI에서 IOMMU 기능을 활성화하는 것입니다. AMD 시스템에서는 AMD-Vi, Intel 시스템에서는 Intel VT-d라는 이름으로 되어있을 거예요. 이 옵션이 꺼져있으면 GPU 패스스루는 아예 불가능합니다. 저도 처음에 이거 확인 안 했다가 시간 좀 날렸습니다. ⚠️

    2. Proxmox VE 호스트 설정: IOMMU 활성화 및 VFIO 모듈 로드

      Proxmox VE 호스트에서 IOMMU 기능을 커널에 알려주고, VFIO 모듈을 미리 로드해야 합니다. SSH로 접속해서 다음 명령어를 입력하세요.

      # GRUB 설정 파일 수정
      # Intel CPU의 경우
      sudo nano /etc/default/grub
      # GRUB_CMDLINE_LINUX_DEFAULT="quiet" 부분을 찾아 다음과 같이 수정합니다.
      # GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
      
      # AMD CPU의 경우
      # GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"
      
      # 수정 후 GRUB 업데이트
      sudo update-grub
      
      # VFIO 모듈 로드 설정
      sudo nano /etc/modules
      # 다음 내용을 추가합니다.
      vfio
      vfio_iommu_type1
      vfio_pci
      vfio_virqfd
      
      # blacklist nouveau 드라이버 (NVIDIA GPU 사용 시 필수)
      sudo nano /etc/modprobe.d/blacklist.conf
      # 다음 내용을 추가합니다.
      blacklist nouveau
      options nouveau modeset=0
      
      # GPU 사운드 카드 드라이버 blacklist (HDMI/DisplayPort 오디오 사용 시 충돌 방지)
      sudo nano /etc/modprobe.d/pve-blacklist.conf
      # 다음 내용을 추가합니다.
      blacklist snd_hda_intel
      blacklist snd_hda_codec_hdmi
      blacklist i915 # Intel 내장 그래픽 사용 시 필요
      
      # 초기 램디스크(initramfs) 업데이트 (매우 중요!)
      sudo update-initramfs -u -a
      
      # 재부팅
      sudo reboot

      재부팅 후 `dmesg | grep -i iommu` 명령으로 IOMMU가 성공적으로 활성화되었는지 확인하세요. `DMAR: IOMMU enabled` 같은 메시지가 보이면 성공입니다. 👍

    3. GPU PCI ID 확인 및 VFIO에 바인딩

      이제 여러분의 GPU PCI ID를 확인하고, 이 ID를 VFIO 드라이버에 할당해야 합니다.

      # GPU PCI ID 확인 (VGA compatible controller와 Audio device 부분을 잘 보세요)
      # 예시: 01:00.0 VGA compatible controller: NVIDIA Corporation GP107 [GeForce GTX 1050 Ti] (rev a1)
      #       01:00.1 Audio device: NVIDIA Corporation GP107GL High Definition Audio Controller (rev a1)
      sudo lspci -nnk | grep -i vga -A3
      sudo lspci -nnk | grep -i audio -A3
      
      # 위에 나온 벤더:디바이스 ID를 기록합니다. (예: 10de:1c8c, 10de:0fb9)
      
      # VFIO에 바인딩할 PCI ID 설정
      sudo nano /etc/modprobe.d/vfio.conf
      # 다음 내용을 추가합니다. (여러분의 PCI ID로 변경하세요!)
      options vfio-pci ids=10de:1c8c,10de:0fb9 disable_vga=1

      다시 `sudo update-initramfs -u -a` 명령으로 초기 램디스크를 업데이트하고, 재부팅합니다. 재부팅 후 `lspci -nnk | grep -i vga -A3` 명령으로 GPU가 `Kernel driver in use: vfio-pci`로 바인딩되었는지 확인하세요. 이게 제일 중요합니다! ✅

    4. 가상머신(VM) 설정

      이제 Proxmox VE 웹 인터페이스에서 GPU를 패스스루할 가상머신을 선택하고, 하드웨어 설정에 들어갑니다. 저도 이 화면에서 얼마나 많은 시도를 했는지 몰라요. ㅎㅎ

      1. 가상머신을 생성하거나 선택합니다. (Windows VM이 일반적입니다)
      2. 하드웨어 탭에서 Add > PCI Device를 클릭합니다.
      3. 이전에 확인했던 GPU의 PCI 장치(VGA compatible controller와 Audio device)를 각각 추가합니다.
      4. 옵션에서 Primary GPU, All Functions, PCI-Express(가능하다면)를 선택합니다.
      5. RomBar를 체크 해제하고, Advanced > PCI-Express를 활성화하는 것이 좋습니다.

    Proxmox VE 웹 인터페이스에서 가상머신의 ‘하드웨어’ 탭에서 ‘PCI Device’를 추가하는 과정과 설정 옵션들을 보여주는 스크린샷입니다.

    4. ⚠️ 삽질 대잔치! Proxmox GPU 패스스루 트러블슈팅 노하우

    솔직히 Proxmox GPU 패스스루는 한 번에 성공하기 쉽지 않습니다. 저도 수많은 밤을 새워가며 삽질 좀 했습니다. 특히 **Proxmox VE 그래픽카드**를 패스스루할 때 발생하는 몇 가지 고질적인 문제들이 있어요. 제가 겪었던 대표적인 문제들과 해결책을 공유해 드릴게요.

    • IOMMU 그룹 문제

      가장 흔한 문제입니다. GPU와 다른 장치들이 같은 IOMMU 그룹에 묶여 있으면, GPU만 단독으로 패스스루할 수 없습니다. `for d in /sys/kernel/iommu_groups/*/devices/*; do n=${d##*/}; dev=$(lspci -nns $n); echo “IOMMU Group ${d%/devices/*##*/}”; echo ” $dev”; done` 명령으로 IOMMU 그룹을 확인해 보세요. 만약 GPU와 다른 장치가 같은 그룹에 있다면, BIOS/UEFI에서 PCI-E 슬롯별 IOMMU 분리가 가능한지 확인하거나, ACS Override 패치를 적용하는 방법도 있지만, 이는 커널을 수정해야 하는 고급 과정이라 초보자에게는 권장하지 않습니다. 저는 이 문제 때문에 메인보드까지 바꿀 뻔했습니다. 😭

    • NVIDIA Error 43

      Windows 가상머신에서 NVIDIA 드라이버를 설치했을 때 ‘코드 43’ 오류가 발생하는 경우가 많습니다. NVIDIA가 가상화 환경에서의 GPU 사용을 제한하려는 조치 때문인데요. 이 문제는 VM 설정에 `args: -cpu host,kvm=off,hv_vendor_id=null`을 추가하거나, 그래픽카드 펌웨어(ROM) 파일을 추출하여 `vga: all,romfile=/path/to/gpu_rom.bin` 옵션을 사용하는 방법으로 해결할 수 있습니다. 저는 `args` 옵션으로 해결했어요. 이거 하나 해결하고 얼마나 기뻤는지 모릅니다! 🎉

      # VM 설정 파일 수정 (VMID를 여러분의 VMID로 변경하세요)
      sudo nano /etc/pve/qemu-server/YOUR_VMID.conf
      # 맨 아래에 다음 줄을 추가합니다.
      args: -cpu host,kvm=off,hv_vendor_id=null
    • HDMI/DisplayPort 오디오 문제

      GPU 패스스루 후 HDMI나 DisplayPort를 통한 오디오 출력이 안 되는 경우가 있습니다. 이는 GPU의 오디오 컨트롤러가 제대로 패스스루되지 않았거나, 호스트의 사운드 드라이버와 충돌하기 때문인데요. 앞서 `pve-blacklist.conf`에 `snd_hda_intel` 등을 blacklist 하는 것으로 대부분 해결됩니다. 저도 이 때문에 한참을 헤맸는데, 간단한 설정으로 해결될 때의 쾌감이란! 😆

    • VM 부팅 시 블랙 스크린

      VM 부팅 시 화면이 아예 안 나오는 경우가 있습니다. 이는 주로 `vga` 옵션 설정 문제입니다. VM 설정에서 `Display`를 `none`으로 설정하고, `vga` 옵션에서 `all` 대신 `qxl` 또는 `virtio`를 시도해보세요. 그리고 패스스루한 GPU를 `Primary GPU`로 설정하는 것도 잊지 마세요.

    5. 드디어 성공! Proxmox 게이밍 VM (검증 및 결과)

    이 모든 삽질과 노력을 거쳐 드디어 **Proxmox 게이밍 VM**이 제 기능을 하는 순간을 맞이했습니다! 가상머신에 Windows를 설치하고, GPU 드라이버를 설치한 다음 장치 관리자를 열어보세요. 여러분의 물리적인 그래픽카드가 ‘디스플레이 어댑터’ 목록에 제대로 인식되어 있다면 성공입니다! ✅

    저는 Windows 10 VM에 NVIDIA RTX 3070을 패스스루해서 게임을 돌려봤는데, 놀랍게도 물리적인 PC에서 돌리는 것과 거의 차이 없는 성능을 보여주더라고요. 벤치마크 점수도 만족스러웠고요. 3DMark 같은 툴로 테스트해봐도 점수가 잘 나옵니다. 이 감동은 직접 경험해보셔야 알 수 있습니다. 드디어 하나의 서버로 게임도 하고, 서버도 돌리는 진정한 홈랩을 구축한 거죠! 😎

    Windows 가상머신 내부의 장치 관리자 화면으로, 패스스루된 NVIDIA 그래픽카드가 ‘디스플레이 어댑터’ 목록에 오류 없이 정상적으로 인식된 상태를 보여줍니다.

    6. Proxmox GPU 패스스루, 그래서 뭐가 좋을까요? (장단점)

    이렇게 힘들게 Proxmox GPU 패스스루를 설정했는데, 과연 어떤 장점과 단점이 있을까요? 제가 직접 경험해본 바를 바탕으로 정리해봤습니다.

    장점 (Pros) 단점 (Cons)
    고성능 그래픽 작업 가능: 가상머신에서 게임, 딥러닝, 영상 편집 등 GPU 자원이 필요한 작업을 원활하게 수행할 수 있습니다. 복잡한 설정 과정: 초기 설정이 매우 복잡하고, 트러블슈팅에 많은 시간과 지식이 필요합니다.
    하드웨어 통합 및 비용 절감: 여러 대의 물리적인 PC 대신 하나의 강력한 서버로 다양한 용도의 VM을 운영할 수 있어 공간과 비용을 절약할 수 있습니다. 호환성 문제: 모든 메인보드, CPU, GPU 조합이 완벽하게 호환되는 것은 아닙니다. 특히 IOMMU 그룹 문제가 발생하기 쉽습니다.
    유연한 자원 할당: 필요에 따라 GPU를 다른 VM으로 할당 변경하거나, 여러 GPU를 각각 다른 VM에 할당할 수 있습니다. 호스트 자원 제약: GPU 패스스루를 사용하면 호스트 시스템은 해당 GPU를 사용할 수 없으며, 호스트의 그래픽 출력이 제한될 수 있습니다.
    운영체제 독립성: Windows, Linux 등 원하는 운영체제에 GPU를 할당하여 사용할 수 있습니다. 전력 소모 및 발열 증가: 고성능 GPU를 사용하면 서버의 전력 소모와 발열이 크게 증가할 수 있습니다.

    Proxmox GPU 패스스루의 주요 장점(고성능 작업, 비용 절감, 유연성)과 단점(복잡한 설정, 호환성 문제, 자원 제약)을 시각적으로 요약한 인포그래픽입니다.

    7. 마무리하며: 다음 도전은 무엇일까요?

    오늘은 Proxmox VE에서 **Proxmox GPU 패스스루**를 통해 가상머신에서 그래픽카드를 활용하는 방법을 자세히 알아봤습니다. 쉽지 않은 과정이었지만, 한번 성공하고 나면 그 만족감은 정말 크실 겁니다. 저도 이 과정을 통해 하드웨어와 가상화 기술에 대한 이해를 한층 더 깊게 할 수 있었어요. 사실 이게 바로 홈랩의 매력이 아닐까 싶습니다. 직접 삽질하고 성공하면서 배우는 것들이 정말 많거든요.

    여러분도 이 가이드를 통해 성공적으로 **가상머신 GPU**를 설정하고, 꿈에 그리던 **Proxmox 게이밍 VM**이나 딥러닝 워크스테이션을 구축하시길 바랍니다. 혹시 더 궁금한 점이나 막히는 부분이 있다면 언제든지 댓글로 질문해주세요. 제가 아는 한에서 최대한 도와드리겠습니다.

    다음번에는 Proxmox에서 USB 패스스루를 통해 로컬 저장 장치나 보안 동글을 가상머신에 연결하는 방법에 대해서도 다뤄볼 예정입니다. 계속해서 ’13년차의 서버실’에 많은 관심 부탁드립니다! 감사합니다. 👋

  • [Proxmox] Proxmox GPU 패스스루 완벽 가이드: 가상 머신에서 고성능 그래픽 활용

    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에서 진행할 수 있어요.

    1. Proxmox 웹 UI에서 패스스루할 VM을 선택합니다.
    2. VM이 꺼진 상태에서 Hardware(하드웨어) 탭으로 이동합니다.
    3. Add > PCI Device를 클릭합니다.
    4. 드롭다운에서 패스스루할 GPU를 선택합니다.
    5. 다음 옵션들을 설정합니다:
    • 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가 인식은 되지만 드라이버가 없는 상태일 거예요.

    1. NVIDIA 또는 AMD 공식 사이트에서 드라이버를 다운로드합니다.
    2. 일반 드라이버 설치하듯 설치하면 됩니다.
    3. 설치 완료 후 재부팅하면 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 패스스루 기본 설정은 완료입니다! 전체 과정을 한 번 정리해볼게요.

    1. ✅ BIOS에서 VT-d / AMD-Vi 활성화
    2. ✅ GRUB에 IOMMU 파라미터 추가
    3. ✅ VFIO 모듈 로드 설정
    4. ✅ 호스트에서 GPU 드라이버 블랙리스트 처리
    5. ✅ VFIO가 GPU PCI ID 선점하도록 설정
    6. ✅ initramfs 업데이트 후 재부팅
    7. ✅ VM에 PCI 디바이스로 GPU 추가 (q35 + OVMF 필수)
    8. ✅ 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로만 관리하는 방식을 권장합니다.

  • [Proxmox] GPU 패스스루 설정 완벽 가이드: 게임 및 AI 워크로드 최적화

    [Proxmox] GPU 패스스루 설정 완벽 가이드: 게임 및 AI 워크로드 최적화

    GPU 패스스루, 처음엔 저도 막막했습니다

    홈랩을 운영하다 보면 언젠가 한 번쯤 이런 생각이 드시죠. “Proxmox VE에서 GPU를 VM에 직접 붙여서 쓸 수 있지 않을까?” 저도 딱 그 생각으로 시작했거든요. RTX 3080을 꽂아놓고 VM 하나는 게임용, 다른 하나는 AI 학습용으로 쓰고 싶었는데… 처음엔 진짜 삽질 좀 했습니다 ㅎㅎ

    IOMMU 설정이 뭔지도 몰랐고, VFIO 드라이버가 왜 필요한지도 감이 없었어요. 근데 막상 해보니까 순서대로 따라가면 생각보다 어렵지 않더라고요. 오늘은 제가 직접 삽질하면서 정리한 Proxmox GPU 패스스루 설정 방법을 처음부터 끝까지 공유해드리려고 합니다. 게임 VM이든 AI 워크로드용 VM이든, 이 가이드 하나면 충분히 따라오실 수 있을 거예요.

    Proxmox VE GPU 패스스루 전체 아키텍처 다이어그램 - IOMMU와 VFIO를 통한 가상머신 GPU 할당 구조

    ▲ Proxmox VE에서 GPU 패스스루가 동작하는 전체 구조. 호스트 OS는 GPU를 직접 쓰지 않고, VFIO를 통해 VM에 전달합니다.

    GPU 패스스루(Passthrough)란 뭔가요?

    쉽게 말해서, 물리 GPU를 가상머신(VM)이 마치 실제 자기 하드웨어인 것처럼 직접 쓸 수 있게 해주는 기술이에요. 일반적인 가상화에서는 GPU를 소프트웨어로 에뮬레이션하거나, Virtio 같은 반가상화 드라이버를 써서 성능 손실이 꽤 있거든요.

    근데 Proxmox GPU 패스스루를 쓰면? 거의 베어메탈(Bare-metal, 운영체제 없이 하드웨어에 직접 설치한 환경) 수준의 GPU 성능이 나와요. 실제로 제가 테스트해봤을 때 3D Mark 점수가 네이티브 대비 98% 수준이 나왔거든요. 이거 처음 봤을 때 진짜 “오, 이게 되네” 싶었습니다.

    핵심 기술 두 가지만 기억하시면 됩니다:

    • IOMMU (Input-Output Memory Management Unit): CPU와 메인보드가 지원해야 하는 하드웨어 기능. Intel은 VT-d, AMD는 AMD-Vi라고 부릅니다. 쉽게 말해 “VM이 특정 하드웨어만 독점적으로 쓸 수 있게 격리해주는 기능”이에요.
    • VFIO (Virtual Function I/O): Linux 커널의 드라이버 프레임워크. 실제 GPU 드라이버 대신 이 녀석이 GPU를 잡아서 VM에게 넘겨주는 역할을 합니다.

    이 두 가지가 핵심이에요. IOMMU가 하드웨어 레벨 격리를 해주고, VFIO가 그 격리된 장치를 VM에 연결해주는 구조죠.

    사전 준비: 하드웨어 호환성 확인

    설정 들어가기 전에 먼저 체크해야 할 것들이 있어요. 여기서 막히면 아무것도 안 되거든요. 저도 처음에 이 확인을 건너뛰었다가 몇 시간 날린 적 있습니다 ㅠㅠ

    필수 확인 사항

    1. CPU 가상화 지원 확인: Intel VT-d 또는 AMD-Vi 지원 여부
    2. 메인보드 BIOS에서 IOMMU 활성화: 대부분 “Intel Virtualization for Directed I/O” 또는 “AMD IOMMU” 옵션으로 있음
    3. GPU 종류 확인: NVIDIA의 경우 Consumer GPU(RTX/GTX)는 Code 43 오류 이슈가 있어서 추가 설정 필요 (뒤에서 다룰게요)
    4. GPU가 별도 IOMMU 그룹에 있는지 확인: 같은 그룹에 다른 중요한 장치가 묶여 있으면 복잡해집니다

    IOMMU 그룹 확인하는 명령어는 이거예요. Proxmox 호스트에서 실행하시면 됩니다:

    #!/bin/bash
    # IOMMU 그룹별 장치 목록 확인
    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가 혼자 또는 HDMI 오디오 장치랑만 같은 그룹에 있으면 이상적입니다:

    IOMMU Group 14 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA102 [GeForce RTX 3080] [10de:2206]
    IOMMU Group 14 01:00.1 Audio device [0403]: NVIDIA Corporation GA102 High Definition Audio Controller [10de:1aef]

    Proxmox VE GPU 패스스루 설정: 단계별 가이드

    자, 이제 본격적으로 Proxmox GPU 패스스루 설정을 시작해볼게요. Proxmox VE 8.x 기준으로 작성했습니다. 7.x도 거의 동일한데, 일부 파일 경로가 다를 수 있어요.

    1단계: GRUB 부트로더에 IOMMU 활성화

    먼저 Proxmox 호스트의 GRUB 설정을 수정해야 해요. /etc/default/grub 파일을 열어서 수정합니다:

    # 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 mode)을 꼭 같이 넣어주세요. 이게 있어야 IOMMU를 사용하지 않는 장치들의 성능 저하를 막을 수 있거든요. 저도 처음엔 이걸 빠뜨렸다가 네트워크 속도가 뚝 떨어지는 경험을 했습니다.

    # GRUB 업데이트
    update-grub

    2단계: VFIO 커널 모듈 로드 설정

    /etc/modules 파일에 VFIO 관련 모듈을 추가해줍니다:

    vfio
    vfio_iommu_type1
    vfio_pci
    vfio_virqfd

    3단계: GPU를 VFIO에 바인딩

    이게 핵심이에요. GPU의 PCI ID를 확인해서 VFIO 드라이버가 이 GPU를 잡도록 설정합니다.

    먼저 GPU의 PCI ID를 확인합니다:

    lspci -nn | grep -i nvidia
    # 또는 AMD GPU의 경우
    lspci -nn | grep -i amd

    출력 예시:

    01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA102 [10de:2206]
    01:00.1 Audio device [0403]: NVIDIA Corporation HD Audio [10de:1aef]

    여기서 [10de:2206]과 [10de:1aef]가 PCI ID예요. 이걸 /etc/modprobe.d/vfio.conf 파일에 등록합니다:

    options vfio-pci ids=10de:2206,10de:1aef disable_vga=1

    그리고 NVIDIA 드라이버가 먼저 GPU를 잡아버리지 못하도록 블랙리스트에 등록합니다. /etc/modprobe.d/blacklist.conf에 추가:

    blacklist nouveau
    blacklist nvidia
    blacklist nvidiafb
    blacklist nvidia_drm

    설정 적용 후 재부팅합니다:

    update-initramfs -u -k all
    reboot

    재부팅 후 VFIO가 GPU를 제대로 잡았는지 확인:

    lspci -nnk -d 10de:2206
    # Kernel driver in use: vfio-pci 라고 나오면 성공!
    Proxmox VE 웹 인터페이스 VM 하드웨어 설정 화면 - GPU PCI 패스스루 설정 옵션

    ▲ Proxmox VE 웹 인터페이스에서 VM에 GPU를 PCI 장치로 추가하는 화면. “All Functions”와 “Primary GPU” 옵션 설정이 핵심입니다.

    4단계: Proxmox VM 설정

    이제 VM에 GPU를 붙일 차례예요. Proxmox 웹 UI에서 해도 되고, 명령어로 해도 됩니다. 저는 명령어가 더 정확해서 선호하는 편이에요.

    VM 설정 파일 /etc/pve/qemu-server/[VM ID].conf에 다음 내용을 추가합니다:

    # 기본 VM 설정
    cpu: host,hidden=1,flags=+pcid
    bios: ovmf
    machine: q35
    
    # GPU 패스스루 설정 (VMID 100 기준)
    hostpci0: 0000:01:00,allFunctions=1,pcie=1,rombar=1,x-vga=1
    
    # 가상 디스플레이는 none으로 (GPU 직접 쓸 거니까)
    vga: none

    ⚠️ 중요한 포인트! 몇 가지 옵션 설명드릴게요:

    • cpu: host,hidden=1: NVIDIA Consumer GPU의 Code 43 오류 방지. VM에게 가상화 환경임을 숨겨줍니다
    • bios: ovmf: UEFI 펌웨어. GPU 패스스루에는 OVMF(Open Virtual Machine Firmware)가 거의 필수에요
    • machine: q35: PCIe 지원이 되는 칩셋 에뮬레이션 타입
    • allFunctions=1: GPU와 HDMI 오디오 등 연관 함수를 모두 같이 패스스루

    5단계: Windows VM에서 드라이버 설치

    VM을 부팅하면 처음에는 디스플레이가 안 보여서 당황할 수 있어요. 이건 정상입니다! 처음 부팅 때는 Proxmox 웹 콘솔(noVNC)로 접속해서 Windows를 설치하고, 이후 NVIDIA 드라이버를 설치하면 돼요.

    Windows 설치 후 장치 관리자에서 GPU가 제대로 잡혔는지 확인하고, NVIDIA 공식 사이트에서 드라이버를 받아 설치합니다. 드라이버 설치 완료 후 재부팅하면 GPU가 정상 작동하는 걸 확인할 수 있어요.

    ⚠️ 삽질 모음: 이런 문제들 겪으실 수 있어요

    제가 진짜 고생했던 문제들이에요. 미리 알고 계시면 시간을 많이 아낄 수 있습니다.

    문제 1: NVIDIA Code 43 오류

    Consumer GPU(RTX/GTX 시리즈)는 VM 환경을 감지하면 드라이버가 Code 43 오류를 내뿜어요. NVIDIA가 의도적으로 막아놓은 거거든요 (Quadro나 Tesla는 이런 제한 없어요).

    해결 방법: 위에서 언급한 hidden=1 옵션에 더해서, VM 설정 파일에 다음을 추가합니다:

    args: -cpu 'host,+kvm_pv_unhalt,+kvm_pv_eoi,hv_vendor_id=NvidiaFTW,kvm=off'

    hv_vendor_id 값은 아무 문자열이나 넣어도 되는데, 12자 이내여야 해요. 이렇게 하면 VM이 가상화 환경임을 NVIDIA 드라이버가 눈치채지 못합니다.

    문제 2: IOMMU 그룹 분리 문제 (ACS Override)

    가끔 GPU가 다른 장치들이랑 같은 IOMMU 그룹에 묶여 있는 경우가 있어요. 이럴 때 패스스루를 하면 같은 그룹의 다른 장치들도 VM에 넘겨야 하는 문제가 생기죠.

    해결 방법: ACS(Access Control Services) 오버라이드 패치를 사용합니다. Proxmox에서는 커널 파라미터로 해결할 수 있어요:

    # /etc/default/grub 수정
    GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction"

    ⚠️ 단, ACS 오버라이드는 보안상 위험이 있을 수 있으니 홈랩 환경에서만 사용 권장합니다.

    문제 3: 재부팅 후 VM이 GPU를 못 찾는 경우

    이건 VFIO 모듈이 NVIDIA 드라이버보다 늦게 로드되어서 생기는 문제예요. /etc/modprobe.d/vfio.conf에 다음을 추가하면 해결됩니다:

    softdep nvidia pre: vfio-pci
    softdep nouveau pre: vfio-pci

    AI 워크로드 최적화: Proxmox에서 다르게 접근하기

    게임 VM은 단일 VM에 GPU 하나를 통째로 주면 끝인데, AI 워크로드 Proxmox 환경에서는 조금 다른 접근이 필요할 수 있어요. 특히 여러 VM이 GPU를 나눠 써야 하는 경우에는 MIG(Multi-Instance GPU)나 vGPU 같은 옵션도 고려해볼 수 있거든요.

    방식 성능 VM 수 적합한 용도 비고
    GPU 패스스루 ★★★★★ 1개 VM 독점 게임, 단일 AI 학습 무료, 설정 복잡
    vGPU ★★★★☆ 여러 VM 공유 AI 추론, VDI 라이선스 비용 발생
    MIG ★★★★☆ 최대 7개 분할 AI 추론, 멀티 테넌트 A100/H100만 지원
    소프트웨어 에뮬레이션 ★☆☆☆☆ 제한 없음 테스트 용도만 무료, 성능 매우 낮음

    AI 워크로드를 Proxmox에서 돌릴 때 제가 실제로 쓰는 설정을 공유드릴게요. GPU 패스스루 VM에서 CUDA 작업을 할 때 성능을 최대화하는 CPU 핀닝(CPU Pinning, 특정 VM의 CPU를 물리 코어에 고정하는 기술) 설정입니다:

    # VM 설정 파일에 추가
    # 8코어 CPU 핀닝 예시 (물리 코어 0-7을 VM에 할당)
    cpuunits: 1024
    numa: 1
    
    # 명령어로 CPU 핀닝 설정
    qm set 100 --cpu host --cores 8 --sockets 1
    
    # HugePages 설정 (메모리 성능 향상)
    # /etc/sysctl.conf에 추가
    vm.nr_hugepages = 4096
    Proxmox GPU 패스스루 AI 워크로드 성능 비교 벤치마크 - 네이티브 대비 95% 이상 성능 달성

    ▲ Proxmox GPU 패스스루 환경에서 AI 학습 워크로드 성능 비교. 패스스루 방식이 네이티브 대비 95% 이상의 성능을 보여줍니다.

    ✅ 설정 완료 후 검증 방법

    설정이 다 끝났다면 제대로 됐는지 확인해봐야죠. 제가 항상 하는 검증 순서를 알려드릴게요.

    호스트 측 검증

    # IOMMU가 활성화됐는지 확인
    dmesg | grep -e DMAR -e IOMMU
    # "IOMMU enabled" 메시지가 보이면 OK
    
    # VFIO가 GPU를 잡았는지 확인
    lspci -nnk | grep -A 3 "NVIDIA"
    # "Kernel driver in use: vfio-pci" 가 나와야 함
    
    # IOMMU 그룹 확인
    find /sys/kernel/iommu_groups/ -type l | sort -V

    VM 내부(Windows) 검증

    1. 장치 관리자에서 GPU가 정상 인식되는지 확인 (노란 느낌표 없어야 함)
    2. GPU-Z 툴로 실제 GPU 정보가 올바르게 표시되는지 확인
    3. 3D Mark 벤치마크로 성능 측정 (네이티브 대비 95% 이상이면 성공)

    AI 워크로드 검증 (Linux VM)

    # NVIDIA 드라이버 및 CUDA 확인
    nvidia-smi
    
    # PyTorch에서 GPU 인식 확인
    python3 -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"
    
    # GPU 메모리 대역폭 테스트
    nvidia-smi dmon -s u

    🎉 드디어 됐다! 저도 처음 nvidia-smi에서 RTX 3080이 뜨는 거 봤을 때 얼마나 기뻤는지 모릅니다. 몇 시간의 삽질이 한 번에 보상받는 느낌이랄까요.

    마무리: Proxmox GPU 패스스루 설정 완벽 가이드

    Proxmox VE GPU 패스스루 설정 단계 요약 인포그래픽 - BIOS부터 VM 설정까지 5단계 과정

    ▲ Proxmox VE GPU 패스스루 설정 전체 과정 요약. BIOS → GRUB → VFIO → VM 설정 순서로 진행하면 됩니다.

    오늘 다룬 내용을 간단히 정리해드릴게요:

    • ✅ BIOS에서 IOMMU(VT-d/AMD-Vi) 활성화
    • ✅ GRUB에 intel_iommu=on iommu=pt 파라미터 추가
    • ✅ VFIO 모듈 등록 및 GPU PCI ID 바인딩
    • ✅ NVIDIA 드라이버 블랙리스트 처리
    • ✅ VM을 Q35 + OVMF 조합으로 설정
    • ✅ Consumer GPU는 hidden=1 + hv_vendor_id로 Code 43 우회

    솔직히 말씀드리면, GPU 패스스루는 처음 한 번 성공하고 나면 그다음부터는 별거 아니에요. 근데 그 처음 한 번이 진짜 험난하죠 ㅎㅎ 이 가이드가 그 험난한 여정을 조금이라도 줄여드렸으면 좋겠습니다.

    AI 워크로드로 활용하실 분들은 다음 단계로 Proxmox에서 Kubernetes 클러스터를 구성하고 GPU 노드를 연결하는 방법도 다룰 예정이에요. 그쪽이 진짜 재미있거든요. 그리고 vGPU 설정에 관심 있으신 분들은 이전 글에서 NVIDIA GRID 드라이버 설치 방법도 다뤘으니 참고해보세요.

    혹시 설정하다가 막히는 부분 있으시면 댓글로 남겨주세요. 제가 겪어본 삽질은 거의 다 공유해드릴 수 있을 것 같습니다 😄

    자주 묻는 질문 (FAQ)

    Q. RTX 4090도 Proxmox GPU 패스스루가 되나요?

    네, 됩니다! 다만 RTX 40 시리즈는 PCIe 5.0을 쓰는데, 메인보드와 Proxmox 버전에 따라 일부 추가 설정이 필요할 수 있어요. 기본 흐름은 동일합니다.

    Q. 하나의 GPU를 여러 VM이 동시에 쓸 수 있나요?

    일반 패스스루로는 불가능해요. 동시에 여러 VM이 쓰려면 NVIDIA vGPU(유료 라이선스) 또는 A100/H100의 MIG 기능을 사용해야 합니다.

    Q. 패스스루 후 호스트에서 GPU를 모니터로 쓸 수 있나요?

    VFIO에 바인딩된 GPU는 호스트에서 사용할 수 없어요. 보통 온보드 그래픽이나 별도 저가형 GPU를 호스트 디스플레이용으로 쓰고, 메인 GPU는 패스스루용으로 분리하는 방식을 많이 씁니다.

    Q. Proxmox 8 버전에서도 동일하게 적용되나요?

    네, 이 가이드는 Proxmox VE 8.x 기준으로 작성됐습니다. 7.x도 거의 동일하고, 6.x는 일부 모듈 이름이 다를 수 있어요.