Proxmox에서 GVT-g(그래픽 가상화) 활성화하고 헤놀로지에 적용하기
위 글을 보고 혹시 저처럼 내장 그래픽카드를 여러 곳에 쪼개서 사용하고 싶으신 분들이 있으실 것 같아 한번 작성해 봅니다.
전체적인 내용은 https://3os.org/infrastructure/proxmox/gpu-passthrough/igpu-split-passthrough 를 참고하였으며, 제 시행착오를 조금 첨가하였습니다.
GVT-g란?
GVT-g는 인텔 CPU에서 사용할 수 있는 그래픽 가상화 기술입니다. 5세대부터 10세대 사이의 인텔 CPU에서 사용 가능하며, 내장 그래픽 카드 전체를 하나의 VM에 넘겨 주는 GVT-d와는 달리, 하나의 내장 그래픽을 마치 여러 개의 그래픽 카드인 것처럼 쪼개어 여러 VM에 동시에 할당이 가능합니다.
사용해 보기
가이드에 사용한 CPU는 인텔 펜티엄 골드 G5400(8세대)입니다.
1. GRUB 설정 수정
먼저 Proxmox VE에 SSH로 연결하시거나 웹 UI에 있는 쉘을 활용하여 Proxmox에 진입합니다.
터미널에서 "nano /etc/default/grub" 명령어를 입력하여 GRUB 설정 파일을 수정합니다.
(PVE에 sudo 명령어가 없어서 sudo는 안 붙이셔도 됩니다.)
설정 파일의 'GRUB_CMDLINE_LINUX_DEFAULT="quiet"'이라 되어 있는 부분을 아래와 같이 수정합니다.
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on i915.enable_gvt=1 iommu=pt pcie_acs_override=downstream,multifunction video=efifb:off video=vesa:off vfio_iommu_type1.allow_unsafe_interrupts=1 kvm.ignore_msrs=1 modprobe.blacklist=radeon,nouveau,nvidia,nvidiafb,nvidia-gpu"
수정을 완료하셨다면 Ctrl+X > Y > 엔터를 차례대로 입력하여 저장 후 빠져나오면 됩니다.
이후 터미널에 "update-grub" 명령어를 입력하여 설정을 적용시켜주면 됩니다.
다음은 vfio, kvmgt 모듈을 활성화해주기 위해 "nano /etc/modules" 명령어를 입력한 후, 파일 끝 부분에 아래의 내용을 추가해 줍니다.
# Modules required for PCI passthrough
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
# Modules required for Intel GVT-g Split
kvmgt
아까 GRUB 설정 때와 똑같이 저장하신 후, "update-initramfs -u -k all" 명령어를 입력해서 모듈 설정도 적용시켜 줍니다.
재부팅 후 설정이 적용되었는지 확인하기 위해 아래의 명령어를 입력합니다.
dmesg | grep -e DMAR -e IOMMU
나오는 출력에 위 사진과 같이 "DMAR: IOMMU enabled"라는 메시지가 포함되어 있으면 성공입니다.
1-1. "DMAR: IOMMU enabled" 메시지가 안 떠요!
(위 메시지가 제대로 표시된다면 지나가셔도 됩니다.)
Proxmox를 ZFS 파일시스템에 설치하면 기본적으로 GRUB이 아닌 systemd-boot 방식을 이용하도록 설정되어 있기 때문에 GRUB 설정을 변경해도 적용이 되지 않습니다. 따라서 systemd-boot 설정 파일을 수정해주면 됩니다.
"nano /etc/kernel/cmdline" 명령어를 입력한 후, 맨 뒤쪽에 아래 커맨드를 입력하시면 됩니다.
quiet intel_iommu=on i915.enable_gvt=1 iommu=pt pcie_acs_override=downstream,multifunction video=efifb:off video=vesa:off vfio_iommu_type1.allow_unsafe_interrupts=1 kvm.ignore_msrs=1 modprobe.blacklist=radeon,nouveau,nvidia,nvidiafb,nvidia-gpu
설정을 적용하기 위해 "proxmox-boot-tool refresh" 명령어를 입력해 주면 완료입니다. 재부팅 후 아까의 명령어를 다시 입력해서 메시지가 제대로 표시되는 지 확인하세요.
2. PCI 장치 추가: 일반적인 방법
헤놀로지에 내장 그래픽카드를 추가하거나 VM 내에서 인텔 퀵싱크를 이용하시려면 이 방법이 아닌 다른 방법을 써야 합니다. '3. PCI 장치 추가: 수동으로 추가하기' 과정을 따라 주세요.
Proxmox VE의 설정 페이지로 접속해서, GPU를 추가할 VM의 하드웨어 설정 페이지로 이동합니다.
설정에서 '추가 > PCI 장치'를 선택합니다.
디바이스는 내장 그래픽카드(주소가 0000:00:02.0에 UHD Graphics 어쩌고 적혀있는 게 내장그래픽입니다.)를 선택하고, MDev 유형은 '사용 가능'이 1로 되어있는 것들 중 설명을 보시고 자유롭게 고르시면 됩니다.
위에 있는 게 조금 더 고사양인 게 보이죠? 용도에 맞게 선택하시면 됩니다. 저는 iGPU를 둘 다 사용 중이라 사용 가능이 0으로 뜨지만 아마 여러분은 다 1로 표시되어 있을 겁니다.
이후 VM에서 드라이버 설정(인터넷에 많으니 패스)까지 완료하시면 됩니다.
3. PCI 장치 추가: 수동으로 설정하기
헤놀로지에서 내장 그래픽카드를 제대로 패스스루하기 위해서는 조금 특수한 설정이 필요합니다.
원래 내장 그래픽카드의 PCI 주소는 0000:00:02.0입니다.
위의 일반적인 방법으로 GVT-g 패스스루를 진행하면 VM에는 외장 그래픽카드의 PCI 주소인 0000:01:00.0에 그래픽카드가 할당되게 됩니다.
그러나 시놀로지 NAS는 DVA3221 같은 특정 모델을 제외하면 외장 그래픽카드를 지원하지 않기 때문에 위 주소에 그래픽카드가 패스스루되면 인식을 못 합니다.
인텔 내장그래픽에서만 사용 가능한 퀵 싱크 기능도 그렇고요.
따라서 PCI 주소를 0000:00:02.0으로 수정해줘야 하는데, 웹 UI에서는 이 설정이 불가능합니다.
그래서 저희는 직접 스크립트를 작성해서 문제를 해결할 겁니다.
걱정하지 마세요! 제공된 스크립트에 약간의 수정만 거치면 되니까요.
3-1. GVT-g 활성화 스크립트 만들기
먼저 아래의 명령어를 입력하여 사용할 수 있는 GVT-g 장치를 확인합니다.
ls -al /sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types
/var/lib/vz/snippets 경로에 .pl 파일을 생성해 줘야 하는데, 위에서 표시된 장치 개수만큼 만드셔도 되고, 필요한 만큼만 생성하셔도 됩니다. 단 한 개의 GVT-g 장치는 하나의 VM에만 할당할 수 있습니다. 저의 경우 2개가 표시되니 최대 2개까지 생성이 가능한 것이죠.
저는 아래와 같이 두 개의 파일을 만들었습니다.
이제 nano로 위 파일을 열어서 아래의 내용을 복사해 줍니다.
#!/usr/bin/perl
# Exmple hook script for PVE guests (hookscript config option)
# You can set this via pct/qm with
# pct set <vmid> -hookscript <volume-id>
# qm set <vmid> -hookscript <volume-id>
# where <volume-id> has to be an executable file in the snippets folder
# of any storage with directories e.g.:
# qm set 100 -hookscript local:snippets/hookscript.pluse strict;
use warnings;print "GUEST HOOK: " . join(' ', @ARGV). "\n";
# First argument is the vmid
my $vmid = shift;
# Second argument is the phase
my $phase = shift;
if ($phase eq 'pre-start') {
# First phase 'pre-start' will be executed before the guest
# is started. Exiting with a code != 0 will abort the startprint "$vmid is starting, doing preparations.\n";
system("echo 00000000-0000-0000-0000-000000000130 > /sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_8/create");# print "preparations failed, aborting."
# exit(1);} elsif ($phase eq 'post-start') {
# Second phase 'post-start' will be executed after the guest
# successfully started.print "$vmid started successfully.\n";
} elsif ($phase eq 'pre-stop') {
# Third phase 'pre-stop' will be executed before stopping the guest
# via the API. Will not be executed if the guest is stopped from
# within e.g., with a 'poweroff'print "$vmid will be stopped.\n";
} elsif ($phase eq 'post-stop') {
# Last phase 'post-stop' will be executed after the guest stopped.
# This should even be executed in case the guest crashes or stopped
# unexpectedly.print "$vmid stopped. Doing cleanup.\n";
system("echo 1 > /sys/devices/pci0000:00/0000:00:02.0/00000000-0000-0000-0000-000000000130/remove");} else {
die "got unknown phase '$phase'\n";
}exit(0);
위 스크립트에서 총 세 곳을 수정해야 합니다.
첫 번째로 중간의 'system("echo 00000000-0000-0000-0000-000000000130' 부분에서 UUID 부분인 00000000-0000-0000-0000-000000000130 부분을 원하시는 대로 수정해 줍니다. 단, 각 장치 별로 겹치지 않게 골라 주세요. 저는 VM ID 113번과 115번에 할당할 거라 뒷 자리를 각각 000000000130, 000000000150으로 설정해 주었습니다.
두 번째로 위에서 수정한 부분 다음에 'i915-GVTg_V5_8'을 아까 확인해 둔 GVT-g 장치 중 하나로 바꿔 줍니다. 이것도 물론 사용 중인 장치와 겹치면 안 됩니다.
세 번째로 아래 쪽에 'system("echo 1 > /sys/devices/pci0000:00/0000:00:02.0/00000000-0000-0000-0000-000000000130/remove");' 명령어의 00000000-0000-0000-0000-000000000130 부분을 위에서 설정한 것과 똑같이 바꿔 주시면 완료입니다.
위 세 가지를 변경한 후 저장합니다.
3-2. VM 설정 수정하기
설명에 앞서 혹시 모르시는 분이 계실까 봐 말씀드리면 VM ID는 사진에 있는 숫자들입니다.
아래 설명은 VM ID 113번 헤놀로지에 설정하는 것을 기준으로 했습니다.
터미널에서 "qm set [VM ID] -hookscript local:snippets/[아까 만든 스크립트 이름].pl" 명령어를 입력해 줍니다.
그리고 'qm set [VM ID] -args "-device vfio-pci,addr=0x02,sysfsdev=/sys/devices/pci0000:00/0000:00:02.0/[위에서 설정한 UUID]"' 명령어로 패스스루 설정을 합니다.
3-3. 확인하기
VM을 부팅한 후 lspci를 입력하여 00:02.0 주소에 내장그래픽이 제대로 할당되었는지 확인합니다.
위 사진처럼 00:02.0에 우리가 패스스루해 준 내장 그래픽카드가 표시되면 성공입니다.
모든 설정이 끝났습니다. 나름대로 쉽게 쓴다고 썼는데 괜찮을 지 모르겠네요. 잘 안 되거나 설명이 부족한 부분 또는 질문이 있으실 경우 댓글을 달아주시면 제가 아는 선에서 최대한 답장드리겠습니다. 감사합니다.
Proxmox에서 헤놀로지 운영하기 가이드글을 만들어서 포함시켜야겠습니다!!
하나 궁금한게 헤놀로지vm과 plex lxc에서 각각 쓰려면.. GVT-g 기능으로 2개에 할당해주면 될까요? GVT-G에 대해 해외 글들 보면 성능이 많이 제한된다고도 하고, 인텔 11세대 부턴 지원 안한다고도 하고.. 그럼.. plex hw transcoding 성능이 너무 떨어져서 의미가 있을까 싶기도 해서 고민이네요 ㅠ
10세대 사용중이라 테스트는 못해봤습니다. bios에서도 sr-iov 기능 활성화가 필요합니다
내장 그래픽 써보려고 구글에 찾아가며 안되는 영어로 끙끙대던 지난날이 스쳐 지나가네요...ㅋ..
hookscript: invalid format - unable to parse volume ID '/var/lib/vz/snippets/00_gvt_g_0x02.pl'
라고 뜹니다. 어디서 잘못한걸까요?
cmt alert