経緯
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サーバー環境は以下のように構築することにしました。
- Proxmox上にJellyfinのLXCを構築 (iGPU passthroughでJellyfinでHWトランスコードを利用可能とする)
- ProxmoxホストにNASの共有フォルダをマウント
- ProxmoxホストからJellyfin LXCに共有フォルダをbind mount
Jellyfinサーバー環境の構築
Jellyfin LXCの作成
Jellyfin LXCの作成にはProxmox VE Helper-Scriptsを利用させてもらいます。
Proxmoxホストのshellでインストールスクリプトを実行し、ウィザードに従ってLXCを構築します。
途中でVAAPIデバイスを自動でマウントするかどうか聞かれるので、yesにしておきます。
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グループに追加します。
groupadd -g 10000 lxc_sharesusermod -aG lxc_shares jellyfinLXCをシャットダウンします。
ProxmoxホストへのNASフォルダのマウント
ProxmoxホストにNASフォルダマウント用ディレクトリを追加します。
mkdir -p /mnt/lxc_shares/nas_rwx/etc/fstabにNASフォルダマウントの設定を追加します。smb_usernameとsmb_passwordはNASのSMB接続用IDとパスワードです。
{ 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/fstabNASフォルダをProxmoxホスト上にマウントします。
mount /mnt/lxc_shares/nas_rwxJellyfin 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は読み取り専用オプションなので不要な場合は取る。
{ echo 'mp0: /mnt/lxc_shares/nas_rwx/,mp=/mnt/nas,mountoptions=noatime,ro=1' ; } | tee -a /etc/pve/lxc/LXC_ID.confLXCを起動し、/mnt/nasのアクセス権がlxc_sharesグループに設定されていることを確認します。
root@jellyfin:~# ls -l /mnt/total 0drwxrwx--- 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/のパーミッションを確認します。
root@jellyfin:~# ls -l /dev/dri/total 0crw-rw---- 1 root video 226, 1 12月 1 21:10 card1crw-rw---- 1 root render 226, 128 12月 1 21:10 renderD128card1のグループがvideo、renderD128のグループがrenderになっていない場合は、Proxmoxのコンテナ設定が間違っています。
その場合、まずLXCコンテナ上でのvideo、renderのgidを確認します。
root@jellyfin:~# cat /etc/group | grep -e video -e rendervideo:x:44:jellyfinrender:x:993:jellyfinこの場合、videoのgidが44、renderのgidが993です。
LXCをシャットダウンします。
Proxmoxホストで/etc/pve/lxc/LXC_ID.confを開き、dev0とdev1のgidが上記の通りになっているか確認、間違っていれば修正します。
dev0: /dev/dri/card1,gid=44dev1: /dev/dri/renderD128,gid=993私の場合はこれで問題なくHWトランスコードできるようになりました。
おわりに
特殊な環境なのでこの情報を必要とする人が存在するか怪しいですが、もしもこの情報が誰かのお役に立ちましたら幸いです。

No comments yet.