virtualization / knowledge

iGPU의 vbios를 뽑아 VM에 romfile로 물리기

paul 2025.10.13 316words (1m)

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 으로 떨궈준다.

console
$ gcc vbios.c -o vbios
$ ./vbios
dump vbios 1002:164e to vbios_1002_164e.bin

나온 파일을 Proxmox가 romfile을 찾는 위치로 옮긴다.

console
$ 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에 없어서 파일을 열게 된다.

bash
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 안에서 본다.

console
$ 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])

장치가 보이면 절반은 됐다. 드라이버까지 물렸는지는 이쪽을 본다.

console
$ 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 이 있어야 한다. 이게 없으면 장치는 보이는데 드라이버가 못 붙은 상태라 트랜스코딩 같은 건 안 된다.