blog

PVEのLXCコンテナでのパススルーコアグラフィックス

ProxmoxVEのLXCコンテナでコアグラフィックカードをパススルーする ProxmoxVEプラットフォームでLXCコンテナを使用してDockerでフリゲートをデプロイする場合、GPUを使用してff...

Dec 7, 2023 · 4 min. read
シェア

ProxmoxVE の LXC コンテナでパススルーコアグラフィックスカードを使用する。

DockerでLXCコンテナを使用してProxmoxVEプラットフォームでフリゲートを展開する場合、GPUを使用してffmpegを高速化する必要があるため、DockerコンテナのLXCコンテナでホストN5105のコアグラフィックスをマウントする必要があります。

コア・ディスプレイ・ドライバーのインストール

  • デバイスの表示

PCIデバイスにコアグラフィックスカードが含まれていることが確認できれば、デバイスは正しく認識されています

lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation JasperLake [UHD Graphics] 
  • ドライバの表示

Card0 と by-path card0 renderD128 の両方が存在し、ドライバが正常に動作していることがわかります

ls /dev/dri/
by-path card0	renderD128

LXCコンテナを作成する

図のように、PVE のコントロール インターフェイスで、CT コンテナーの作成を選択します。

作成が完了すると、コンテナのID、つまりVMIDが表示されます。

コア・グラフィックス・パススルーを変更する

コアグラフィックパススルーを変更するには、PVEホストのコマンドラインを使用してLXCコンテナを変更する必要があります。 コアグラフィックスパススルーを変更するには、PVEホスト上でコマンドラインを使用して、LXCコンテナの設定ファイルを変更する必要があります

  • コア・グラフィックス・パススルーの追加

nanoを使用して、コンテナに対応する設定ファイルを編集します。 コンテナID 104に対応するファイルは.confで、パスは/etc/pve/lxc/

nano /etc/pve/lxc/104.conf

デフォルトの設定は次のとおりです:

arch: amd64
cores: 2
hostname: frigate
memory: 2048
net0: name=eth0,bridge=vmbr0,firewall=1,hwaddr=A6:43:11:F3:EE:78,ip=dhcp,type=veth
ostype: ubuntu
rootfs: local-lvm:vm-104-disk-0,size=8G
swap: 512

以下を追加する必要があります

lxc.apparmor.profile: unconfined
lxc.cgroup.devices.allow: a
lxc.cap.drop:
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=file
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file

これらの構成パラメーターは、Linuxコンテナのセキュリティとリソース制御設定の一部で、コンテナ内の動作とアクセスを制限します。 コンテナ内での動作とアクセスを制限します。

lxc.apparmor.profile: unconfined: この構成では、AppArmorのプロファイル名を指定します。 コンテナ内のプロセスがより高いシステム特権を持つことを許可するために使用されます

lxc.cgroup.devices.allow: a: コンテナ内のプロセスがすべてのcgroupデバイスにアクセスすることを許可します。

lxc.cap.drop:この構成項目は空で、コンテナ内のプロセスはホストシステムのデフォルトの機能設定を継承します。

lxc.cgroup2.devices.allow: c 226:0 rwm および lxc.cgroup2.devices.allow: c 226:128 rwm: コンテナ内のプロセスがデバイス番号 :0 および :821 のデバイスノードに読み取り、書き込み、およびマッピングアクセスできるようにします。 デバイス・ノードの読み取り、書き込み、およびマップ権限を許可します。 コンテナ内のプロセスがグラフィックアクセラレーションデバイスなどの特定のデバイスにアクセスできるようにするために使用します。

lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=fileおよび lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file: ホストシステム上の 2 つのデバイスノードをアクセラレーションします。 dri/renderD821をコンテナ内の同じ場所にバインドします。これは、コンテナ内のアプリケーションがグラフィックス関連のタスクを実行するために、グラフィックスハードウェアアクセラレーションにアクセスできるようにするために使用されます

変更したら保存し、LXCコンテナを起動します

コアグラフィックスカードをチェックする

コンテナが正常に起動するのを待ってから、コンテナ内に入り、コマンドラインを使用して/dev/driのパス下にマウントされているファイルをチェックします。 driパス、card0、renderD821は正常です

ls /dev/dri/
card0 renderD128

PCI をチェックすると、コアグラフィックスカードも見えます。

lspci | grep VGA
        00:02.0 VGA compatible controller: Intel Corporation JasperLake [UHD Graphics] 
        

Docker コンテナにグラフィックスカードをマウントする

docker-composeを使用してfrigateをデプロイし、設定ファイル内のコンテナにデバイス/dev/dri/renderD821をマウントします

services:
 frigate:
 container_name: frigate
 privileged: true
 restart: unless-stopped
 image: ghcr.io/blakeblackshear/frigate:stable
 shm_size: "256mb"
 devices:
 - /dev/dri/renderD128

これにより、コンテナは通常通りffmpegハードウェアアクセラレーション用のカーネルを使用できるようになります

TUNデバイスをマウントする

WireGuard/ TailScale/ TUNに依存するデバイスを使用する必要がある場合。 LXCコンテナでTUNネットワークに依存するClashやその他のデバイスを使用する場合は、以下を追加する必要もあります:

lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file

LXC コンテナはデフォルトで TUN デバイスをマウントしないため、ソケットが見つからないというエラーが発生し、アクセスできません

failed to connect to local tailscaled . Got error: Failed to connect to local Tailscale daemon for /localapi/v0/status; systemd tailscaled.service not running. Error: dial unix /var/run/tailscale/tailscaled.sock: connect: no such file or directory
Read next