ProxmoxVEのLXC上に録画環境を構築する

なにこれ

最近録画環境を建てる機会が何度かあったので,その時の四苦八苦をメモした.

サマリ

conf見ての通りで非特権で立てる.
Mirakurunは直接建てる,EPGStationはdocker-composeで動かしてる.
USBやPCIeのパススルーが面倒なだけ.基本的にドライバはホスト側(便宜上,以降は母艦側と書く)に入れてあればOK.
あと,udev周りよく分かってなかったので,これを機に勉強した.

wiki.archlinux.jp

root@rec:~# uname -a
Linux rec 6.5.11-8-pve #1 SMP PREEMPT_DYNAMIC PMX 6.5.11-8 (2024-01-30T12:27Z) x86_64 x86_64 x86_64 GNU/Linux

環境(PLEX PX4の場合)

パススルーでusbデバイスの適用時には対象をディレクトリではなく,明示的に指定してファイルとして読み込まることで上手く動作する場合がある.
変更後はLXCを再起動すると読み込む.

cat /etc/udev/rules.d/99-px4video.rules
KERNEL=="px4video*", GROUP="video", MODE="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="08e6", ATTRS{idProduct}=="3437", GROUP="video", MODE="0666"

以下は追記を抜粋

cat /etc/pve/lxc/XXX.conf
unprivileged: 1
lxc.cgroup.devices.allow: c 240:* rwm
lxc.cgroup.devices.allow: c 189:* rwm
#lxc.mount.entry: /dev/bus/usb/001 dev/bus/usb/001 none bind,create=dir,mode=0666
lxc.mount.entry: /dev/bus/usb/001/003 dev/bus/usb/001/003 none bind,create=file,mode=0666
lxc.mount.entry: /dev/px4video0 dev/px4video0 none bind,optional,create=file
lxc.mount.entry: /dev/px4video1 dev/px4video1 none bind,optional,create=file
lxc.mount.entry: /dev/px4video2 dev/px4video2 none bind,optional,create=file
lxc.mount.entry: /dev/px4video3 dev/px4video3 none bind,optional,create=file

環境(MyGica S270の場合)

cat /etc/udev/rules.d/99-s270video.rules
# MyGica S270
SUBSYSTEM=="dvb", ATTRS{idVendor}=="187f", ATTRS{idProduct}=="0600", GROUP="video", MODE="0666"
# REALTECK_reader
SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="0169", GROUP="video", MODE="0666"
cat /etc/pve/lxc/XXX.conf
#lxc.mount.entry%3A /dev/dvb/adapter0/frontend0 dev/dvb/adapter0/frontend0 none bind,create=file,mode=0666
#lxc.mount.entry%3A /dev/dvb/adapter0/demux0 dev/dvb/adapter0/demux0 none bind,create=file,mode=0666
#lxc.mount.entry%3A /dev/dvb/adapter0/dvr0 dev/dvb/adapter0/dvr0 none bind,create=file,mode=0666
unprivileged: 1
lxc.cgroup.devices.allow: c 189:* rwm
lxc.cgroup.devices.allow: c 212:* rwm
lxc.mount.entry: /dev/bus/usb/001 dev/bus/usb/001 none bind,create=dir,mode=0666
lxc.mount.entry: /dev/dvb dev/dvb none bind,create=dir,mode=0666

CT周りの話

  • lxc.mount.entry の書き方について
    • LXCでのマウント先指定では dev/bus/usb/001 のようにする.先頭に / は不要
    • ど~しても読み込まない場合は create=dir ではなく create=file でデバイスファイルを指定する.
  • CTID.conf 変更後に読み込ませるには再起動が必要

Mirakurun チューナーオプションについて

MyGica S270のオプション忘れそうなのでここにも書いておく.

dvbv5-zap -a 0 -c /usr/local/dvbconf/conf/dvbv5_channels_isdbt.conf -r -P <channel> -o -

いい感じのsystemdについて

どちらの環境でも使ってる.
up -d だとダメ.up まででよい.-d オプションは不要.
あとは journalctl で良しなに動作を見ておく.

vim /etc/systemd/system/epgstation.service
[Unit]
Description=EPGStation with docker-compose
After=network.target

[Service]
Type=simple
User=XXXXXXXXXXXXXXXXXXXX
WorkingDirectory=/var/lib/docker-mirakurun-epgstation
ExecStartPre=-/usr/bin/docker compose down --volumes
ExecStart=/usr/bin/docker compose up
ExecStop=/usr/bin/docker compose down
Restart=always

[Install]
WantedBy=multi-user.target
 curl -X PUT "http://localhost:40772/api/config/channels/scan?type=GR&setDisabledOnAdd=false&refresh=true"

今後

mirac というMirakurun相当の機能を持つRust製ソフトがあるっぽい.

github.com

置き換えできるか試す.もしかすると全部docker-composeに詰め込めるかも?

LXCへのNFSマウント周りについても書く予定.非特権では直接マウントできないので,母艦にマウントしたものをパススルーすることで実現可能.