Proxmox LXC에 Nvidia GPU 패스쓰루
안녕하세요
서버를 다시설치하는 와중에 기존에 문제가 있었던 플랙스 하드웨어 트랜스코딩을 해결하고자 LXC컨테이너로 옮기게 되었습니다. 덕분에 기존의 패스쓰루 방식이 아닌 LXC 컨테이너로 GPU를 넘기는 방법을 찾다 발경한 유튜브를 글로 옮겨볼까합니다.
(25) Passing a GPU through to a Proxmox container - YouTube
목차
1. Proxmox 커널 업데이트
2. Proxmox GPU 드라이버 블랙리스트
3. Nvidia 드라이버 설치 및 세팅 (udev 룰 변경을 통해 드라이버가 666의 권한으로 실행되게 만드는 것)
4. LXC 설정파일 변경으로 하드웨어 및 c그룹 액세스
5. LXC 컨테이너 내부에 Nvidia 드라이버 설치
1. Proxmox 커널 업데이트
먼저 해당하는 노드에 updates 메뉴에 Refresh와 upgrade를 통해서 Proxmox node를 업데이트합니다.
이후 아래 명령어를 통해 Proxmox 커널 버젼을 찾습니다
uname -r
이후 업데이트 할 proxmox의 버젼을 아래 명령어로 불러옵니다
apt-cache search pve-header
여기서 해당하는 커널의 이름을 해당 명령어에 교체해 업데이트 해줍니다
apt install pve-headers-*.*.*-*-pve
이렇게 커널 업데이트를 완료합니다
2. Proxmox GPU 드라이버 블랙리스트
Proxmox 쉘에 GPU 사용을 제한하는 설정을 합니다.
아래 명령어로 blacklist 파일에 쓰기합니다.
nano /etc/modprobe.d/blacklist.conf
아래 명령어를 추가해줍니다
blacklist nouveau
저장 후 initramfs를 아래 명령어로 업데이트 합니다.
update-initramfs -u
재부팅합니다.
3. Nvidia 드라이버 설치 및 세팅 (udev 룰 변경을 통해 드라이버가 666의 권한으로 실행되게 만드는 것)
먼저 드라이버에서 필요한 어플리케이션을 설치하기 위해서 아래 명령어로 기본 패키지를 설치합니다
apt install build-essential
당연히 y로 해당 패키지 설치를 허가해줍니다.
이제 다른 브라우저에서 Nvidia 웹사이트에서 드라이버를 받기위해서 아래 웹사이트에서 설치하려는 gpu 모델의 드라이버를 찾아줍니다
Proxmox는 리눅스 운영체제임으로 linux64용으로 드라이버를 찾아준 뒤 검색으로 드라이버 페이지를 로딩합니다. 여기서 다운로드를 누르시면 실 다운로드 페이지가 로딩됩니다. 이곳에서 다운로드 버튼을 오른쪽 클릭하시고 링크를 복사해줍니다.
다시 proxmox로 돌아와서 wget커맨드로 해당 드라이버를 다운해줍니다.
wget (드라이버 다운경로)
다운로드한 파일을 실행하기 위해 chmod를 통해 권한을 변경해줍니다.
chmod +x (파일 이름)
팁. 파일 이름은 N을 입력 후 tab을 눌러주시면 자동으로 채워집니다
드라이버를 설치하기 위한 커맨드는
./(파일 이름입니다)
팁. 드라이버 이름은 N을 입력 후 tab을 눌러주시면 자동으로 채워집니다
드라이버 설치시 몇가지 추가 질문이 나옵니다 대부분 yes를 눌러주면 되지만 x를 사용하겠냐는 질문에는 no를 추천드립니다. 예시로 아래 스크린샷을 올려드립니다.
아래 화면이 나오면 정상석으로 설치 된것입니다.
nvidia-smi 명령어를 입력하실때 설치된 그래픽카드의 정보가 나오게 되면 잘 설치된겁니다!
해당 드라이버가 proxmox가 시작시 잘 실행되기 위해서는 모듈에 nvidia관련 드라이버들을 추가해줘야합니다.
아래 명령어로 modules.conf를 수정해줍니다.
nano /etc/modules-load.d/modules.conf
아래 라인들을 추가해줍니다
# Nvidia modules
nvidia
nvidia-modeset
nvidia_uvm
다시 한번 initramfs를 업데이트 해줍니다
update-initramfs -u
이제 udev룰을 변경해 드라이버 관련 프로세서들이 666의 권한을 가지고 실행할 수있게 해줄건데요 이 부분은 lxc의 previlaged 컨테이너에서 사용 할 수있게 권한 레벨을 변경해주는 겁니다.
아래 명령어로 udev에 룰을 만들어줍니다.
nano /etc/udev/rules.d/70-nvidia.rules
아래 명령어들을 해당 파일에 추가해줍니다
KERNEL=="nvidia", RUN+="/bin/bash -c '/usr/bin/nvidia-smi -L && /bin/chmod 666 /dev/nvidia*'"
KERNEL=="nvidia_modeset", RUN+="/bin/bash -c '/usr/bin/nvidia-modprobe -c0 -m && /bin/chmod 666 /dev/nvidia-modeset*'"
KERNEL=="nvidia_uvm", RUN+="/bin/bash -c '/usr/bin/nvidia-modprobe -c0 -u && /bin/chmod 666 /dev/nvidia-uvm*'"
재부팅 후에 nvidia-smi로 드라이버의 정상 작동을 확인해주세요!
4. LXC 설정파일 변경으로 하드웨어 및 c그룹 액세스
제 Plex는 Proxmox Helper 스크립으로 설치해서 해당 커맨드로 설치 진행해보겠습니다 (본인이 만든 스크립트 외 모든 스크립트는 주의를 요합니다)
tteck/Proxmox: Proxmox Helper Scripts (github.com)
제가 쓰는 스크립트는 포럼에도 소개되었던 tteck님의 스크립트입니다.
오리지널은 위 웹사이트에 Media에 Plex를 찾아주시면됩니다.
쉘에 해당 명령어로 Plex LXC를 생성해줍니다.
bash -c "$(wget -qLO - https://github.com/tteck/Proxmox/raw/main/ct/plex-v4.sh)"
기본 설정은 cpu 코어2개 8gb 저장장치 2gb램입니다. 저는 램을 temp를 대신하여 트랜스코딩된 것들을 쓰기에 8gb(그리고 swap도)로 늘려줬습니다.
해당 컨테이너 생성 후 종료하시고 proxmox shell에 접속해주세요.
아래 명령어로 gpu의 정보을 캡쳐해줍니다.
ls -l /dev/nv*
해당 명령어로 나온 정보는 캡쳐하시고 열어주세요.
아래 명령어로 컨테이너의 설정파일을 수정합니다.
nano /etc/pve/lxc/(YOURCONTAINERID).conf
주의.해당 파일을 잘못건드리면 lxc가 작동하지 않기때문에 백업을 만드는것을 추천드립니다.
(백업 명령어 cp /etc/pve/lxc/(YOURCONTAINERID).conf /etc/pve/lxc/(YOURCONTAINERID).conf/bak)
위에 방법으로 plex를 설치하셨다면 아래와 같은 명령어들이 있을 겁니다 전부 지워주세요
# Allow cgroup access
lxc.cgroup2.devices.allow = c 195:0 rw
lxc.cgroup2.devices.allow = c 195:255 rw
lxc.cgroup2.devices.allow = c 195:254 rw
lxc.cgroup2.devices.allow = c 509:0 rw
lxc.cgroup2.devices.allow = c 509:1 rw
lxc.cgroup2.devices.allow = c 10:144 rw
# Pass through device files
lxc.mount.entry = /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry = /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry = /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file
lxc.mount.entry = /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
lxc.mount.entry = /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file
lxc.mount.entry = /dev/nvram dev/nvram none bind,optional,create=file
정확히는 cgroup과 mount.entry관련 명령어들을 지우시면 됩니다.
정상적인 상태는 아래와 같습니다.
이 후 위에 내용을 메모장에 복사하신 뒤 수정해주셔야합니다. cgroup의 내용을 자세히보시면 제가 올린 스크린샷의 내용과 같은 부분이 있습니다. 제가 배경색상 지정해둔 곳을 본인의 시스템의 맞게 수정하시면됩니다.
컨테이너를 시작하신뒤 아래 명령어로 업데이트해주세요
apt update && apt upgrade -y
이제 lxc에 드라이버를 설치하셔야하는데 lxc는 커널이 없기때문에 설치시 명령어가 틀리니 주의해주세요
Nvidia 웹사이트에서 드라이버를 받기위해서 아래 웹사이트에서 설치하려는 gpu 모델의 드라이버를 찾아줍니다
lxc는 리눅스 운영체제임으로 linux64용으로 드라이버를 찾아준 뒤 검색으로 드라이버 페이지를 로딩합니다. 여기서 다운로드를 누르시면 실 다운로드 페이지가 로딩됩니다. 이곳에서 다운로드 버튼을 오른쪽 클릭하시고 링크를 복사해줍니다.
다시 lxc로 돌아와서 wget커맨드로 해당 드라이버를 다운해줍니다.
wget (드라이버 다운경로)
다운로드한 파일을 실행하기 위해 chmod를 통해 권한을 변경해줍니다.
chmod +x (파일 이름)
팁. 파일 이름은 N을 입력 후 tab을 눌러주시면 자동으로 채워집니다
드라이버를 설치하기 위한 커맨드는
./(파일 이름입니다) --no-kernel-module
팁. 드라이버 이름은 N을 입력 후 tab을 눌러주시면 자동으로 채워집니다
여기서 kernal 명령어를 반드시 포함해주세요
해당 설치화면시 위와 같은 옵션으로 설치해주시면 되는데 추가적으로 --no-kernel-module 명령어의 확인을 하게 됩니다. yes로 넘겨주세요
재부팅 후 nvidia-smi 명령어를 입력 후 설치된 그래픽카드의 정보가 나오게 되면 잘 설치된겁니다!
이 후 plex에 http://ipaddress:32400/web으로 접속해주시면됩니다. 만드시 /web을 붙이셔야 xml정보가 아니라 config으로 넘어갑니다. 전부 설정해주신 뒤 플랙스 설정 페이지에 트랜스코더 옵션을 찾습니다
해당 페이지에서 가능할 경우 하드웨어가속 사용을 체크해주시면 준비가 완료된겁니다.
저는 재부팅 후 파일하나를 틀어 대쉬보드에서 HW로 하드웨어 트랜스코딩을 확인해 주 었습니다
lxc로 패스쓰루는 그래도 vm보다 작동이 잘되는 것을 확인 후 사용해보았습니다.
이상 Lo-Res DIY님의 비디오 가이드를 한국어로 번역해보았습니다!
와.. 완전 정성이담긴 상세한 가이드 감사드립니다!
이거면 초보자도 쉽게 패스쓰루해서 사용할수있겠네요 ㄷㄷ
잘 정리해주셨네요.
저도 동일한 방법으로 jellyfin 에서 하드웨어 트랜스코딩 적용하고 있습니다.
추가로 nvidia 그래픽 카드 선택하실때 아래 링크에서 지원코덱이랑 Max # of concurrent sessions 숫자 참고하세요
하드웨어 트랜스코딩 동시 접속자 수 라고 생각하면 됩니다.
https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new
저도 참고 많이 했습니다 제가 구성할때는 안타깝게도 가격이 많이 올라와있을 때라 저렴하게 1060 3gb 갔는데 지금 생각하면 p2200을 갔어야할거 같아요 :(
cmt alert