CentOS8 + PX-W3PE4 + docker-mirakurun-epgstationで作る自宅TV録画サーバー

# (追記3) 新しい記事を書きました。

新記事：[CentOS8からUbuntu20.04に移行した話 (初期設定や録画環境構築)](https://qiita.com/yukarimazedofu/items/de8a3b575f4e78172596)
GWになり時間が取れたので重い腰を上げOSを切り替えました。
**本記事の情報は古いので、上記をご確認ください**

# (追記2) collelog/tv-recorder

移行のため調べてみると、最初からpx4系に対応したdocker-composeをまとめてくれている神がいたりします。
しかも様々な魅力的な機能まで追加されています。
- mirakc(mirakurun互換でより低負荷)
- vaapi(EPGStationでハードウェアエンコ)

~~更新記事ではこれに切り替えて記述しようと思います。~~(追記3:検討の結果別の方法にしました)
テストで動作は確認しました。
（これがほぼ完成されているので、更新記事の必要性すら怪しい…）

collelog/tv-recorder
https://github.com/collelog/tv-recorder

# (追記) CentOS8 EOL

CentOS 8の提供は2021年で終了、今後はCentOS Stream開発に注力 | マイナビニュース
https://news.mynavi.jp/article/20201209-1573811/

**残念ながら、CentOS8は2021年で終了となるため、現在この記事の内容の一部はお勧めできません。**
著者自身このニュースに動揺しております。 ~~CentOS8が、消えていく...これは面倒なことになった...~~

OSの移行先として CentOS StreamやOracle Linux等のRHEL系もあるのですが、今後RHEL系はコンテナ仮想化にDockerではなくPodmanを利用していくようなのでUbuntu辺りに移行しようと考えています。
個人鯖で使う分にはdocker-composeで十分でk8sは牛刀割鶏だと思うのですよ。はい。

その際、 @urouro0615 さん、 @keng さんからコメントでご指摘のあった問題についても取り込んで取り込んで解決し、新たに記事にしたいと思います。あとubuntuへの移行作業自体も出来れば記事に...
また、書き忘れていた日本鯖ntpでの時間較正を書き加えます、これをやらないと番組開始10sec程度を取り逃すという哀しみを背負いますので…(1敗

# 概要

現在入手困難なTVチューナーカード、アースソフト社のPT3に代わり、PLEX社のPX-W3PE4を用いて自宅TV録画サーバーを構築します。録画ソフトウェアとしてl3tnun氏作成の[docker-mirakurun-epgstation](https://github.com/l3tnun/docker-mirakurun-epgstation)を改変して利用し、できる限りサーバー環境を汚さず、手軽に作成します。



# 注意

本記事はある程度「分かっている」方向けとなります。できる限り詳細に説明はしますが、一部の説明を他の方の解説に任せたり説明を省いている点があることをご了承ください。

2020年3月時点でDockerはCentOS8で未サポートとなっていますが、稼働は確認しています。気になる方はCentOS7で作成してください。

また、サーバーは既に作成しており、記憶を辿って解説記事を書いていることから抜けや間違いがあると思われます。間違いあればご指摘いただければと思います。




# おしながき

1. 資材調達
1. CentOS8インストール、初期設定。
1. PLEX TVチューナー用非公式ドライバインストール
1. Docker, docker-composeインストール
1. docker-mirakurun-epgstation導入



# 1. 資材調達

必要な資材は次の通りとなります。

## 1.1 PC

私は中古の[HP Z230 SFF](https://jp.ext.hp.com/lib/products/workstations/personal_ws/z230/pdfs/z230sff_1309.pdf)を用いていますが録画のみの場合であればそこまでの性能は必要ありません。購入を予定しているTVチューナーの推奨性能以上のものを選んでください。今回の説明で用いるPX-W3PE4はIntel Core i3以上、メモリ4GB以上となっております。Dockerで運用することを考えてこれより多少良いものを選んでおけば確実でしょう。

PX-W3PE4, PX-Q3PE4の場合は **PCIExpress端子**に加え、**内蔵USB端子**が必要なことに注意してください。



## 1.2 PLEX製TVチューナー

[PLEX PX-W3U4/Q3U4/W3PE4/Q3PE4 用の非公式版Linuxドライバ](https://github.com/nns779/px4_drv)に対応しているTVチューナーを購入。私はこの中で比較的動作が安定しているという噂のある「PX-W3PE4」を購入しました。

ここではPX-W3PE4を用いて説明します。PX-W3U4についてはここに記載した方法で視聴可能となると思われますが、**PX-Q3U4, PX-Q3PE4はS4+T4チューナーとなるためここに記載した方法そのままでは視聴できません。当方所有していないため検証できません！**



## 1.3 ICカードリーダー

TVチューナーに付属しているカードリーダーは非公式ドライバでは**利用できません**。USB接続タイプのICカードリーダーが別途必要になります。

私は昔ながらの[SCR3310-NTTCom](http://www.amazon.co.jp/dp/B00117VJ7O)を用いていますが、終売していますので[ACR39-NTTCom](https://www.amazon.co.jp/dp/B017Y8QV4O)あたりを購入するとよいでしょう。私は使用していないため保証はできませんが、ネットでの報告ではPX-W3PE4での利用実績があるようです。




## 1.4 B-CASカード
暗号化されたストリームを復号するために必要。入手法については言及しません。




# 2. CentOS 8 インストール、初期設定

すべてのパーツを入手し、PCとして組み上げてから各種インストールを行います。



## 2.1 CentOS8インストール

まず、CentOSでは最新バージョンとなるCentOS8をインストールします。



1. CentOS8のISOイメージを[ダウンロード](https://www.centos.org/download/)
2. [Rufus](https://rufus.ie/)でUSBメモリに焼きこみ or DVDライティングソフトでDVD-RにISO焼きこみ
3. 2.で作成したメディアから起動するようにBiosを設定、起動。
4. 手順に従いインストール。

「ソフトウェアの選択」は「サーバー」を選択。
ここの手順に従って録画鯖のみ動かすのであれば「最小限のインストール」でも問題ないと思います。

参考：[「ネットワークエンジニアの日常　CentOS 8 をインストールする手順」](https://nwengblog.com/centos8install/)



## 2.2 IPアドレス固定

最終的に録画鯖と同じネットワーク上にいる別PCからブラウザでEPGStationにアクセスし録画管理を行うため、ネットワーク内での鯖のIPアドレスを固定します。

鯖側で固定、ルーターからmacアドレスを用いて固定、いずれの方法でも問題ありません。詳細は省きます。

ここでは、鯖IPを「192.168.xxx.yyy」と固定したとして説明を続けます。



## 2.3 ファイアウォール・SELinux無効化

**鯖より上位のルーター等で適切にファイアウォールが設定されているという前提で**鯖のファイアウォール及びSELinuxを無効化します。**セキュリティ上問題がある**ので、気になる方は無効にせず適切に設定の上ご利用ください。

以降、コマンドはすべて**ルート権限**で実行します。

```bash
# echo ----ファイアウォール無効化----
# systemctl stop firewalld
# systemctl disable firewalld

# echo ----SELinux無効化----
# vi /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
#SELINUX=enforcing   #この行をコメントアウト
SELINUX=disabled     #disabledに変更

:wq

# echo ----再起動----
# reboot

```

参考：[ServerWorld CentOS8 初期設定：ファイアウォール](https://www.server-world.info/query?os=CentOS_8&p=initial_conf&f=2)



# 3. PLEX TVチューナー用非公式ドライバインストール

[PLEX PX-W3U4/Q3U4/W3PE4/Q3PE4 用の非公式版Linuxドライバ](https://github.com/nns779/px4_drv)をリンクに従ってDKMSを利用してインストールします。

```bash
# echo ----必要ライブラリのインストール----
# dnf update
# dnf install git unzip gcc make dkms kernel-devel kernel-headers

# echo ----ファームウェアの抽出とインストール----
# git clone https://github.com/nns779/px4_drv
# cd px4_drv/fwtool
# make
# wget http://plex-net.co.jp/plex/pxw3u4/pxw3u4_BDA_ver1x64.zip -O pxw3u4_BDA_ver1x64.zip
# unzip -oj pxw3u4_BDA_ver1x64.zip pxw3u4_BDA_ver1x64/PXW3U4.sys
# ./fwtool PXW3U4.sys it930x-firmware.bin
# mkdir -p /lib/firmware
# cp it930x-firmware.bin /lib/firmware/
# cd ../

# echo ----ドライバのインストール(DKMS使用)----
# cp -a ./ /usr/src/px4_drv-0.2.1
# dkms add px4_drv/0.2.1
# dkms install px4_drv/0.2.1

# echo ----再起動(一応)----
# reboot

```

インストール後、リンク先の「3.確認」の手順を実施し、/dev/px4video0～4が作成されていることを確認。

参考：[PLEX PX-W3U4/Q3U4/W3PE4/Q3PE4 用の非公式版Linuxドライバ](https://github.com/nns779/px4_drv)

参考：[How to Install Kernel Headers in CentOS 7](https://www.tecmint.com/install-kernel-headers-in-centos-7/)



# 4. Docker, docker-composeインストール

[docker-mirakurun-epgstation](https://github.com/l3tnun/docker-mirakurun-epgstation)を利用するためにDocker, docker-composeをインストールしていきます。

## 4.1 Dockerをインストール

```bash
# echo ----リポジトリの追加----
# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# echo ----暫定対応：containerd.ioの直接インストール----
# wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-[最新バージョン].x86_64.rpm
# dnf install containerd.io-[最新バージョン].x86_64.rpm

# echo ----Dockerのインストール----
# dnf install docker-ce docker-ce-cli

# echo ----Dockerの自動起動設定----
# systemctl start docker
# systemctl enable docker

# echo ----Dockerインストールの確認----
# docker --version
```

コマンド中の[最新バージョン]とは、
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
にある中でbeta, rcのついていない最新のcontainerd.io。
執筆時点での最新は`containerd.io-1.2.13-3.1.el7.x86_64.rpm`

参考：[CentOS8にDockerを入れる](https://qiita.com/dora_2562/items/24691d3bec4c99c1d794)



## 4.2 docker-composeをインストール

```bash
# echo ----docker-composeインストール----
# curl -L "https://github.com/docker/compose/releases/download/[最新バージョン]/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# chmod 755 /usr/local/bin/docker-compose

# echo ----docker-composeインストールの確認----
# docker-compose --version
```

コマンド中の[最新バージョン]とは、
https://github.com/docker/compose/releases
にある中でbeta,rcのついていない最新のバージョン。
執筆時点での最新は`1.25.4`

参考：[Install Docker Compose](https://docs.docker.com/compose/install/)



# 5. docker-mirakurun-epgstation導入

[docker-mirakurun-epgstation](https://github.com/l3tnun/docker-mirakurun-epgstation)をgitクローンし、**PLEX用の設定に書き換えて**実行します。



## 5.1 USB型ICカードリーダーの接続場所を探す

後程コンテナに渡す際に必要になるUSB型ICカードリーダーがどのBusに刺さっているかをlsusbで探します。
lsusbを実行し、「SCM～」と記載のあるものがカードリーダーです。
このBusとDeviceの後に続く数字をメモっておきます。

```bash
# lsusb
...
Bus 003 Device 002: ID 04e6:511a SCM Microsystems, Inc.
...
```



## 5.2 docker-mirakurun-epgstationのクローン

```
# cd ~
# git clone https://github.com/l3tnun/docker-mirakurun-epgstation
```



## 5.3 各種設定ファイルの書き換え

docker-mirakurun-epgstationはPT3を前提とした記載となっているため、PLEX用に各種設定ファイルを書き換えます。`vi`等お好みのエディタで書き換えてください。

**PX-W3U4, PX-W3PE4はこのままで良いですが、PX-Q3U4, PX-Q3PE4はS4+T4チューナーとなるためここに記載した方法では動作しません。**



### 5.3.1 `~/docker-mirakurun-epgstation/docker-compose.yml`

```yml
services:
    mirakurun:
     ...
        devices:
            - /dev/pt3video0:/dev/pt3video0
            - /dev/pt3video1:/dev/pt3video1
            - /dev/pt3video2:/dev/pt3video2
            - /dev/pt3video3:/dev/pt3video3
            #- /dev/bus/usb/00x/00x # card reader
```

この箇所を次の通り書き換える。

```yml
services:
    mirakurun:
     ...
        devices:
            - /dev/px4video0:/dev/px4video0
            - /dev/px4video1:/dev/px4video1
            - /dev/px4video2:/dev/px4video2
            - /dev/px4video3:/dev/px4video3
            - /dev/bus/usb/[BUS]/[DEV]  # card reader
```

pt3の部分をすべてpx4に書き換え、#card reader行のコメントを外す。
この時、5.1で調べたBusとDeviceの数字をそれぞれ[BUS], [DEV]のところに記入。
その他、お好みで録画ファイルの位置を変更したり`#restart: always`をアンコメント。



### 5.3.2 `~/docker-mirakurun-epgstation/mirakurun/conf/tuners.yml`

PT3-S0, PT3-S1, PT3-T1, PT3-T2のCommand行

```yml
command: recpt1 --device /dev/pt3video0 <channel> - -
command: recpt1 --device /dev/pt3video1 <channel> - -
command: recpt1 --device /dev/pt3video2 <channel> - -
command: recpt1 --device /dev/pt3video3 <channel> - -
```

この箇所のpt3をpx4に書き換える。

```yml
command: recpt1 --device /dev/px4video0 <channel> - -
command: recpt1 --device /dev/px4video1 <channel> - -
command: recpt1 --device /dev/px4video2 <channel> - -
command: recpt1 --device /dev/px4video3 <channel> - -
```



BSアンテナのLNB電源をONにする場合は S0, S1に --lnb 15を追加。

```yml
command: recpt1 --device /dev/px4video0 --lnb 15 <channel> - -
command: recpt1 --device /dev/px4video1 --lnb 15 <channel> - -
```



BSアンテナを接続しない場合はS0, S1の`isDisable`をtrueに変更。

```yml
#isDisabled: false
isDisabled: true
```



### ~~5.3.3 `~/docker-mirakurun-epgstation/mirakurun/Dockerfile`~~

**2019年10月に[recpt1がpx4に対応した](https://github.com/stz2012/recpt1/commit/ce8e80f4e8a224741e10d0307a8557ebd792486f)ようで、この記載は不要でした。**
**5.3.3は読み飛ばしてください**

~~**もしかしたらこの変更は必要ないかもしれない[未検証]**~~

~~recpt1のビルド前にpt1_dev.hにPLEX用のデバイス名を追加する。~~

```dockerfile
# recpt1
\
    git clone https://github.com/stz2012/recpt1 /tmp/recpt1 && \
    cd /tmp/recpt1/recpt1 && \
    ./autogen.sh && \
    ./configure && \
    make && \
    make install && \
\
```

~~この箇所の`cd /tmp/recpt1/recpt1 && \`と`./autogen.sh && \`の間に2行追加。~~

```dockerfile
# recpt1
\
    git clone https://github.com/stz2012/recpt1 /tmp/recpt1 && \
    cd /tmp/recpt1/recpt1 && \
    sed -i -e "/^char \*bsdev\[NUM_BSDEV\] = {$/a \ \ \ \ \"/dev/px4video1\",\n\ \ \ \ \"/dev/px4video0\"," pt1_dev.h && \
    sed -i -e "/^char \*isdb_t_dev\[NUM_ISDB_T_DEV\] = {$/a \ \ \ \ \"/dev/px4video2\",\n\ \ \ \ \"/dev/px4video3\"," pt1_dev.h && \
    ./autogen.sh && \
    ./configure && \
    make && \
    make install && \
\
```
参考：[Raspberry Pi 3 Model B で PLEX PX-W3U4 が動くという良い話](https://hirooka.pro/raspberry-pi/raspberry-pi-plex-px-w3u4/)



## 5.4 コンテナの起動

```
# cd ~/docker-mirakurun-epgstation
# docker-compose up -d
```

初回立ち上げはかなり長い時間がかかるので気長に待つ。



## 5.5 起動確認

ネットワーク上の別PCで
`http://192.168.xxx.yyy:8888`
にアクセスし、EPGStationが表示されることを確認。



## 5.6 チャンネル設定

`~/docker-mirakurun-epgstation/mirakurun/conf/channels.yml`を変更してチャンネル設定をする。
BS/CSは入力されたものをそのまま利用できる。
地上波は後述するチャンネルスキャンを用いれば自動設定ができるので、基本的にはチャンネルスキャンだけすればよい。

チャンネルスキャン

```bash
# echo ----mirakurunチャンネルスキャン----
# curl -X PUT "http://192.168.xxx.yyy:40772/api/config/channels/scan"

# echo ----完了後、コンテナの再起動----
# cd ~/docker-mirakurun-epgstation
# docker-compose down
# docker-compose up -d
```



# おわりに

Linux, PLEX, dockerで録画鯖を構築する手段、という記事がなかったので作成しました。
PT3が入手困難になって久しいので、代替手段を探している方々もきっといるはず…

PT3に比べてPLEXのチューナーは動作が不安定、という話もありますが、非公式ドライバは安定して動作しているように見えます。私はかれこれこの鯖で1年ほど深夜アニメを録画していますが、悪天候時以外のドロップは今のところありません。途中CentOSを7から8に上げましたが。

5.3の書き換え部分についてgithubにdiffを設置してそのdiffを適用するような記事にすればもっと容易に導入可能になるかなとも思う。需要があるなら作ろうかな。



昨今映像サブスクリプション全盛でもはやTV録画に需要はないのかもしれないけど、何より無料で放送しているものを録画できるというのは大きなアドバンテージだと思う。皆様良き録画ライフを！