981 文字
5 分
Proxmoxの非特権LXC上にJellyfinでメディアサーバーを構築する (QSV HW Transcoding)

経緯#

AmazonのブラックフライデーセールでFire TV Stick 4K Plusを買いました。
そこで、NAS上の動画ファイルをFire TV Stick経由で再生できるようにメディアサーバーを構築することにしました。
今回は無料でハードウェアトランスコードにも対応しているJellyfinを採用しました。

既存のNASセットアップ#

現在、N100ミニPC上にProxmoxを入れ、Proxmox上のVMでTrueNAS Scaleを走らせてNASとして運用しています。
NAS用のHDDはVMにPCIe passthroughでSATAコントローラーごと渡しています。

Jellyfinサーバー環境は以下のように構築することにしました。

  1. Proxmox上にJellyfinのLXCを構築 (iGPU passthroughでJellyfinでHWトランスコードを利用可能とする)
  2. ProxmoxホストにNASの共有フォルダをマウント
  3. ProxmoxホストからJellyfin LXCに共有フォルダをbind mount

Jellyfinサーバー環境の構築#

Jellyfin LXCの作成#

Jellyfin LXCの作成にはProxmox VE Helper-Scriptsを利用させてもらいます。
Proxmoxホストのshellでインストールスクリプトを実行し、ウィザードに従ってLXCを構築します。
途中でVAAPIデバイスを自動でマウントするかどうか聞かれるので、yesにしておきます。

on Proxmox host
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/jellyfin.sh)"

LXCへのNASフォルダマウントの準備#

LXCができたら、LXCのshellでNASフォルダをマウントする準備をします。
参考:https://forum.proxmox.com/threads/tutorial-unprivileged-lxcs-mount-cifs-shares.101795/
ユーザーグループlxc_shares(gid:10000)を作成し、jellyfinユーザーをlxc_sharesグループに追加します。

on LXC
groupadd -g 10000 lxc_shares
usermod -aG lxc_shares jellyfin

LXCをシャットダウンします。

ProxmoxホストへのNASフォルダのマウント#

ProxmoxホストにNASフォルダマウント用ディレクトリを追加します。

on Proxmox host
mkdir -p /mnt/lxc_shares/nas_rwx

/etc/fstabにNASフォルダマウントの設定を追加します。
smb_usernamesmb_passwordはNASのSMB接続用IDとパスワードです。

on Proxmox host
{ echo '' ; echo '# Mount CIFS share on demand with rwx permissions for use in LXCs (manually added)' ; echo '//NAS/nas/ /mnt/lxc_shares/nas_rwx cifs _netdev,x-systemd.automount,noatime,uid=100000,gid=110000,dir_mode=0770,file_mode=0770,user=smb_username,pass=smb_password 0 0' ; } | tee -a /etc/fstab

NASフォルダをProxmoxホスト上にマウントします。

on Proxmox host
mount /mnt/lxc_shares/nas_rwx

Jellyfin LXCへNASフォルダをbind mount#

LXCの設定ファイルを編集し、Proxmoxホスト上の/mnt/lxc_shares/nas_rwxをLXC上の/mnt/nasにbind mountします。
なおLXC_IDはJellyfinのLXCコンテナ番号(e.g., 101)。
ro=1は読み取り専用オプションなので不要な場合は取る。

on Proxmox host
{ echo 'mp0: /mnt/lxc_shares/nas_rwx/,mp=/mnt/nas,mountoptions=noatime,ro=1' ; } | tee -a /etc/pve/lxc/LXC_ID.conf

LXCを起動し、/mnt/nasのアクセス権がlxc_sharesグループに設定されていることを確認します。

on LXC
root@jellyfin:~# ls -l /mnt/
total 0
drwxrwx--- 2 root lxc_shares 0 11月 29 14:44 nas

あとはJellyfinの管理画面を開いて各種設定をすればOKです。
プレイバック→トランスコーディングからハードウェアアクセラレーションの設定をします。
当方の環境ではQSVを使うので、ハードウェアアクセラレーション:Intel Quicksync (QSV)QSVデバイス:/dev/dri/renderD128

HWトランスコードしようとすると再生できない場合#

基本的には上記の手順により非特権LXCコンテナ上でHWトランスコードが利用できるようになるはずなのですが、うまくいかない場合はGPUデバイスのパーミッション設定の誤りの可能性があります。
Jellyfinのプロセスはjellyfinユーザーとして実行されるため、jellyfinユーザーのグループに対してパーミッションが設定されていない場合、JellyfinがGPUにアクセスできません。
私が構築した際も/dev/dri/renderD128のパーミッションが間違っていました(PVE Helper-Scriptsのバグ?)。

LXC上で/dev/dri/のパーミッションを確認します。

on LXC
root@jellyfin:~# ls -l /dev/dri/
total 0
crw-rw---- 1 root video 226, 1 12月 1 21:10 card1
crw-rw---- 1 root render 226, 128 12月 1 21:10 renderD128

card1のグループがvideorenderD128のグループがrenderになっていない場合は、Proxmoxのコンテナ設定が間違っています。
その場合、まずLXCコンテナ上でのvideorenderのgidを確認します。

on LXC
root@jellyfin:~# cat /etc/group | grep -e video -e render
video:x:44:jellyfin
render:x:993:jellyfin

この場合、videoのgidが44、renderのgidが993です。
LXCをシャットダウンします。

Proxmoxホストで/etc/pve/lxc/LXC_ID.confを開き、dev0dev1のgidが上記の通りになっているか確認、間違っていれば修正します。

/etc/pve/lxc/LXC_ID.conf
dev0: /dev/dri/card1,gid=44
dev1: /dev/dri/renderD128,gid=993

私の場合はこれで問題なくHWトランスコードできるようになりました。

おわりに#

特殊な環境なのでこの情報を必要とする人が存在するか怪しいですが、もしもこの情報が誰かのお役に立ちましたら幸いです。

Proxmoxの非特権LXC上にJellyfinでメディアサーバーを構築する (QSV HW Transcoding)
https://stargazr.net/posts/2025/1201-proxmox-lxc-jellyfin-qsv-hwtranscoding/
作者
FarbiE
公開日
2025-12-01
ライセンス
CC BY-NC-SA 4.0
Comments

No comments yet.