📺

Proxmox上に録画サーバーを立ててみた2023

2023/04/23に公開

前書き

初版の事情で録画サーバーの再構築が必要になったので手順をメモ。
未完で終わっている前の記事の続編でもある。
TVerとかがあるのにまだ録画が必要なのかは割と微妙なところになりつつある。

使用機器

  • DeskMini H110
  • Proxmox 7.3
  • Gemalt カードリーダー
  • MyGica S270

目標

  • LXCコンテナ上に録画環境を作る。
  • Unprivilleged (デフォルト)

ホスト上での作業

LXCコンテナで作ると言っているのに、いきなりホスト上で作業とは…?
となるが、権限周りの理由によりホスト上での作業を行わないとどうにもできないところがある。
とりあえず、LXCコンテナは先に作っておく。(中身の設定はしていなくてよい)

ひとつは、デバイスをLXCコンテナに見せる際に、ホスト上のグループとLXCコンテナ上のグループが一致しない(lxc.idmapでどうにか出来るのかもしれないが試していない)ので、権限を緩める必要があること。
2つ目は、LXCコンテナの設定で、ProxmoxのGUIからはできない設定を入れることの2つ。
順に記述していく。

デバイスのアクセス権限設定

チューナーデバイスは、/dev/dvb/adapterN にマップされている。(ディレクトリであり、配下に demux0,frontend0,dvr0 のようなファイルを持つ)
PCカードリーダーは、/dev/bus/usb/XXX/YYY である。XXXとYYYは lsusb コマンドの出力の先頭にかかれている Bus XXX Device YYY から取得できる。

Bus 001 Device 004: ID 08e6:3437 Gemalto (was Gemplus) GemPC Twin SmartCard Reader

udevルールの作成

以下の内容のファイルを /etc/udev/rules.d/99-custom.rules という名前で保存する。
udevは、デバイスが接続されたときにいい感じにデバイスファイルを作成してくれるデーモンである。

# smartcard reader
# Gemalt
SUBSYSTEM=="usb", ATTRS{idVendor}=="08e6", ATTRS{idProduct}=="3437", GROUP="video", MODE="0666"
# NTT SCR3310
SUBSYSTEM=="usb", ATTRS{idVendor}=="04e6", ATTRS{idProduct}=="511a", GROUP="video", MODE="0666"

# MyGica S270 (siano chip)
SUBSYSTEM=="dvb", ATTRS{idVendor}=="187f", ATTRS{idProduct}=="0600", GROUP="video", MODE="0666"

内容は、idVendro idProductはモノによって異なるので、lsusb で調べてほしい。
兎にも角にも、アクセス権を 666 で作ってくれ。ということをお願いしている。
※ PT3の場合は、lspci を使えばわかるかもしれないが、所有していないので不明

作成後は、以下のコマンドで適用できる。再起動しても良い。

udevadm control --reload
udevadm trigger

udevルールが適用されたか確認

適用されたか確認する。 先頭部分が crw-rw-rw- であればOK

ls -l /dev/bus/usb/001/004

crw-rw-rw- 1 root root 189, 3 Apr 23 17:45 /dev/bus/usb/001/004

ls -l /dev/dvb/adapter0

crw-rw-rw- 1 root video 212, 0 Apr 23 17:43 demux0
crw-rw-rw- 1 root video 212, 1 Apr 23 17:43 dvr0
crw-rw-rw- 1 root video 212, 2 Apr 23 17:43 frontend0

LXCコンテナの設定

あとは、LXCコンテナにデバイスを見せるような設定を追加するだけ。
/etc/pve/lxc/CTID.conf に以下の行を追加する。 CTIDはProxmoxに表示されている 102 みたいな数字。

/etc/pve/lxc/CTID.conf
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/adapter0 dev/dvb/adapter0 none bind,create=dir,mode=0666
lxc.mount.entry: /dev/dvb/adapter1 dev/dvb/adapter1 none bind,create=dir,mode=0666

lxc.cgroup.devices.allow はデバイスへのアクセス許可をするもの。先程の確認時に ls -l した際に表示された数値を入れる。
lxc.mount.entry はホスト上のファイルをLXCコンテナ上のどこにマップするかという設定。

蛇足:

  • /dev/dvb 以下を全部マップしても良いかもしれない。
  • mode=0666 は多分不要
  • 動いたら怖くて触りたくないのが本音

LXCコンテナ上の設定

設定は以下の方針とした。

  • コンテナはdebian 11
  • Mirakurun は直接入れる
  • EPGStationはdockerを使う

基本的な色々を入れる

Mirakurunを入れる

チャンネルの設定は省略。チャンネルスキャンがあるのでどうにかなるはず

tuner.yml
- name: MYGICA_S270_0
  types:
    - GR
  command: "dvbv5-zap -a 0 -c /work/epgstation/mirakurun/dvbv5_channels_isdbt.conf -r -P <channel> -o -"
  decoder: "arib-b25-stream-test"
  isDisabled: false

EPGStation

docker-composeで動かすので省略。docker-compose.ymlは以下の通り。
https://gist.github.com/yakumo-saki/07156c4f6a9b9f7f4c22e0f2bbabfdd4

config等はよしなに行ってほしい。

蛇足

Mirakurunがdockerコンテナではない理由

pullした際に以下のように怒られる為。これが解決できるならMirakurunもコンテナで動かせる。

failed to register layer: ApplyLayer exit status 1 stdout:  stderr: failed to Lchown "/app/node_modules/statuses/HISTORY.md" for UID 1516583083, GID 0 (try increasing the number of subordinate IDs in /etc/subuid and /etc/subgid): lchown /app/node_modules/statuses/HISTORY.md: invalid argument

Discussion