• 돌아가기
  • 아래로
  • 위로
  • 목록
  • 댓글

Proxmox에서 GVT-g(그래픽 가상화) 활성화하고 헤놀로지에 적용하기

앨런임더 1870

7

13

 

위 글을 보고 혹시 저처럼 내장 그래픽카드를 여러 곳에 쪼개서 사용하고 싶으신 분들이 있으실 것 같아 한번 작성해 봅니다.

 

전체적인 내용은 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"

image.png.jpg

수정을 완료하셨다면 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

image.png.jpg

나오는 출력에 위 사진과 같이 "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

image.png.jpg

설정을 적용하기 위해 "proxmox-boot-tool refresh" 명령어를 입력해 주면 완료입니다. 재부팅 후 아까의 명령어를 다시 입력해서 메시지가 제대로 표시되는 지 확인하세요.

 

 

 

2. PCI 장치 추가: 일반적인 방법

헤놀로지에 내장 그래픽카드를 추가하거나 VM 내에서 인텔 퀵싱크를 이용하시려면 이 방법이 아닌 다른 방법을 써야 합니다. '3. PCI 장치 추가: 수동으로 추가하기' 과정을 따라 주세요.

 

Proxmox VE의 설정 페이지로 접속해서, GPU를 추가할 VM의 하드웨어 설정 페이지로 이동합니다.

설정에서 '추가 > PCI 장치'를 선택합니다.

image.png.jpg

 

디바이스는 내장 그래픽카드(주소가 0000:00:02.0에 UHD Graphics 어쩌고 적혀있는 게 내장그래픽입니다.)를 선택하고, MDev 유형은 '사용 가능'이 1로 되어있는 것들 중 설명을 보시고 자유롭게 고르시면 됩니다.

image.png.jpg

위에 있는 게 조금 더 고사양인 게 보이죠? 용도에 맞게 선택하시면 됩니다. 저는 iGPU를 둘 다 사용 중이라 사용 가능이 0으로 뜨지만 아마 여러분은 다 1로 표시되어 있을 겁니다.

 

이후 VM에서 드라이버 설정(인터넷에 많으니 패스)까지 완료하시면 됩니다.

 

 

 

3. PCI 장치 추가: 수동으로 설정하기

헤놀로지에서 내장 그래픽카드를 제대로 패스스루하기 위해서는 조금 특수한 설정이 필요합니다.

원래 내장 그래픽카드의 PCI 주소는 0000:00:02.0입니다.

image.png.jpg

 

위의 일반적인 방법으로 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

image.png.jpg

 

/var/lib/vz/snippets 경로에 .pl 파일을 생성해 줘야 하는데, 위에서 표시된 장치 개수만큼 만드셔도 되고, 필요한 만큼만 생성하셔도 됩니다. 단 한 개의 GVT-g 장치는 하나의 VM에만 할당할 수 있습니다. 저의 경우 2개가 표시되니 최대 2개까지 생성이 가능한 것이죠.  

 

저는 아래와 같이 두 개의 파일을 만들었습니다.

image.png.jpg

 

이제 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.pl

use 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 start

    print "$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는 사진에 있는 숫자들입니다.

image.png.jpg

아래 설명은 VM ID 113번 헤놀로지에 설정하는 것을 기준으로 했습니다.

 

터미널에서 "qm set [VM ID] -hookscript local:snippets/[아까 만든 스크립트 이름].pl" 명령어를 입력해 줍니다.

image.png.jpg

 

그리고 'qm set [VM ID] -args "-device vfio-pci,addr=0x02,sysfsdev=/sys/devices/pci0000:00/0000:00:02.0/[위에서 설정한 UUID]"' 명령어로 패스스루 설정을 합니다.

image.png.jpg

 

 

3-3. 확인하기

VM을 부팅한 후 lspci를 입력하여 00:02.0 주소에 내장그래픽이 제대로 할당되었는지 확인합니다.

image.png.jpg

위 사진처럼 00:02.0에 우리가 패스스루해 준 내장 그래픽카드가 표시되면 성공입니다.

 

 

 

모든 설정이 끝났습니다. 나름대로 쉽게 쓴다고 썼는데 괜찮을 지 모르겠네요. 잘 안 되거나 설명이 부족한 부분 또는 질문이 있으실 경우 댓글을 달아주시면 제가 아는 선에서 최대한 답장드리겠습니다. 감사합니다.

