plex

Nvidia drive

plex 參考來源

https://jocke.no/2022/02/23/plex-gpu-transcoding-in-docker-on-lxc-on-proxmox/

Pve host

特權 Lxc功能:fuse=1,nesting=1
主機和 LXC 容器都需要運行相同的驅動程式版本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#驅動黑名單:開機不載入
echo -e "blacklist nouveau\noptions nouveau modeset=0" > /etc/modprobe.d/blacklist-nouveau.conf
nano /etc/kernel/cmdline
add
root=ZFS=rpool/ROOT/pve-1 boot=zfs intel_iommu=on
#更新開機模組
update-initramfs -u
proxmox-boot-tool refresh
#安裝無頭驅動
apt install pve-headers-$(uname -r)
#nvidia drive
wget -O NVIDIA-Linux-x86_64-510.47.03.run  https://us.download.nvidia.com/XFree86/Linux-x86_64/510.47.03/NVIDIA-Linux-x86_64-510.47.03.run
chmod +x NVIDIA-Linux-x86_64-510.47.03.run

answer “no” when it asks if you want to install 32bit compability drivers
回答“否”當它詢問您是否要安裝 32 位元相容驅動程式時
answer “no” when it asks if it should update X config
回答“否”當它詢問是否應該更新 X-windows 配置時

1
./NVIDIA-Linux-x86_64-510.47.03.run

新增一些 udev 規則。這是為了確保載入正確的核心模組,並在啟動時建立所有相關的設備檔案

1
echo -e '\n# load nvidia modules\nnvidia-drm\nnvidia-uvm' >> /etc/modules-load.d/modules.conf

將以下內容添加到 /etc/udev/rules.d/70-nvidia.rules
啟動時會在/dev/中建立相關的裝置文件

1
nano /etc/udev/rules.d/70-nvidia.rules

添加以下

1
2
3
KERNEL=="nvidia", RUN+="/bin/bash -c '/usr/bin/nvidia-smi -L && /bin/chmod 666 /dev/nvidia*'"
KERNEL=="nvidia_uvm", RUN+="/bin/bash -c '/usr/bin/nvidia-modprobe -c0 -u && /bin/chmod 0666 /dev/nvidia-uvm*'"
SUBSYSTEM=="module", ACTION=="add", DEVPATH=="/module/nvidia", RUN+="/usr/bin/nvidia-modprobe -m"

避免在不使用 GPU 時卸載驅動程式/核心模組,應該執行 Nvidia 提供的持久性服務,驅動程式安裝後就可以使用它
https://docs.nvidia.com/deploy/driver-persistence/index.html

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 複製並解壓縮
cp /usr/share/doc/NVIDIA_GLX-1.0/samples/nvidia-persistenced-init.tar.bz2 .
bunzip2 nvidia-persistenced-init.tar.bz2
tar -xf nvidia-persistenced-init.tar

# 刪除舊的(如果有的話,以避免屏蔽服務)
rm /etc/systemd/system/nvidia-persistenced.service

# 安裝
chmod +x nvidia-persistenced-init/install.sh
./nvidia-persistenced-init/install.sh

# 檢查是否正常
systemctl status nvidia-persistenced.service
rm -rf nvidia-persistenced-init*

如果沒有任何錯誤,就可以重新啟動 Proxmox 主機。重新啟動後,應該會看到以下輸出
示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.157                Driver Version: 390.157                   |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 650     Off  | 00000000:05:00.0 N/A |                  N/A |
| 27%   42C    P8    N/A /  N/A |    183MiB /   978MiB |     N/A      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0                    Not Supported                                       |
+-----------------------------------------------------------------------------+

添加 Lxc conf 內容

注意Pvehost group ID,每台主機不一,需修正
Pve host:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ls -alh /dev/nvidia*
crw-rw-rw- 1 root root 195,   0 12月 15 07:01 /dev/nvidia0
crw-rw-rw- 1 root root 195, 255 12月 15 07:01 /dev/nvidiactl
crw-rw-rw- 1 root root 195, 254 12月 15 07:02 /dev/nvidia-modeset
crw-rw-rw- 1 root root 510,   0 12月 15 07:01 /dev/nvidia-uvm
crw-rw-rw- 1 root root 510,   1 12月 15 07:01 /dev/nvidia-uvm-tools

/dev/nvidia-caps:
總用量 0
drw-rw-rw-  2 root root     80 12月 15 07:01 .
drwxr-xr-x 23 root root   5.6K 12月 15 11:20 ..
cr--------  1 root root 236, 1 12月 15 07:01 nvidia-cap1
cr--r--r--  1 root root 236, 2 12月 15 07:01 nvidia-cap2

lxc conf add 

lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 510:* rwm
lxc.cgroup2.devices.allow: c 236:* rwm
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-uvm dev/nvidia-uvm 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-tools dev/nvidia-uvm-tools none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-caps/nvidia-cap1 none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-caps/nvidia-cap2 none bind,optional,create=file

Lxc 容器內操作

Lxc開機,進入Lxc執行以下

1
2
3
4
5
6
7
wget -ONVIDIA-Linux-x86_64-510.47.03.run  https://us.download.nvidia.com/XFree86/Linux-x86_64/510.47.03/NVIDIA-Linux-x86_64-510.47.03.run
chmod +x NVIDIA-Linux-x86_64-510.47.03.run
./NVIDIA-Linux-x86_64-510.47.03.run --check
# answer "no" when it asks if it should update X config
./NVIDIA-Linux-x86_64-510.47.03.run --no-kernel-module
#安裝完驅動,驗證Lxc nvidia-smi輸出,如錯誤!檢查驅動版本與host一致否與 lxc.conf
nvidia-smi

安裝 docker 相關

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#刪除使用apt安裝之docker 
apt remove docker-compose docker docker.io containerd runc
# 從官方儲存庫安裝 docker
apt update
apt install ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

apt update
apt install docker-ce docker-ce-cli containerd.io

安裝 docker-compose

1
2
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

docker-compose bash 補全

1
2
3
curl \
    -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose \
    -o /etc/bash_completion.d/docker-compose

安裝 nvidia-docker2
新版本的工具包需要不同的儲存庫

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apt install -y curl
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
keyring_file="/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg"
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | gpg --dearmor -o ${keyring_file}
curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
  sed "s#deb https://#deb [signed-by=${keyring_file}] https://#g" | \
  tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

apt update
apt install nvidia-docker2

重新啟動systemd + docker(不重新載入systemd,docker 可能無法運作)

1
2
systemctl daemon-reload
systemctl restart docker

Plex docker compose

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: '3.7'

services:
  plex:
    container_name: plex
    hostname: plex
    image: linuxserver/plex:latest
    restart: unless-stopped
    deploy:
      resources:
        reservations:
          devices:
            - capabilities: [gpu]
    environment:
      TZ: Europe/Paris
      PUID: 0
      PGID: 0
      VERSION: latest
      NVIDIA_VISIBLE_DEVICES: all
      NVIDIA_DRIVER_CAPABILITIES: compute,video,utility
    network_mode: host
    volumes:
      - /srv/config/plex:/config
      - /storage/media:/data/media
      - /storage/temp/plex/transcode:/transcode
      - /storage/temp/plex/tmp:/tmp

內核有更新時需
卸載nvidia-drive重新安裝pve-headers,重開後重安裝nvidia驅動與pve-headers

1
2
./NVIDIA-Linux-x86_64-510.47.03.run --uninstall
apt install pve-headers-$(uname -r)

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy