iGPU의 vbios를 뽑아 VM에 romfile로 물리기
host에서 vfio-pci 가 GPU를 잡았으면 이제 VM 쪽 차례다. 내장 GPU는 외장 카드와 달리 보드에 vbios ROM이 따로 없어서, VM이 초기화할 때 참조할 vbios를 직접 꺼내 넘겨줘야 한다.
VM의 machine type은 q35 여야 한다. i440fx로는 PCIe 장치를 제대로 못 넘긴다.
vbios 꺼내기
AMD 시스템은 ACPI 테이블의 VFCT 안에 vbios 이미지가 들어 있다. /sys/firmware/acpi/tables/VFCT 를 읽어서 이미지 부분만 잘라내면 된다.
ryzen-gpu-passthrough-proxmox에 이 작업을 하는 vbios.c 가 있다. VFCT 헤더를 읽어 VBIOSImageOffset 부터 각 이미지 블록을 순회하면서 vbios_<vendor>_<device>.bin 으로 떨궈준다.
$ gcc vbios.c -o vbios
$ ./vbios
dump vbios 1002:164e to vbios_1002_164e.bin
나온 파일을 Proxmox가 romfile을 찾는 위치로 옮긴다.
$ mv vbios_*.bin /usr/share/kvm/vbios_7xxx.bin
VM에 PCI 장치 붙이기
웹 UI에서 VM → Hardware → Add → PCI Device로 들어간다.
| 항목 | 값 |
|---|---|
| Raw device | 앞에서 확인한 PCI ID (75:00.0, 75:00.1) |
| All Functions | OFF |
| Primary GPU | OFF |
| PCI-Express | ON |
All Functions 를 끄고 VGA와 오디오를 각각 따로 추가했다. Primary GPU 를 켜면 Proxmox가 이 GPU로 콘솔을 띄우려 해서 켜지 않았다.
PCI-Express 는 반드시 켜야 한다. 이게 꺼져 있으면 장치가 PCI로 붙어서 GPU가 제대로 초기화되지 않는다.
conf 손보기
/etc/pve/qemu-server/<VM_ID>.conf 를 직접 고쳤다. PCI Device 편집 화면에서 Advanced를 켜면 ROM-File 칸이 나오므로 거기서 넣어도 되지만, args 는 어차피 UI에 없어서 파일을 열게 된다.
args: -cpu 'host,-hypervisor,kvm=off'
hostpci0: 0000:75:00.0,pcie=1,romfile=vbios_7xxx.bin
hostpci0 줄에 romfile= 을 붙이는 게 핵심이다. 파일 이름만 적으면 /usr/share/kvm/ 아래에서 찾는다.
args 쪽은 게스트에게 가상화 환경임을 숨기는 설정이다. 일부 GPU 드라이버가 VM 안이라는 걸 감지하면 동작을 거부한다.
확인
VM 안에서 본다.
$ sudo lspci -nnv | grep VGA
02:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Raphael [1002:164e] (rev c5) (prog-if 00 [VGA controller])
장치가 보이면 절반은 됐다. 드라이버까지 물렸는지는 이쪽을 본다.
$ ls -la /dev/dri
crw-rw---- 1 root video 226, 0 Oct 13 22:42 card0
crw-rw---- 1 root video 226, 1 Oct 13 22:42 card1
crw-rw---- 1 root render 226, 128 Oct 13 22:42 renderD128
renderD128 이 있어야 한다. 이게 없으면 장치는 보이는데 드라이버가 못 붙은 상태라 트랜스코딩 같은 건 안 된다.