신고공유스크랩
13
profile image 1등
달소 2023.03.31. 21:28
크,,, 완전 상세한 가이드인데요!
Proxmox에서 헤놀로지 운영하기 가이드글을 만들어서 포함시켜야겠습니다!!
profile image
한군77 2023.04.01. 00:04
와, 너무 감사합니다 ㅠ ㅠ 제 질문에 이렇게까지 ㅠ...
하나 궁금한게 헤놀로지vm과 plex lxc에서 각각 쓰려면.. GVT-g 기능으로 2개에 할당해주면 될까요? GVT-G에 대해 해외 글들 보면 성능이 많이 제한된다고도 하고, 인텔 11세대 부턴 지원 안한다고도 하고.. 그럼.. plex hw transcoding 성능이 너무 떨어져서 의미가 있을까 싶기도 해서 고민이네요 ㅠ
앨런임더 글쓴이 2023.04.01. 00:40
한군77
성능 저하가 꽤 있긴 합니다. Plex 쪽 성능을 많이 중시하신다면 그냥 LXC에 내장 글카를 다 패스스루하고 헤놀 쪽은 정품 시놀에도 원래 그래픽 카드가 없는 3622+ 쪽으로 만드시는 게 좋아 보입니다. 어차피 요즘 시놀로지의 HEVC 지원이 엉망이라, 내장 그래픽카드를 내어줄 만큼의 이점은 안 나오거든요.
profile image
한군77 2023.04.01. 05:17
앨런임더
다른건아니고 heic사진하고 hevc 촬영 영상때문인데 정말 그냥 깔끔하게 포기할까 싶기도 하네요..ㅋㅋ plex성능이 더 중요할 것 같기도하고...! 글 다시한번 정말 감사드려요!!ㅎㅎ
nadomola 2023.04.19. 10:06
한군77
11세대 이후는 gvt-g가 아닌 SR-IOV 기능으로 하셔야합니다 https://github.com/strongtz/i915-sriov-dkms
10세대 사용중이라 테스트는 못해봤습니다. bios에서도 sr-iov 기능 활성화가 필요합니다
profile image
댕대루 2023.04.01. 00:20
이런 글이 진작에 있었더라면 참 좋았을 텐데요..ㅠ 이제라도 올려주셔서 감사합니다!
내장 그래픽 써보려고 구글에 찾아가며 안되는 영어로 끙끙대던 지난날이 스쳐 지나가네요...ㅋ..
앨런임더 글쓴이 2023.04.01. 00:41
댕대루
저도 시행착오 참 많이 겪었습니다. 시스템 자체는 2월에 구축했는데, 진작에 글 써둘 걸 그랬네요..
nadomola 2023.04.19. 10:03
맥주소주양주
사이즈 작은친구 2개, 큰애 1개인데 리소스를 쪼개서 사용하기때문에 총 작은거 2개 혹은 큰거 1개 할당이 가능합니다. 최대 할당가능한 vm은 2개라고 보시면 되죠
profile image
니즛 2024.04.03. 22:22
/var/lib/vz/snippets 폴더가 없어서 직접 만든 후 ~.pl 파일을 만들었습니다. 그 후 qm set 100 -hookscript~ 를 실행하니까 400 Parameter verification failed.
hookscript: invalid format - unable to parse volume ID '/var/lib/vz/snippets/00_gvt_g_0x02.pl'
라고 뜹니다. 어디서 잘못한걸까요?

댓글 쓰기 권한이 없습니다. 로그인

취소 댓글 등록

cmt alert

신고

"님의 댓글"

이 댓글을 신고하시겠습니까?

댓글 삭제

"님의 댓글"

삭제하시겠습니까?


목록

공유

facebooktwitterpinterestbandkakao story
번호 분류 제목 글쓴이 날짜 조회 추천
가이드 Ubuntu 24.04 LTS Desktop 원격 접속 설정하기(SSH,RDP) 3 달소 20시간 전18:33 73 +1
가이드 Ubuntu 24.04 LTS Server 설치해보기 달소 21시간 전17:40 148 +2
잡담 Ubuntu 24 가 정식출시되었습니다~~ 8 달소 1일 전10:37 258 +2
3870 정보
image
툭툭이 24.03.28.11:14 873 +17
3869
image
eyeball 23.04.05.21:08 1780 +16
3868 정보
image
antegral 22.05.07.01:18 3179 +16
3867 잡담
image
햇서 23.06.05.05:53 917 +14
3866
image
달소 22.03.17.22:09 19019 +14
3865 정보
image
EXP 24.02.06.03:43 1308 +10
3864
image
달소 22.05.06.15:43 1044 +10
3863
image
달소 22.03.17.22:25 5047 +10
3862 정보
image
달소 24.02.19.00:58 961 +9
3861
image
theb1ue 22.06.14.16:05 4885 +9
3860 가이드
image
opq! 24.04.02.21:25 443 +8
3859 잡담
image
달소 24.01.15.03:22 584 +8
3858
image
달소 23.01.27.14:15 15880 +8
3857
image
달소 22.07.07.16:57 1946 +8
3856
image
달소 22.03.14.17:30 4173 +8
3855
image
달소 22.02.11.13:31 3026 +8
3854 후기
image
cdma2000 24.02.06.13:12 772 +7
3853 가이드
image
달소 23.07.04.20:38 1908 +7
image
앨런임더 23.03.31.21:14 1870 +7
3851 잡담
image
곰삼촌 23.01.25.10:05 1088 +7