---
title: "OpenStack에서 GPU PCI Passthrough 설정: AI 및 고성능 그래픽을 위한 완벽 가이드"
description: "OpenStack에서 GPU를 VM에 직접 제공하기 위한 PCI Passthrough 설정 과정을 단계별로 안내하며, IOMMU와 VFIO‑PCI 활성화, Nova와 Compute 노드의 PCI alias 및 whitelist 구성, Flavor에 GPU 할당 속성 추가, NVIDIA GPU의 Audio Device 포함 설정, 그리고 모든 GPU를 Passthrough하려면 별도 출력용 GPU가 필요함을 설명하고, 주요 트러블슈팅 포인트와 해결 방법을 제공한다."
date: "2025-06-16"
last_modified: "2026-08-06T00:36:00.000Z"
type: "Post"
tags:
  - "openstack"
  - "troubleshooting"
categories:
  - "📗 Docs"
series:
  - "오픈스택 운영"
canonical_url: "https://blog.pieroot.xyz/openstack-gpu-pci-passthrough"
markdown_url: "https://blog.pieroot.xyz/openstack-gpu-pci-passthrough.md"
---

# OpenStack에서 GPU PCI Passthrough 설정: AI 및 고성능 그래픽을 위한 완벽 가이드

OpenStack에서 GPU를 VM에 직접 제공하기 위한 PCI Passthrough 설정 과정을 단계별로 안내하며, IOMMU와 VFIO‑PCI 활성화, Nova와 Compute 노드의 PCI alias 및 whitelist 구성, Flavor에 GPU 할당 속성 추가, NVIDIA GPU의 Audio Device 포함 설정, 그리고 모든 GPU를 Passthrough하려면 별도 출력용 GPU가 필요함을 설명하고, 주요 트러블슈팅 포인트와 해결 방법을 제공한다.

### 서론: GPU가 필요한 VM을 어떻게 제공할까?

OpenStack 환경에서 사용자에게 인스턴스를 제공할 때, **GPU가 필요한 경우**가 종종 있습니다. 인공지능 모델 학습이나 추론, 고성능 그래픽 처리가 대표적인 예입니다.

이번 글에서는 OpenStack에서 GPU를 제공하는 방법 중 하나인 **PCI Passthrough**를 설정하는 전체 과정을 다룹니다. 삽질의 역사도 함께 담았으니, 비슷한 환경을 구축하시는 분들께 도움이 되길 바랍니다.

> **이 글에서 다루는 내용**
> 
> - GPU Passthrough와 vGPU의 차이점
> 
> - IOMMU 및 VFIO-PCI 드라이버 설정
> 
> - Nova API, Scheduler, Compute 노드 설정
> 
> - NVIDIA GPU의 Audio Device 처리 방법
> 
> - 모든 GPU 활용을 위한 트러블슈팅

---

### 1. GPU 제공 방식 비교: Passthrough vs vGPU

GPU를 VM에 제공하는 방법은 크게 **GPU Passthrough(직접 제공)**와 **vGPU(간접 제공)** 두 가지가 있습니다.

