Proxmox DebianVM에서 n100 vgpu 사용하게 만들기
반갑습니다.
오늘은 제가 Proxmox의 debianVM에서 vGPU를 사용할 수 있도록 삽질했던 과정을 적어보고자합니다.
저는 처음에 Docker를 LXC로 사용을 했었는데요, LXC는 가볍다는 장점이 존재하기는 하지만, 권한없는 컨테이너로 생성돼서 일부 작업들이 권한에 막혀 진행이 되지 않는 경우가 많습니다.
권한있는 컨테이너로 바꾸면 해결이 되긴 하지만... 해외의 질문글을 보면 모두 보안에 문제가 있다면서 절대로 하지 말라고 하더군요.
그래서 이참에 debianVM을 새로 올리고 Docker도 그쪽으로 옮겼습니다.
덕분에 nfs 마운트도 잘 되고 tailscale도 문제없이 동작을 하네요.
여기에 더해서 n100의 igpu를 DebianVM에서 사용할 수 있도록 만들어보고자 합니다.
관련 자료들을 검색하다보니 이런 글을 발견했습니다.
GPU를 VM에 넘겨주면 그 VM만 GPU를 독점적으로 사용하게 된다는 문제점이 있는데, 인텔의 vGPU 기술을 사용하면 여러 VM, LXC에서 GPU 하나를 나눠서 사용할 수 있다는 것입니다.
이 github의 설명을 따라 PVE 호스트에서의 설치를 마치면 총 7개의 gpu를 확인할 수 있었습니다.
다음은 debianVM에서 해당 gpu를 사용하도록 해주면 되는데... 여기서 오랜 시간을 묶여있었습니다.
debian은 일부 컴파일 되지 않는 커널이 존재해서 설정을 변경하고 새로 컴파일을 해주어야한다고 하더군요.
1. VM 백업하기
우선 VM을 백업해야합니다.
여러번 실패하고, 한 번은 뭘 잘못건드려서 부팅이 안되는 상황이 발생했습니다... 다행히 작업 전에 백업해둔게 있어서 백업 시점으로 돌아와 몇 번이고 다시 시도하는게 가능했습니다.
꼭 백업을 해주세요.
2. 커널을 가져와 빌드하고 설치하기
그 다음은 커널을 빌드해야합니다.
VM에서 우선 필요한 패키지들을 설치합니다.
apt install dkms dwarves git linux-source-6.1 pahole vaifo
그 다음 /usr/src 디렉터리로 이동해 linux-source-6.1.tar.xz의 압축을 풉니다.
cd /usr/src
tar xJvf linux-source-6.1.tar.xz
현재 커널의 빌드 정보를 .config라는 이름으로 가져옵니다.
현재 커널 정보는 uname -r 로 알 수 있습니다.
cp /boot/config-6.1.0-18-amd64 /usr/src/linux-source-6.1/.config
가져온 파일을 수정합니다.
파일이 길어서 검색이 필요하니 vim을 사용하겠습니다.
vim /usr/src/linux-source-6.1/.config
:? CONFIG_INTEL_MEI_PXP
:? CONFIG_DRM_I915_PXP
로 검색해서 아래와같이 바꿔주시면 됩니다.
저는 CONFIG_DRM_I915_PXP가 없어서 적당한 곳에 추가해주었습니다.
수정이 완료되었다면 :wq로 저장하고 나옵니다.
이제 커널을 빌드할 시간입니다.
cd /usr/src/linux-source-6.1
make deb-pkg LOCALVERSION=-sriov KDEB_PKGVERSION=$(make kernelversion)-1
커널 빌드는 한참이 걸립니다.
켜두고 잠시 다른일 하다 오시면 좋습니다.
VM 디스크 용량이 30GB였는데 꽉차서 중간에 멈춰버렸습니다....
빌드 전에 용량 많이 할당하고 하시는걸 추천드립니다. 안그러면 4시간 할거 8시간 걸려요...
오후 1시에 시작해서 오전 00시에 빌드가 끝났습니다. -j 옵션을 이용해서 병렬 처리 하시는걸 추천드립니다...
빌드가 끝났으니 설치할 시간입니다. 설치후에 재부팅을 해줍니다.
dpkg -i /usr/src/*.deb
reboot
재부팅이 끝나면 uname -r 명령어로 빌드한 커널이 실행 중인지 확인합니다.
3. 드라이버 빌드 후 설치하기
이제 드라이버를 빌드해서 설치하면 됩니다.
우선 소스코드를 받아옵니다.
cd /usr/src
git clone https://github.com/strongtz/i915-sriov-dkms i915-sriov-dkms-6.1
그런 다음 소스코드에서 dkms.conf 파일을 수정합니다.
PACKAGE_NAME과 PACKAGE_VERSION 을 수정합니다.
vim i915-sriov-dkms-6.1/dkms.conf
PACKAGE_NAME="i915-sriov-dkms" # 여기와
PACKAGE_VERSION="6.1" # 여기를 수정해주면 됩니다.
MAKE[0]="make -j$(nproc) -C ${kernel_source_dir} M=${dkms_tree}/${PACKAGE_NAME}//
${PACKAGE_VERSION}/build KVER=${kernelver}"
CLEAN="make -j$(nproc) -C ${kernel_source_dir} M=${dkms_tree}/${PACKAGE_NAME}/${{
PACKAGE_VERSION}/build KVER=${kernelver} clean"
BUILT_MODULE_NAME[0]="i915"
DEST_MODULE_LOCATION[0]=/kernel/drivers/gpu/drm/i915
AUTOINSTALL=yes
이제 드라이버를 설치합니다.
dkms install --force -m i915-sriov-dkms -v 6.1
드라이버 설치가 완료되면 grub을 수정해주고 재부팅합니다.
vim /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT 뒤에 quiet i915.enable_guc=3 을 붙여주시면 됩니다.
수정을 완료하면 grub을 업데이트하고 VM을 종료합니다.
update-grub
update-initramfs -u
하드웨어 탭에서 PCI 장치를 추가합니다.
이제 VM을 다시 시작합니다.
그리고 GPU가 잘 붙었는지 확인합니다.
lspci | grep -i vga
lspci -vs 00:10.0
Kernel driver in use 가 존재하면 성공입니다.
dmesg | grep i915
ls /dev/dri/render*
잘 동작하고 있네요
4. Docker에서 gpu 사용가능하게 하기
하드웨어 가속이 동작하는지 확인하기 위해 젤리핀을 설치했습니다.
version: "3.5"
services:
jellyfin:
image: jellyfin/jellyfin
container_name: jellyfin
#user: uid:gid
network_mode: host
volumes:
- ./config:/config
- ./cache:/cache
- ./media:/media
#- ./media2:/media2:ro
restart: unless-stopped
ports:
- 8096:8096
# Optional - alternative address used for autodiscovery
environment:
- JELLYFIN_PublishedServerUrl=192.168.0.64
# Optional - may be necessary for docker healthcheck to pass if running in host network mode
devices:
- /dev/dri:/dev/dri
extra_hosts:
- host.docker.internal:host-gateway
networks: {}
devices:
- /dev/dri:/dev/dri
를 추가해주면 컨테이너에서 장치에 접근할 수 있게 된다고 합니다.
로그를 살펴보니 vaapi로 잘 되고 있는 것 같습니다.
qhd -> 1080p 로 테스트를 해봤는데 속도도 빠르고 CPU도 얼마 안먹네요.
잘 된 것 같습니다!
젤리핀 설치한 김에 한 번 제대로 구축을 해봐야겠습니다.
5. 마무리
다른 배포판 VM의 경우는 그냥 드라이버만 설치해주면 되는데, Debian은 커널 컴파일이 필요해서 상당히 오랜시간이 걸렸네요. 중간에 용량부족으로 한 번 끊긴게 너무 컸네요.
부족한 글 읽어주셔서 감사합니다.
저는 그나마 커널 빌드를 i7 8세대 머신에서 해서 deb 패키지로 n100 에 올렸었습니다. 지금은 그냥 lxc에 올려서 쓰고있고 VM에 올리는 것은 MInt Edge 버전으로 테스트만 했습니다.
sriov 기능이 6.2 커널 버전부터는 기본 포함 되어있다고 하니까 debian bookworm 의 커널만 올리면 커널 컴파일 ㅗ과정이 필요없을 것 같기는 한데, 직접해보지는 않았네요.
아하, 그렇군요!
만약 나중에 또 하게 되면 시도해보겠습니다.
GRUB_CMDLINE_LINUX_DEFAULT뒤 추가하는 파라메터가 i195.enable_guc=3.. 이 아니라.. i915.enable_guc=3 인거 같은데.. ^^; 저도 이방법으로 해보았는데.. 10세대 igpu의 경우 i915.enable_guc 값을 2로 해야더군요. (n100은 12세대라 3)근데 그렇게해도 pms 하드웨어 디코딩시 알수 없는 memory leak이 생겨서.. lxc passthrough는 포기했습니다 ㅜㅜ 혹시나 jellyfin 하드웨어 디코딩시 메모리 사용량이 계속 올라가시는지 확인한번 해주시면 감사하겠습니다..
https://wiki.archlinux.org/title/intel_graphics
i915.enable_guc 옵션 설명이 나와있습니다. cpu별로 설정이 좀 다릅니다
메모리는 유튜브 영상을 하나 받아 해상도를 계속 변경해가면서 확인해보았습니다.
VM에 할당된 메모리는 8GB 입니다.
VM 부팅 시 : 메모리 약 2GB
젤리핀 구동 시 : 메모리 약 5.41GB 유지
유튜브 영상 재생 테스트 시 : 메모리 약 6.45GB 유지
유튜브 영상 재생 종료 시 : 메모리 약 5.41GB 유지
20분정도 테스트해보았을 때 메모리가 지속적으로 증가하는 문제는 보이지 않았습니다.
따로 검색을 해보니 Jellyfin에서 알려진 메모리 관련 문제는 없다고 하네요.
Jellyfin으로 다시 시도해보시면 좋을 것 같습니다!
(해보진 않아서 확실하지는 않지만요)
cmt alert