![OpenStack GPU 제공 방식 비교: Passthrough vs vGPU](https://blog.pieroot.xyz/api/image-proxy?id=7f5b4b97-f03b-45d4-b88f-c36e14f180ff&kind=s3&pageId=214067c0-15d0-8084-8b3b-c0fce5964645&source=block&blockId=4ce8caa0-4da7-4547-8cab-b107131a1944)

**GPU(PCI) Passthrough**는 사용자의 인스턴스(VM)에 GPU가 연결된 PCI-E 라인을 직접 연결하는 방식입니다. 가상화 계층을 거치지 않기 때문에 네이티브에 가까운 성능을 제공할 수 있습니다.

반면 **vGPU**는 가상화를 통해 하나의 물리 GPU를 여러 VM에서 나눠 쓸 수 있다는 장점이 있지만, NVIDIA GRID 등의 라이센스 비용이 추가로 발생합니다.

> **언제 어떤 방식을 선택해야 할까요?**
> 
> - **Passthrough**: 딥러닝 학습처럼 GPU 전체 성능이 필요한 경우
> 
> - **vGPU**: 여러 사용자가 가벼운 추론 작업을 나눠서 할 때
> 
> 이번 글에서는 라이센스 비용이 들지 않는 **GPU Passthrough** 방식을 다룹니다.

---

### 2. 사전 준비 및 동작 원리

[OpenStack Docs: Attaching physical PCI devices to guests](https://docs.openstack.org/nova/pike/admin/pci-passthrough.html)

[OpenStack Docs: PCI Passthrough](https://docs.openstack.org/project-deploy-guide/charm-deployment-guide/wallaby/app-pci-passthrough-gpu.html)

OpenStack 구성이 모두 완료된 상태에서 진행해야 합니다. 위 공식 문서들을 참고하면 자세한 내용을 확인할 수 있습니다.

![OpenStack GPU PCI Passthrough 동작 원리](https://blog.pieroot.xyz/api/image-proxy?id=beab8e4f-399e-4811-a2e6-9687ea6e7de8&kind=s3&pageId=214067c0-15d0-8084-8b3b-c0fce5964645&source=block&blockId=99b5e3f9-d7e7-449b-b5c6-5eb70e88e6fb)

> **PCI Passthrough 동작 원리**
> 
> PCI Passthrough는 호스트의 하이퍼바이저를 우회하여 게스트 VM이 물리적 PCI 장치에 직접 접근할 수 있게 합니다. 이를 위해 두 가지 핵심 기술이 필요합니다:
> 
> 1. **IOMMU** (Input-Output Memory Management Unit): CPU가 제공하는 하드웨어 가상화 기술로, 장치별로 메모리 영역을 격리하여 VM이 안전하게 PCI 장치에 접근할 수 있게 합니다. Intel에서는 **VT-d**, AMD에서는 **AMD-Vi**라고 부릅니다.
> 
> 1. **VFIO** (Virtual Function I/O): 리눅스 커널의 프레임워크로, 사용자 공간 프로그램(예: QEMU)이 하드웨어 장치를 안전하고 효율적으로 제어할 수 있게 해줍니다.

#### 2.1 하드웨어 상태 확인

현재 컴퓨트 노드에 어떤 GPU가 연결되어 있는지 먼저 확인합니다.

![image](https://blog.pieroot.xyz/api/image-proxy?id=46744778-30a2-4134-a6b7-d437ff15a2a7&kind=s3&pageId=214067c0-15d0-8084-8b3b-c0fce5964645&source=block&blockId=214067c0-15d0-80df-b3bf-fb5d8dab6965)

다음 명령어로 GPU의 vendor\_id와 product\_id를 확인할 수 있습니다:

```bash
# PCI 장치 목록 확인
lspci -nn | grep -i nvidia

# 상세 정보 확인
lspci -vnn -d 10de:
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=2e78bea1-80b4-41f9-ad25-b9898280fb40&kind=s3&pageId=214067c0-15d0-8084-8b3b-c0fce5964645&source=block&blockId=214067c0-15d0-8048-b565-c01e04f2d518)

위 환경에서는 GTX 1080 Ti 2장이 연결되어 있습니다. 각각의 정보는 다음과 같습니다:

- **Vendor ID**: `10de` (NVIDIA)

- **Product ID**: `1b06` (GTX 1080 Ti)

이 정보를 기록해두고 아래 설정에서 사용합니다.

---

### 3. IOMMU 설정 (Compute 노드)

IOMMU는 시스템의 컴퓨팅 자원(GPU, NIC 등)을 가상 머신에 직접 매핑하기 위해 필요한 기술입니다.

![image](https://blog.pieroot.xyz/api/image-proxy?id=c127fb00-d7c0-44ff-80af-942ee9840891&kind=s3&pageId=214067c0-15d0-8084-8b3b-c0fce5964645&source=block&blockId=214067c0-15d0-8012-abf1-d7752c97bbfd)

#### 3.1 GRUB 설정

`/etc/default/grub` 파일을 수정하여 IOMMU를 활성화합니다:

```bash
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on iommu=pt vfio-pci.ids=10de:1b06,10de:10ef vfio_iommu_type1.allow_unsafe_interrupts=1 modprobe.blacklist=nvidiafb,nouveau"
```

> **GRUB 옵션 상세 설명**
> 
> - `intel_iommu=on`: Intel VT-d 활성화 (AMD의 경우 `amd_iommu=on`)
> 
> - `iommu=pt`: IOMMU Pass-Through 모드 활성화 (성능 향상)
> 
> - `vfio-pci.ids=10de:1b06,10de:10ef`: VFIO 드라이버에 바인딩할 장치 ID
> 
> - `vfio_iommu_type1.allow_unsafe_interrupts=1`: 인터럽트 리매핑이 없는 시스템에서 필요
> 
> - `modprobe.blacklist=nvidiafb,nouveau`: 호스트에서 NVIDIA 드라이버 로드 방지

#### 3.2 설정 적용 및 재부팅

```bash
# GRUB 설정 업데이트
sudo update-grub

# 시스템 재부팅
sudo reboot
```

#### 3.3 설정 확인

재부팅 후 VFIO-PCI 드라이버가 정상적으로 바인딩되었는지 확인합니다:

```bash
lspci -nnk -d 10de:
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=a59f36ff-820c-4639-b79b-21b024281716&kind=s3&pageId=214067c0-15d0-8084-8b3b-c0fce5964645&source=block&blockId=214067c0-15d0-80b4-bdf6-eb12238765c2)

`Kernel driver in use: vfio-pci`가 표시되면 정상적으로 설정된 것입니다.

> **Tip**: VFIO-PCI가 활성화되지 않은 경우, 다음 사항을 점검해보세요:
> 
> - BIOS에서 VT-d (Intel) 또는 AMD-Vi (AMD) 활성화 여부
> 
> - Secure Boot 비활성화 필요 여부
> 
> - `dmesg | grep -i iommu` 로 IOMMU 활성화 로그 확인

---

### 4. Nova 설정

이제 OpenStack Nova 컴포넌트들을 설정해야 합니다. Controller 노드와 Compute 노드 양쪽에서 설정이 필요합니다.

#### 4.1 Nova API 설정 (Controller 노드)

![image](https://blog.pieroot.xyz/api/image-proxy?id=4df124ed-0f99-4197-8bb1-9237e0e5b757&kind=s3&pageId=214067c0-15d0-8084-8b3b-c0fce5964645&source=block&blockId=214067c0-15d0-8002-9518-fd4c610d98c8)

Controller 노드(또는 nova-api가 실행되는 노드)에서 PCI alias를 설정합니다.

```bash
[pci]
alias = { "vendor_id": "제조사 아이디", "product_id": "제품 아이디", "device_type": "제품 제공 방법", "name": "라벨링할 이름" }
```

이런 형태로 설정을 해주면 된다.

```bash
[pci]
alias = { "vendor_id": "10de", "product_id": "1b06", "device_type": "type-PCI", "name": "GTX-1080ti" }
```
*/etc/nova/nova.conf*

> **alias 설정 시 주의사항**
> 
> 공식 문서에는 alias를 리스트 형태로 입력할 수 있다고 나와 있지만, **실제로는 개별 항목으로 여러 줄 작성**해야 합니다. 리스트로 묶어서 입력하면 파싱 에러가 발생합니다. 이 부분에서 꽤 삽질했습니다... 😅

#### 4.2 Nova Scheduler 설정 (Controller 노드)

![image](https://blog.pieroot.xyz/api/image-proxy?id=52660c06-f9f7-4a41-9028-9686fbc8aa68&kind=s3&pageId=214067c0-15d0-8084-8b3b-c0fce5964645&source=block&blockId=214067c0-15d0-8062-90f3-d3acc9846049)

스케줄러 설정을 해줘야 Controller에서 GPU가 있는 Compute 노드를 찾을 수 있습니다.

```bash
[filter_scheduler]
enabled_filters = PciPassthroughFilter
available_filters = nova.scheduler.filters.all_filters
```
*/etc/nova/nova.conf*

> **기존에 다른 필터가 설정되어 있다면?**
> 
> 기존 필터 목록에 `PciPassthroughFilter`를 **추가**하면 됩니다:
> 
> ```javascript
> enabled_filters = AvailabilityZoneFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,PciPassthroughFilter
> ```

#### 4.3 Flavor 설정 (Controller 노드)

![image](https://blog.pieroot.xyz/api/image-proxy?id=841df6f0-5b6c-4c49-a9e8-08dd922200ef&kind=s3&pageId=214067c0-15d0-8084-8b3b-c0fce5964645&source=block&blockId=214067c0-15d0-803c-afac-f5c3af618c4c)

사용자가 GPU가 포함된 인스턴스를 생성할 수 있도록 Flavor에 PCI Passthrough 속성을 추가합니다.

```bash
openstack flavor set g1 --property "pci_passthrough:alias"="GTX-1080ti:1"
```

> **GPU 여러 개를 할당하려면?**
> 
> 숫자를 늘려주면 됩니다:
> 
> ```bash
> # GPU 2개 할당
> openstack flavor set g2 --property "pci_passthrough:alias"="GTX-1080ti:2"
> ```

#### 4.4 Nova Compute 설정 (Compute 노드)

![image](https://blog.pieroot.xyz/api/image-proxy?id=a002a161-09f6-4084-a17c-792f12a55578&kind=s3&pageId=214067c0-15d0-8084-8b3b-c0fce5964645&source=block&blockId=214067c0-15d0-8099-8e2a-dd83d1b36440)

Compute 노드에서는 **passthrough\_whitelist**와 **alias** 두 가지를 모두 설정해야 합니다.

```bash
[pci]
passthrough_whitelist = { "vendor_id": "10de", "product_id": "1b06" }
alias = { "vendor_id": "10de", "product_id": "1b06", "device_type": "type-PCI", "name": "GTX-1080ti" }
```
*/etc/nova/nova.conf*

> **중요: Controller와 Compute의 alias 설정이 동일해야 합니다!**
> 
> alias 이름(`GTX-1080ti`)이 Controller와 Compute에서 다르면 스케줄링이 제대로 되지 않습니다. 복사-붙여넣기로 동일하게 유지하세요.

#### 4.5 서비스 재시작

설정을 적용하려면 Nova 서비스를 재시작해야 합니다.

```bash
# Controller 노드
sudo systemctl restart nova-api nova-scheduler

# Compute 노드
sudo systemctl restart nova-compute
```

---

이론적으로는 여기까지 설정하면 정상 동작해야 합니다. 하지만 현실은 그렇지 않죠... 😭 이제 어떤 문제가 있었고 어떻게 해결했는지 살펴보겠습니다.

### 5. 트러블슈팅

여기서부터는 실제로 겪었던 문제들과 해결 방법을 공유합니다. 비슷한 환경을 구축하시는 분들은 이 부분을 주의 깊게 봐주세요!

#### 5.1 NVIDIA GPU의 Audio Device 문제

NVIDIA GPU는 하나의 물리 장치에 **VGA controller**와 **Audio device** 두 개가 함께 잡힙니다.

![image](https://blog.pieroot.xyz/api/image-proxy?id=eafdad90-6e6c-405c-b501-85269693ac51&kind=s3&pageId=214067c0-15d0-8084-8b3b-c0fce5964645&source=block&blockId=214067c0-15d0-802a-bd67-f401a84f0169)

> **핵심 포인트**: PCI Passthrough를 할 때는 VGA만 제공해서는 안 되고, **Audio device까지 함께 제공**해야 합니다!

Compute 노드와 Controller 노드의 `passthrough_whitelist`와 `alias`를 수정해야 합니다.

```bash
[pci]
passthrough_whitelist = [{ "vendor_id": "10de", "product_id": "1b06" },{ "vendor_id": "10de", "product_id": "10ef" }]
alias = { "vendor_id": "10de", "product_id": "1b06", "device_type": "type-PCI", "name": "GTX-1080ti" }
alias = { "vendor_id": "10de", "product_id": "10ef", "device_type": "type-PCI", "name": "GTX-1080ti-audio" }
```
*/etc/nova/nova.conf - compute*

`passthrough_whitelist`는 리스트 형태로 입력이 가능합니다.

공식 문서에는 alias 또한 리스트로 입력할 수 있다고 나와 있지만...

![image](https://blog.pieroot.xyz/api/image-proxy?id=a7dbb081-c53e-40d3-aa14-da3296afa13a&kind=s3&pageId=214067c0-15d0-8084-8b3b-c0fce5964645&source=block&blockId=214067c0-15d0-80df-b414-d46944e20707)

위 예시처럼 **필요한 만큼 alias를 개별 항목으로 추가**해야 합니다.

![image](https://blog.pieroot.xyz/api/image-proxy?id=a1cb52d8-d5f1-4fcc-a7d5-bda5a32859a6&kind=s3&pageId=214067c0-15d0-8084-8b3b-c0fce5964645&source=block&blockId=214067c0-15d0-8032-89a2-c45a09992566)

alias를 리스트로 묶어서 넣으면 위와 같은 파싱 에러가 발생합니다. 이거 찾는데 시간 좀 들었습니다... 😢

```bash
[pci]
alias = { "vendor_id": "10de", "product_id": "1b06", "device_type": "type-PCI", "name": "GTX-1080ti" }
alias = { "vendor_id": "10de", "product_id": "10ef", "device_type": "type-PCI", "name": "GTX-1080ti-audio" }
```
*/etc/nova/nova.conf - controller*

Controller 노드도 동일하게 alias를 설정해야 합니다.

그다음 **Flavor 설정도 수정**해야 합니다. Audio device를 Flavor에 추가하지 않으면 GPU만 패스스루되고 Audio는 연결되지 않습니다.

```shell
openstack flavor set g1 --property "pci_passthrough:alias"="GTX-1080ti:1,GTX-1080ti-audio:1"
```

> **완료!** 이렇게 설정하면 GPU와 Audio device가 함께 VM에 할당됩니다.

#### 5.2 설치된 GPU 전체를 Passthrough할 수 없는 경우

이 문제는 예상보다 많은 분들이 겪는 상황입니다.

Ubuntu에는 Server(CLI)와 Desktop(GUI) 두 가지 버전이 있습니다. Server 버전은 Desktop Manager가 없으니 GPU가 필요 없을 것 같지만... **실제로는 모든 서버가 부팅하려면 최소한 하나의 GPU가 필요합니다.**

저희 환경에서는:

- 온보드/온칩 GPU가 **없음**

- 외장 GPU만 있는 상태

- 모든 GPU를 Passthrough로 제공하고 싶음

Ubuntu를 **Headless 모드**로 부팅하면 이론상 모든 GPU를 Passthrough할 수 있습니다. 하지만 실제로 해보면 **하나는 정상 동작하지 않습니다.**

> **원인 분석**
> 
> 여러 사이트와 GPT를 열심히 갈구며 확인한 결과... 😅
> 
> VFIO-PCI로 GPU를 VM에 넘기더라도, **호스트 머신이 CLI 렌더링을 위해 계속 GPU 드라이버를 사용**하고 있었습니다.

**해결 방법은 두 가지입니다:**

1. **여분의 화면 출력용 GPU 사용** ← 저희가 선택한 방법

1. 시리얼 콘솔로 리다이렉션 (보드에 콘솔 포트가 있어야 함)

저희 환경에는 콘솔 포트가 없어서 **저렴한 GPU를 화면 출력용으로 추가**하기로 했습니다.

![image](https://blog.pieroot.xyz/api/image-proxy?id=e6aca73a-c8a9-45ec-ad37-db147169b2bc&kind=s3&pageId=214067c0-15d0-8084-8b3b-c0fce5964645&source=block&blockId=719b8e20-47ac-4214-870e-3128328a0ee2)

구성이 다소 바뀌어 **RTX-2000 Ada 2개** 있던 서버에 쓸팡에서 저렴한 가격에 **GT 625**를 구매하여 추가로 장착했습니다.

- **1슬롯, 1팬** 켤팩트한 제품

- 역할: 부팅 시 CLI 출력 담당

- 설정: 위와 동일 (별도 설정 불필요)

> **최종 결과**
> 
> - **RTX-2000 Ada 2장**: PCI Passthrough로 VM에서 온전히 활용
> 
> - **GT 625**: 호스트 CLI 렌더링 전담

추후 콘솔용 시리얼 포트를 설치하고 GPU를 대체할 수 있을지 테스트해보려 합니다.

---

### 6. 마무리

OpenStack에서 GPU PCI Passthrough를 구성하는 전체 과정을 살펴봤습니다. 정리하면:

> **핵심 설정 체크리스트**
> 
> 1. **IOMMU 활성화**: GRUB에서 `intel_iommu=on` (AMD는 `amd_iommu=on`) 설정
> 
> 1. **VFIO-PCI 바인딩**: GPU를 `vfio-pci` 드라이버에 연결
> 
> 1. **Nova 설정**: Controller와 Compute 모두 alias 동일하게 설정
> 
> 1. **Audio Device 포함**: NVIDIA GPU는 VGA + Audio 모두 Passthrough
> 
> 1. **화면 출력용 GPU**: 모든 GPU를 Passthrough하려면 별도 GPU 필요

삽질의 연속이었지만, 성공적으로 구성을 마쳤습니다. 비슷한 환경을 구축하시는 분들에게 도움이 되었으면 좋겠습니다! 🚀

---

### 참고 자료

- [OpenStack Nova PCI Passthrough 공식 문서](https://docs.openstack.org/nova/latest/admin/pci-passthrough.html)

- [Red Hat OpenStack PCI Passthrough 가이드](https://docs.redhat.com/en/documentation/red_hat_openstack_platform/16.2/html/configuring_the_compute_service_for_instance_creation/assembly_configuring-pci-passthrough_compute-pci)

- [Superuser OpenInfra GPU Passthrough 가이드](https://superuser.openinfra.dev/articles/gpu-passthrough-openstack-nova/)
