PX-Q3U4で地デジ4ch+BS/CS4chの最強録画環境を作る(Ubuntu+Docker+docker-mirakurun-epgstation)

PX-Q3U4で地デジ4ch+BS/CS4chの最強録画環境を作る(Ubuntu+Docker+docker-mirakurun-epgstation)

テレビ録画サーバのリプレースを検討し始めて早数ヶ月、ようやく重い腰を上げてリプレースに踏み切りました。これまでPT2、PT3とPTシリーズを渡り歩いてきた過去から一転、今回は現行品として定価で手に入れることが出来るPLEX製のチューナーを導入してみました。

私と同じく10年選手のPTシリーズ愛用者で、「PTシリーズはもう終息に向かっているので、そろそろ現行のチューナーに切り替えないといけない…」と悩んでいる方や、最近”TS抜き”みたいな言葉を知ってこれからチャレンジしようと考えている方の参考になれば幸いです。

目次

事の発端。

テレビ録画用の仮想サーバと、メインのPCをかれこれ10年ほど24h365dで運用し続けています。現在の録画サーバ(ESXiサーバとして稼働中)は、富士通のタワー型サーバ機(PRIMERGY TX2540 M1)を使用しており、PT2とPT3を各1枚ずつ(=合わせて地上波4ch、BS/CS4ch同時録画可)を使用しているのですが、

  • サーバ機なので筐体がでかい、電気代がかかる(電気代が毎月2万円台半ば…)
  • PTシリーズのサポートが切れた(新シリーズも出ないし、絶望)
  • PCI Express x1で接続できるPT3に比べ、PCIで接続しなければならないPT2は今後のサーバリプレースに耐えられない(マザーボードにPCIスロットがなくなる可能性大…というか現存してるのか謎)

等などの理由から、録画サーバのリプレースを考え始めました。

 

録画サーバリプレースにあたっての検討内容は…?

録画サーバをリプレースするにあたり、以下を検討内容としました。

  • サーバ自体の小型、省電力化を図ることで取り回しのしやすさの向上、ならびに電気代を抑えること
  • チューナーは2021年初頭時点で定価以下で手に入るもの(PT3最強なのは分かってるけれど、今定価の4~5倍で中古が売られてるトンデモ相場なのでPT3は諦めました)
  • 現在の録画状況から、地上波またはBS/CSが3ch以上同時に録画しているタイミングがあるため、現状と同じくそれぞれ4ch同時録画可能なものが望ましい

サーバの選定

録画サーバは現環境と同じくESXi仮想環境上に構築することを前提としました。

理由としては、環境の構築やリセット、移設等をより簡単に行えるようにするため。直接OSをインストールして、専用機として使っても良いのですがそれだと「構築途中でミスに気づいてもう一度途中からクリーンな状態でやり直し…」みたいなことが簡単に出来ません。

…とはいえ、ESXiってなんぞや?という方はそこに学習コストかけるのも大変だと思いますし、今回つかうUbuntuを直接インストールしても全く問題有りません。ESXi使うのは完全に趣味の問題です。(私の場合、テレビ録画サーバ以外にも数台サーバを運用しているため、集約できる仮想環境がベスト、というだけです。)

今回構築するESXiサーバのベースとなるPCとして白羽の矢が立ったのは、Lenovoの「ThinkCentre M75q-2 Tiny」です。

このPC、「グラフィックボードを追加してゲーム用途で使う…」なんていうゲーミングPCとしての用途を除いて、CPUパワーで押し切る!マルチコアで戦う!みたいな使い方をするにはコスパ最高のPCです。特に、今回のような仮想サーバ用途には省電力性も含めて最適解だと思います。

2021/02/26時点で、M75q-2 Tinyは生産が追いついていないのか発売中止になっているようです。同グレードのCPUを積んでいて、お値段的にはもう少しだけ安く買えるM75s(こちらはミニタワー型)で構築するのも良いかもしれません。

Raspberry Pi4を使って構築する方法もあり、確かにそのほうがお値段的にも安く収まるし、小型で省エネというメリットはあります。

ただ私の場合は、録画したデータをたくさん溜め込む(そもそも録画する量が多い)、エンコードやストリーミング再生機能もガンガン使う、という使い方をする前提なので、CPUパワーやストレージ容量など、パフォーマンスに余裕を持たせたいため今回はRaspberry Piでの構築はしませんでした。

チューナーの選定

今回、チューナーには以下のPLEXのPX-Q3U4を選択しました。

録画サーバ構築手順を記した多数のサイトに記載のあるPX-W3U4との違いですが、

  • Wの方は地デジ・BS/CSともに2chずつ(計4ch)同時録画が可能なモデル
  • Qの方は地デジ・BS/CSがともに4chずつ(計8ch)同時録画が可能な上位モデル

となっています。

※以下のリンクはWのほう。お値段的には、Qが8chで2.6万円ほど、Wのほうが4chで1.5万円ほどで、ch辺りの単価はQのほうが安いです。

私が購入した(=今回構築方法を解説する)のはQ(8ch同時録画可能)の方で、このチューナーを選んだ理由としては、

  • 安心安全(?)のAmazonで数日中に手に入る容易な入手性
  • 定価以下で新品の商品が販売されている現行品であること
  • 8ch同時録画を実現するためにWを2台買うよりもQを1台買うほうが安くて、物量的にもスマート
  • 構築に関する情報が多いチューナー(ただし、情報があるのはWの方で、Qの方を使った設定の仕方をまとめてるサイトはほぼ無い)

ということで選びました。

4ch対応のPX-W3U4の解説サイトは多数有りますが、8ch対応のPX-Q3U4について言及されている構築情報サイトは皆無なため、自力で解決が必要な問題がそこそこありました。本稿では情報の少ないPX-Q3U4をベースに構築しているので、これから導入を検討する際の助けになれば幸いです。

なお(別途検証記事をまとめようと思いますが)、「8ch同時に録画するとドロップが多くて視聴に耐えられない」といった情報が巷には流れていましたが、ノイズを抑える効果があるらしいケーブルに取り替えるなど簡単な対策をするだけで8ch同時録画時のドロップ数が数十から一桁台にまで落ちました。

このドロップ数ですが、100前後のドロップがあると音飛びやブロックノイズが”言われてみれば一瞬気になる”程度に現れます。しかし、一桁台のドロップ程度では視聴に影響があることはほとんどありません。特に録画後に圧縮することが前提の場合、ブロックノイズ云々よりも画質低下のほうが気になるんじゃないかなと思います。

構築完了から現在まで2~3週間ほど使ってみて、実際の所は同時録画数をMAXの8chで稼働させなければほぼドロップはありませんし、そこまで厳密に気にする方(毎期のアニメやドラマをドロップ0でコレクションしたいような方)は超ド安定のPT3を大枚払ってでも買うべきです。同時最大4chで十分な方にはWを、同時5ch(または各波3ch以上)を必要とする方はQを選択すれば全く問題ないです。特に家族で共用を想定されている場合は、チャンネルかぶりに耐えられる(=同時録画ch数が多い)Qが最適解でしょう。

 

本稿について

ようやく本題ですが、今回テレビ録画サーバをリプレースするにあたって

この辺や、

この辺を参考にしてやってみたのですがうまく行かなかったので、徹底的に調べて自分なりの手順をまとめて見ました。

フォロー…というわけではありませんが、一応↑のサイト通りにやってみてうまく行かなかった理由として考えられるところを上げておくと、上記サイトのやり方では「docker-mirakurun-epgstation」の中に含まれているmirakurunを無視して、「Mirakurun」を別にインストールする、という少しイレギュラーなやり方をしていました。DTV界隈の中でも、特にMirakurunやEPGStation周りは更新が激しいので、上記サイトの更新日から現在までに「docker-mirakurun-epgstation」に含まれているmirakurunがPXシリーズで使えるよう最適化された…みたいな記述も見つけました。(どこで見たか忘れたけど)

まぁ、情報がどんどん古くなっていく界隈なので仕方ないです。当記事もいつまで最新で居られるやら怪しいもんです。汗

そもそもPX-Q3U4で構築した、という話がなかなか出てこないので、これから構築を考えている方の助けになれば幸いです。なお、分かる人が読めば、一部チューナーの数を減らすとか、チューナー名を変更すればWの方でも同様に構築可能だと思います。

質問事項をコメント欄に頂いた場合、できる限り回答しながら情報をアップデートしていきたいと思います。なお、手元にWが無いので、Wの方に関してはコメントを頂いても憶測での回答となります。「どうしてもWの構築の仕方で回答がほしいんだ!」という方はAmazonの欲しい物リストから購入いただければ(=手元に環境が整えば)、対応しやすくなります。笑

 

1.事前作業

今回は、サーバOSにUbuntu20.04.1LTSを使用します。私は日本語化されたイメージを使用しました。

インストールの際には、極力不要なものが含まれないクリーンな環境が良いなと思ったので、最小限のインストールにしました。この辺りのインストールが完了した所から以下手順を実施します。

2.パッケージの最新化

インストール直後にやる、決り文句みたいなものです。

$ sudo apt update
アップグレードできるパッケージが 10 個あります。(略)

$ sudo apt upgrade
(略)
続行しますか? [Y/n] y
(略)

$ sudo apt update
パッケージはすべて最新です。

 

3.追加インストール

基本的な動作に必要なアプリやライブラリなど

以下手順を実施するのに必要なライブラリやソフトウェアをまとめてインストールしてしまいます。

$ sudo apt-get install nodejs cmake g++ git curl samba unzip gcc make

Docker/Docker Composeのインストール

今回構築するサーバは、Ubuntu上にDockerを構築し、コンテナとしてサービスを立ち上げます。そのため、Docker/Docker Composeをインストールします。(Dockerあんまり専門ではないので、言い回し等おかしかったらごめんなさい)

$ sudo curl -sSL https://get.docker.com/ | CHANNEL=stable sh
$ sudo usermod -aG docker $USER
$ docker --version
Docker version 20.10.2, build 2291f61

$ sudo apt install docker-compose
$ docker-compose -v
docker-compose version 1.25.0, build unknown

その他

SELinuxの停止は…そもそもインストールされていなさそう。もし入っていたら止めておいたほうがうまく行かないときに悩まなくて良いかもしれない。(入っていないと思うけど。自宅鯖でCentOSメインの頃はよく止めてたその名残。。)

$ getenforce

コマンド 'getenforce' が見つかりません。次の方法でインストールできます:

apt install selinux-utils

 

4.ICカードリーダーの準備

録画サーバを作るにあたって、B-CASカードを読み取るためのカードリーダーと、チューナーのセットアップが必要になります。本来、PX-Q3U4はWindows環境下で公式のドライバで動作させれば、本体内蔵のカードリーダーが使えるんですが、Linux用に有志によって作られたドライバを使用するため本体内蔵のカードリーダーは使えません。

そこで、PT2を初めて使った10年ほど前から使っている安定のカードリーダー「SCR3310/v2.0」を使用します。

旧録画サーバは現在も稼働中(しばらくは並行稼動予定)のため、新調する録画サーバのために数年ぶりに↑のリンクのリーダーを買い増しました。v2.0と記載があったので使えないなんてこと無いよなぁ…という一抹の不安もありましたが、特に問題なく使えています。

ICカードリーダードライバのインストール

以下コマンドでICカードリーダーのドライバをちゃちゃっと入れてしまいます。

$ sudo apt install -y libpcsclite-dev pcscd pcsc-tools libccid

ICカードの認識状況を確認する

Ubuntu上から、ICカードが認識されていることを確認します。

今回録画サーバとして使っているThinkCentre M75q-2 TinyではESXi上からのデバイス追加がすんなり通らない問題が発生しましたが、以下手順で解決出来ました。なお、ESXiサーバとして使っているPCが別の機種の場合は以下問題は再現しない可能性があります。また、そもそもPCに直接OSをインストールしている環境下では以下問題は起こらないのでスルーしてください。

※ESXi6.7上のUbuntu(仮想サーバ)で実行している関係で、ICカードリーダーが仮想サーバに接続されませんでした。以下手順で解決。

  1. 該当の仮想マシンをシャットダウンし、設定の編集を開く
  2. 【仮想マシンオプション】タブを開く
  3. 詳細→設定パラメータ→設定の編集を開く
  4. パラメータの追加ボタンを押下し、パラメータにusb.generic.allowCCIDを追加、値にTRUEを設定する

参考:esxi6.7で仮想マシンにUSBカードリーダをパススルーする方法

 

USB接続されたICカードリーダーにB-CASカードを差し込み、以下コマンドでB-CASカードを認識していることを確認します。

$ pcsc_scan
Using reader plug'n play mechanism
Scanning present readers...
0: SCM Microsystems Inc. SCR 3310 [CCID Interface] 00 00
(略)
        Japanese Chijou Digital B-CAS Card (pay TV)
↑確認できたらCtrl+Cで抜ける

B-CASカードはPX-Q3U4に付属していません。使わなくなったテレビから拝借してくるか、こちらで2160円で発行してもらいましょう。オークションで買った中古のテレビや録画機器などB-CASカードが付属していないときはこちらで発行してもらうのが手っ取り早いです。間違っても、Amazonやヤフオクで発売されている怪しいB-CASカードには手を出さないことをオススメします。。(一時期B-CASの情報書き換えなどが流行った時期があり、その頃の名残でどんな状態のカードかわかりませんので。。)

5.チューナー(PX-Q3U4)のドライバを設定する

GitのREADME.md等に記載があるので、細かい所を確認したい方はそちらを参照してください。

以下、自分がやったときに実行したコマンド等、最小限必要な手順のみをまとめています。

PX-Q3U4のドライバを取得し、インストールする

まずは、ライブラリをインストールします。

$ sudo apt install dkms

 

関連ファイルはユーザのホームフォルダにpx4_drvフォルダを作成し、その中で作成しました。

$ mkdir ~/px4_drv
$ cd ~/px4_drv
$ git clone https://github.com/nns779/px4_drv
$ cd px4_drv/fwtool/
$ make

 

PX-Q3U4用の公式ドライバをダウンロードします。(もしW3U4など別のチューナーを使用する場合は、使うチューナーによって変更すること)

$ wget http://plex-net.co.jp/plex/pxq3u4/pxq3u4_BDA_ver1x64.zip -O pxq3u4_BDA_ver1x64.zip
$ unzip -oj pxq3u4_BDA_ver1x64.zip pxq3u4_BDA_ver1x64/PXQ3U4.sys
$ ./fwtool PXQ3U4.sys it930x-firmware.bin
$ sudo cp it930x-firmware.bin /lib/firmware/

 

カーネルヘッダーの変更確認をします。(変更されている場合はインストールする、以下は特に変更無い場合の結果)

$ sudo apt install linux-headers-$(uname -r)
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
linux-headers-5.8.0-40-generic はすでに最新バージョン (5.8.0-40.45~20.04.1) です。
linux-headers-5.8.0-40-generic は手動でインストールしたと設定されました。
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libfprint-2-tod1 libllvm10
これを削除するには 'apt autoremove' を利用してください。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。

※実施したものの、特に変更ありませんでした。(確認)

 

px4_drvドライバをインストールします。

$ cd ~/px4_drv/px4_drv/driver/
$ make
$ sudo make install

DKMSのインストール

$ cd ~/px4_drv/px4_drv/
$ sudo cp -a ./ /usr/src/px4_drv-0.2.1
$ sudo dkms add px4_drv/0.2.1
$ sudo dkms install px4_drv/0.2.1

カーネルモジュールのロードの確認(DKMSの確認)

px4_drvから始まる行が表示されれば、カーネルモジュールが正常にロードされている

$ lsmod | grep -e ^px4_drv
px4_drv               143360  0

ここまで完了すれば、PX-Q3U4がUbuntuから正常に認識されている状態になっています。

6.録画コマンドのインストール

ここまでの手順でUbuntuがPX-Q3U4を使うことができるようになっているはずです。以下手順で、コマンド操作でPX-Q3U4を操作して実際に録画ができるようにしていきます。

まずはGithubで公開されているstz2012/recpt1を利用し、録画コマンドをインストールします。

$ sudo apt install -y autoconf automake
$ git clone https://github.com/stz2012/recpt1.git
$ cd recpt1/recpt1/
$ ./autogen.sh
$ ./configure --enable-b25
$ make
$ sudo make install
install -m 755 recpt1 recpt1ctl checksignal /usr/local/bin
$ cd ../../
$ rm -rf recpt1/

 

実際に録画できるか、簡単なコマンドでテストします。それぞれ20MB前後のファイルが出来上がればOK。

$ recpt1 --device /dev/px4video0 --lnb 15 --b25 --strip BS15_0 10 bs0.m2ts
$ recpt1 --device /dev/px4video1 --lnb 15 --b25 --strip BS01_2 10 bs1.m2ts
$ recpt1 --device /dev/px4video2 --b25 --strip 27 10 gr0.m2ts
$ recpt1 --device /dev/px4video3 --b25 --strip 27 10 gr1.m2ts

※実際にファイルを開けば番組の内容(10秒程度の動画)が確認出来ます。開く方法についてはここでは言及しません。

 

7.ICカードリーダープロセスを停止する

B-CASカード読み取りに使うICカードリーダーに関連するプロセスは、Dockerコンテナ内で管理するため、ホストサーバのプロセスを停止します。

$ sudo systemctl stop pcscd.socket
$ sudo systemctl disable pcscd.socket
Removed /etc/systemd/system/sockets.target.wants/pcscd.socket.

 

8.管理ソフトウェア(Mirakurun、EPGStation)の準備

今回は録画管理ソフトとして、開発が活発なMirakurunとEPGStationをdockerコンテナとして構築します。必要なファイル一式は以下にあるものを使用し、基本的な構築手順も極力公式の手順通り行います。

”極力公式通り”というのは、上記リンク先のGitにあるMirakurunやEPGStationはPT3をベースに設定が用意されており、そのままでは使えないためです。必要に応じてPX-Q3U4を使用するための最小限の変更を加えながら、基本的には公式のアナウンス通りの手順を踏襲します。

docker-mirakurun-epgstationをインストール

今回は、Ubuntuの一般ユーザのホームディレクトリ配下にdockerフォルダを作成してその中で作業しました。

$ mkdir docker
$ cd docker/

 

gitからクローンします。

$ git clone https://github.com/l3tnun/docker-mirakurun-epgstation.git

 

docker-compose.ymlに追記するカードリーダーのデバイス番号を調べます。後で、以下の「Bus 001 Device 006」の部分を使うので、ご自身の環境下で表示された値を控えておいてください。

$ lsusb
Bus 001 Device 006: ID 04e6:5116 SCM Microsystems, Inc. SCR331-LC1 / SCR3310 SmartCard Reader

 

docker-compose.ymlを編集する

docker-compose.ymlをサンプルからコピーし、修正します。

$ cd docker-mirakurun-epgstation
$ cp docker-compose-sample.yml docker-compose.yml
$ view docker-compose.yml

 

私の環境の場合、編集後のdocker-compose.ymlの内容は以下の通りです。

$ cat docker-compose.yml
version: '3.7'
services:
    mirakurun:
        image: chinachu/mirakurun
        cap_add:
            - SYS_ADMIN
            - SYS_NICE
        ports:
            - "40772:40772"
            - "9229:9229"
        volumes:
            - ./mirakurun/conf:/app-config
            - ./mirakurun/data:/app-data
            - ./mirakurun/run:/var/run/
            - ./mirakurun/opt:/opt/
        environment:
            TZ: "Asia/Tokyo"
        devices:
            - /dev/bus:/dev/bus
            - /dev/px4video0:/dev/px4video0
            - /dev/px4video1:/dev/px4video1
            - /dev/px4video2:/dev/px4video2
            - /dev/px4video3:/dev/px4video3
            - /dev/px4video4:/dev/px4video4
            - /dev/px4video5:/dev/px4video5
            - /dev/px4video6:/dev/px4video6
            - /dev/px4video7:/dev/px4video7
            - /dev/bus/usb/001/006 # card reader
        restart: always
        logging:
            driver: json-file
            options:
                max-file: "1"
                max-size: 10m

    mysql:
        image: mariadb:10.4
        volumes:
            - mysql-db:/var/lib/mysql
        environment:
            MYSQL_USER: epgstation
            MYSQL_PASSWORD: epgstation
            MYSQL_ROOT_PASSWORD: epgstation
            MYSQL_DATABASE: epgstation
            TZ: "Asia/Tokyo"
        command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci --performance-schema=false --expire_logs_days=1
        restart: always
        logging:
            options:
                max-size: "10m"
                max-file: "3"

    epgstation:
        build: epgstation
        volumes:
            - /etc/localtime:/etc/localtime:ro
            - ./epgstation/config:/app/config
            - ./epgstation/data:/app/data
            - ./epgstation/thumbnail:/app/thumbnail
            - ./epgstation/logs:/app/logs
            - ./recorded:/app/recorded
        environment:
            TZ: "Asia/Tokyo"
        depends_on:
            - mirakurun
            - mysql
        ports:
            - "8888:8888"
            - "8889:8889"
        #user: "1000:1000"
        restart: always

volumes:
    mysql-db:
        driver: local

 

デフォルト設定からの変更点は以下の通りです。

$ diff docker-compose-sample.yml docker-compose.yml
13a14,15 ※公式Mirakurunに設定されているrunとoptのボリューム設定を追加
> - ./mirakurun/run:/var/run/
> - ./mirakurun/opt:/opt/
18c20,28 ※デバイスを整理
< - /dev/dvb:/dev/dvb
---
> - /dev/px4video0:/dev/px4video0
> - /dev/px4video1:/dev/px4video1
> - /dev/px4video2:/dev/px4video2
> - /dev/px4video3:/dev/px4video3
> - /dev/px4video4:/dev/px4video4
> - /dev/px4video5:/dev/px4video5
> - /dev/px4video6:/dev/px4video6
> - /dev/px4video7:/dev/px4video7
> - /dev/bus/usb/001/006 # card reader

 

  • DVBデバイスを削除してPX-Q3U4のデバイスを追加し、録画データの保存先を変更する
  • カードリーダーのデバイス名は、先に調べておいたBusとDeviceの番号を入れる

なお、保存場所を変更する設定箇所がありますが、今回は別のディスクを録画データ専用のものとしてデフォルトの録画先にマウントして使うため、変更していません。別に、絶対に変更しないといけない理由は無いので個人的にはデフォルトのままで良い気はします。

録画コマンドをDockerのコンテナ上から使用できるようにコピーする

Mirakurunの説明にある通り、「DVBデバイスではないPX-Q3U4を使用する」ため、録画コマンドをコピーします。

docker-compose.ymlの設定の中でコンテナ上のoptとローカルのディレクトリを紐付ける設定が入っています。以下コマンドで、その紐付けられたディレクトリの中にrecpt1のコマンド(recpt1をインストールしたときに出来た3ファイル)をコピーします。

$ mkdir mirakurun/run
$ mkdir mirakurun/opt
$ mkdir mirakurun/opt/bin
$ cp -p /usr/local/bin/checksignal ~/docker/docker-mirakurun-epgstation/mirakurun/opt/bin/
$ cp -p /usr/local/bin/recpt1* ~/docker/docker-mirakurun-epgstation/mirakurun/opt/bin/
$ ls -la mirakurun/opt/bin/
※checksignal、recpt1、recpt1ctlがあることを確認する

config.ymlを編集する

EPGStationのconfig.ymlをサンプルからコピーし作成します。

$ cp epgstation/config/config.sample.yml epgstation/config/config.yml
$ view epgstation/config/config.yml

 

※もし保存先を変更する場合は、以下のように録画データの保存先をdocker-compose.ymlの変更箇所と合わせて修正すること。(今回は変更しないため、以下の変更はしない)

$ diff epgstation/config/config.sample.yml epgstation/config/config.yml
27c27
<       path: '%ROOT%/recorded'
---
>       path: '/home/xxxxx/tvrec'

その他、コピーが必要なファイル

ログ周りの設定ファイルをサンプルからコピーし作成する。

$ cp epgstation/config/operatorLogConfig.sample.yml epgstation/config/operatorLogConfig.yml
$ cp epgstation/config/epgUpdaterLogConfig.sample.yml epgstation/config/epgUpdaterLogConfig.yml
$ cp epgstation/config/serviceLogConfig.sample.yml epgstation/config/serviceLogConfig.yml

こちらは特に変更しない。

チューナー設定(tuners.yml)

このまま、Git上のREADME.mdの手順通りにdocker-compose…すると、tuners.ymlchannels.ymlが自動生成されるのですが、このままではPT3準拠のファイルが出来上がってしまいエラーになります。無駄にPT3用のファイルが作成されても仕方ないため、予め以下のようにファイルを作成しておきます。

mirakurun/conf/tuners.ymlを以下のように作成する。

$ view mirakurun/conf/tuners.yml

 

作成したtuners.ymlの中身は以下の通りです。(PX-Q3U4用の設定です。Wの方を使う場合には一部書き換えること)

- name: PX-Q3U4_S1
  types:
    - BS
    - CS
  command: recpt1 --device /dev/px4video0 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PX-Q3U4_S2
  types:
    - BS
    - CS
  command: recpt1 --device /dev/px4video1 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PX-Q3U4_T1
  types:
    - GR
  command: recpt1 --device /dev/px4video2 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PX-Q3U4_T2
  types:
    - GR
  command: recpt1 --device /dev/px4video3 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PX-Q3U4_S3
  types:
    - BS
    - CS
  command: recpt1 --device /dev/px4video4 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PX-Q3U4_S4
  types:
    - BS
    - CS
  command: recpt1 --device /dev/px4video5 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PX-Q3U4_T3
  types:
    - GR
  command: recpt1 --device /dev/px4video6 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PX-Q3U4_T4
  types:
    - GR
  command: recpt1 --device /dev/px4video7 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

PT3のサンプル(デフォルトのtuners.yml)を見ると、--lnb 15とオプションが付いていましたが、マンションなので15V給電はされているはず…ということで外しています。現状、特に問題ないです。(そもそも、PT3と違うのでlnbの記述に意味があるかどうか不明です…未検証。)

チャンネル設定(channels.yml)

channels.ymlを修正します。

現在関東圏に住んでいるため、デフォルトの設定でも大丈夫そうな気もしますが、ざっと見た感じでは初期値のままだと地域ローカル局(?)が無いようでした。…なので地デジ分は一旦全て削除し、後でチャンネルスキャンをして取得することにします。

BS/CSについては、している契約チャンネルのみを登録するやり方(こうすることで、未契約で見れない局が番組表に出てこなくなり、番組表に無駄がないメリットがあります。…が、個人的には契約外のチャンネルの番組表も検索できるようにしたい(もし見たい番組が契約外のチャンネルで放送されるようであれば、一時的に契約を行う…など)ので、全て登録しました。

$ cd ~/docker/docker-mirakurun-epgstation
$ view mirakurun/conf/channels.yml

中身の記述内容はこちらを参照。全て置き換えます。

tuners.ymlが修正出来たら、再度docker-composeを実行。

$ docker-compose run --rm -e SETUP=true mirakurun

 

docker-mirakurun-epgstationの起動

以下コマンドで起動する。

$ cd ~/docker/docker-mirakurun-epgstation
$ sudo docker-compose up -d
(略)
Successfully built 610d839ca3bb
Successfully tagged docker-mirakurun-epgstation_epgstation:latest
WARNING: Image for service epgstation was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating docker-mirakurun-epgstation_mysql_1 ... done
Creating docker-mirakurun-epgstation_mirakurun_1 ... done
Creating docker-mirakurun-epgstation_epgstation_1 ... done

時々赤い文字がつらつら…っと出てきたが、一応Successfullyになりました。ここまで実行が完了し、問題なく構築できていれば、PX-Q3U4内臓のファンが回り始める音が聞こえてきます。(=チューナーが動作している)

 

地デジチャンネルのスキャン

地デジチャンネルのスキャンを実行します。

$ sudo apt-get install curl
$ curl -X PUT "http://localhost:40772/api/config/channels/scan"
channel scanning... (type: "GR")

channel: "13" ...
-> no signal. [Error: stream has closed before get network]

channel: "14" ...
-> no signal. [Error: stream has closed before get network]

channel: "15" ...
-> no signal. [Error: stream has closed before get network]

channel: "16" ...
-> 3 services found.
-> {"name":"TOKYO MX","type":"GR","channel":"16","isDisabled":false}

channel: "17" ...
-> no signal. [Error: stream has closed before get network]

channel: "18" ...
-> 3 services found.
-> {"name":"tvk","type":"GR","channel":"18","isDisabled":false}

channel: "19" ...

動作確認

ファンが回り始めた音がしたら、動作が始まっているのでブラウザからアクセスして動作確認します。

Mirakurunの動作確認

http://<dockerのipaddress>:40772/

↑こちらにアクセスして、Logsを開く。チューナーを認識できていないなど、クリティカルなエラーが有ると該当の行に赤帯が出るので、上から下までざっとスクロールして「info:」がつらつらっと並んでいるようなら問題なし。

 

http://<dockerのipaddress>:40772/api/channels

なお、↑にアクセスするとチャンネル情報の取得状況?が見れる。正常に動作していればチャンネルスキャン中に何度か更新してるうちにどんどん情報が埋まっていきます。

EPGStationの動作確認

http://<dockerのipaddress>:8888/#/

↑こちらが予約等の設定を行うEPGStationの画面。番組表を開いてみるとはじめは真っ白な画面が表示されるも、小一時間経つと以下のように番組表が取得されるはず。

 

試行錯誤の経緯やハマりどころ

チューナーの順番

上述の手順には正しい配置で反映済みです。以下参考程度のメモです。

tuners.ymlの設定を作る際、地デジ+BS/CS合わせて8チューナーあるため、はじめは以下のように設定していました。

放送波 デバイス
BS/CS /dev/px4video0~3
地上波 /dev/px4video4~7

しかし実際は、内部的にW3U4を2つ搭載しているイメージで、地デジ2ch+BS/CS2chを2セット、つまり以下のような区分けが正しいらしい。

放送波 デバイス
BS/CS /dev/px4video0、1
地上波 /dev/px4video2、3
BS/CS /dev/px4video4、5
地上波 /dev/px4video6、7

 

チャンネルスキャンをするも、すでに稼働中のPT3×EpgTimerよりもチャンネル数が少ない問題

たまたま取得できておらず、他の環境ではうまくいく可能性もあるため、上述の手順には未反映。(以下手順を実施することで、インストールする必要があるファイル等が増えるため「デフォルトで実施する=環境が汚れる」と思う方もいるかも?という配慮から。)

必要に応じ、以下手順を実施してください。

チャンネルスキャンの時間を伸ばして再スキャンすることで、タイムアウトを防ぎデータ取得率を上げることを狙います。

まずはepgdumpインストール。

$ mkdir ~/git
$ cd ~/git/
$ git clone https://github.com/stz2012/epgdump
$ cd epgdump
$ make
$ sudo make install
$ ls /usr/local/bin/epgdump

チャンネル設定更新スクリプトのインストール。

$ mkdir ~/git/mcconfig
$ cd ~/git/mcconfig
$ wget https://www.jifu-labo.net/files/mcconfig.pl.gz
$ gzip -d mcconfig.pl.gz

$ cd ~/docker/docker-mirakurun-epgstation/mirakurun/conf/
$ pwd
/home/xxxxx/docker/docker-mirakurun-epgstation/mirakurun/conf ←channels.ymlを配置しているフォルダを調べる

$?cd?~/git/mcconfig
$ cp mcconfig.pl mcconfig.pl.org
$ view mcconfig.pl
$ diff mcconfig.pl mcconfig.pl.org
18c18 ※channels.ymlの格納先をここまでの手順で変更しているため、上記で調べた場所に書き換える。
< my $CH_YAML_File = "/home/xxxxx/docker/docker-mirakurun-epgstation/mirakurun/conf/channels.yml";
---
> my $CH_YAML_File = "/usr/local/etc/mirakurun/channels.yml";

$ sudo install -m 755 mcconfig.pl /usr/local/bin/
$ sudo apt-get install libxml-libxml-perl libyaml-perl

このスクリプトを実行するとchannels.ymlを直接変更してしまうようなので、バックアップをとっておく。

$ cd ~/docker/docker-mirakurun-epgstation/mirakurun/conf/
$ cp -p channels.yml channels.yml.org

ちょっと長めに各チャンネル30秒ずつスキャンする。深夜帯は放送休止になっていて取得できない…という場合もあるので日中時間帯に実行するのが良さそう。

$ sudo docker-compose down ※Mirakurunが動いているといけないので、停止させておくこと。
$ sudo mcconfig.pl -gr -t 30 ※地上波のチャンネルスキャンを各30秒ずつ行う(初期値は10秒らしい)
13: J:COMテレビ
14: rec fail
15: rec fail
16: TOKYO MX1
17: rec fail
18: tvk1
19: rec fail
20: rec fail
21: フジテレビ
22: TBS1 ←※通常のスキャンでは出てこなかったチャンネルが出てきた!
23: テレビ東京1
24: テレビ朝日
25: 日テレ1 ←※通常のスキャンでは出てこなかったチャンネルが出てきた!
(略)

diffで比べてみると変更箇所多すぎでわかりにくかったので、WindowsPCでWinMergeで比較してみた。

…BS/CSのほうも色々と書き換わっている模様。。わかりにくいのでchannels.ymlとchannels.yml.orgから- name:がついている行を抜き出してエクセルでソート、比較してみた結果が以下。

旧録画サーバで使用中のEpgTimerと比較した際に、新サーバでは取得に失敗していた2つのチャンネル(TBS1と日テレ1)が無事取得できていることが確認できました。

なお、上記以外のチャンネル(BS/CS)については差分はありませんでした。(WinMergeの結果で違うところがたくさん合ったのは、順番が入れ替わっていたり、チャンネル設定を''で囲んでいるかいないか、チャンネル毎に空行で区切っているかどうか、といった差がほとんどだったため、今回新規で再作成された設定値を正とすることにしました。)

上記の前後比較で、Mirakurunが取得した地デジの番組名は「TOKYO MX」というように末尾に数字なしの状態で記録されていたが、今回使用したmcconfig.plを使うと「TOKYO MX1」のように数値がついていました。これはEpgTimerやTVtestで設定したことがある方はご存知であろう「不要なチャンネルにはチェックを外す」というやつで生き残るチャンネルが1番、というだけの話だと思います。

結論、素直に新しく出来たchannels.ymlを使用することにしました。ただし、1点だけ(個人的な好き好みの話ではありますが)全角英数字が気に入らないので、そこだけは半角に修正しました。(恐らく、nameの項目はチャンネル名の表示に使われるだけなので、影響は無いはず。。なお、BS/CSの方は参照元ですでに半角になっていました。)

※↓diffの結果。「NHK総合1・東京」と全角になっていたものを全て半角にして「NHK総合1・東京」というふうに変更しています。

$ cp -p channels.yml channels.yml.new
$ view channels.yml
$ diff channels.yml channels.yml.new
1c1
< - name: NHK総合1・東京
---
> - name: NHK総合1・東京
6c6
< - name: NHKEテレ1東京
---
> - name: NHKEテレ1東京
11c11
< - name: 日テレ1
---
> - name: 日テレ1
15c15
< - name: TBS1
---
> - name: TBS1
29c29
< - name: テレビ東京1
---
> - name: テレビ東京1
34c34
< - name: TOKYO MX1
---
> - name: TOKYO MX1
39c39
< - name: J:COMテレビ
---
> - name: J:COMテレビ
44c44
< - name: tvk1
---
> - name: tvk1
49c49
< - name: チバテレ1
---
> - name: チバテレ1
54c54
< - name: テレ玉1
---
> - name: テレ玉1
59c59
< - name: J:COMチャンネル
---
> - name: J:COMチャンネル
453d452
<

 

参考まで、最終的に設定されたchannels.ymlは以下。地域は東埼玉なので、他地域の場合は主に地デジのチャンネル設定が変わると思います。

- name: NHK総合1・東京
  type: GR
  channel: '27'
  isDisabled: false

- name: NHKEテレ1東京
  type: GR
  channel: '26'
  isDisabled: false

- name: 日テレ1
  type: GR
  channel: '25'

- name: TBS1
  type: GR
  channel: '22'

- name: フジテレビ
  type: GR
  channel: '21'
  isDisabled: false

- name: テレビ朝日
  type: GR
  channel: '24'
  isDisabled: false

- name: テレビ東京1
  type: GR
  channel: '23'
  isDisabled: false

- name: TOKYO MX1
  type: GR
  channel: '16'
  isDisabled: false

- name: J:COMテレビ
  type: GR
  channel: '13'
  isDisabled: false

- name: tvk1
  type: GR
  channel: '18'
  isDisabled: false

- name: チバテレ1
  type: GR
  channel: '30'
  isDisabled: false

- name: テレ玉1
  type: GR
  channel: '32'
  isDisabled: false

- name: J:COMチャンネル
  type: GR
  channel: '29'
  isDisabled: false

- name: NHK BS1
  type: BS
  channel: 'BS15_0'
  serviceId: 101

- name: NHK BSプレミアム
  type: BS
  channel: 'BS03_1'
  serviceId: 103

- name: BS日テレ
  type: BS
  channel: 'BS13_0'
  serviceId: 141

- name: BS朝日
  type: BS
  channel: 'BS01_0'
  serviceId: 151

- name: BS-TBS
  type: BS
  channel: 'BS01_1'
  serviceId: 161

- name: BSテレ東
  type: BS
  channel: 'BS01_2'
  serviceId: 171

- name: BSフジ
  type: BS
  channel: 'BS13_1'
  serviceId: 181

- name: WOWOWプライム
  type: BS
  channel: 'BS03_0'
  serviceId: 191

- name: WOWOWライブ
  type: BS
  channel: 'BS05_0'
  serviceId: 192

- name: WOWOWシネマ
  type: BS
  channel: 'BS05_1'
  serviceId: 193

- name: スター・チャンネル1
  type: BS
  channel: 'BS09_1'
  serviceId: 200

- name: スター・チャンネル2
  type: BS
  channel: 'BS15_1'
  serviceId: 201

- name: スター・チャンネル3
  type: BS
  channel: 'BS15_1'
  serviceId: 202

- name: BS11
  type: BS
  channel: 'BS09_0'
  serviceId: 211

- name: TwellV
  type: BS
  channel: 'BS09_2'
  serviceId: 222

- name: 放送大学 BS1
  type: BS
  channel: 'BS11_1'
  serviceId: 231

- name: 放送大学 BS2
  type: BS
  channel: 'BS11_1'
  serviceId: 232

- name: グリーンチャンネル
  type: BS
  channel: 'BS19_0'
  serviceId: 234

- name: BSアニマックス
  type: BS
  channel: 'BS13_2'
  serviceId: 236

- name: BSスカパー!
  type: BS
  channel: 'BS11_0'
  serviceId: 241

- name: J SPORTS 1
  type: BS
  channel: 'BS19_1'
  serviceId: 242

- name: J SPORTS 2
  type: BS
  channel: 'BS19_2'
  serviceId: 243

- name: J SPORTS 3
  type: BS
  channel: 'BS21_1'
  serviceId: 244

- name: J SPORTS 4
  type: BS
  channel: 'BS21_2'
  serviceId: 245

- name: BS釣りビジョン
  type: BS
  channel: 'BS23_0'
  serviceId: 251

- name: シネフィルWOWOW
  type: BS
  channel: 'BS21_0'
  serviceId: 252

- name: 日本映画専門チャンネル
  type: BS
  channel: 'BS23_1'
  serviceId: 255

- name: ディズニー・チャンネル
  type: BS
  channel: 'BS03_2'
  serviceId: 256

- name: 東映チャンネル
  type: CS
  channel: 'CS8'
  serviceId: 218

- name: 衛星劇場
  type: CS
  channel: 'CS10'
  serviceId: 219

- name: 映画ch・NECO
  type: CS
  channel: 'CS24'
  serviceId: 223

- name: ザ・シネマ
  type: CS
  channel: 'CS14'
  serviceId: 227

- name: ムービープラス
  type: CS
  channel: 'CS18'
  serviceId: 240

- name: スカイA
  type: CS
  channel: 'CS4'
  serviceId: 250

- name: GAORA
  type: CS
  channel: 'CS12'
  serviceId: 254

- name: 日テレG+
  type: CS
  channel: 'CS24'
  serviceId: 257

- name: ゴルフネットワーク
  type: CS
  channel: 'CS18'
  serviceId: 262

- name: SKY STAGE
  type: CS
  channel: 'CS16'
  serviceId: 290

- name: 時代劇専門ch
  type: CS
  channel: 'CS4'
  serviceId: 292

- name: ファミリー劇場
  type: CS
  channel: 'CS14'
  serviceId: 293

- name: ホームドラマch
  type: CS
  channel: 'CS6'
  serviceId: 294

- name: MONDO TV
  type: CS
  channel: 'CS24'
  serviceId: 295

- name: TBSチャンネル1
  type: CS
  channel: 'CS2'
  serviceId: 296

- name: TBSチャンネル2
  type: CS
  channel: 'CS22'
  serviceId: 297

- name: テレ朝チャンネル1
  type: CS
  channel: 'CS2'
  serviceId: 298

- name: テレ朝チャンネル2
  type: CS
  channel: 'CS2'
  serviceId: 299

- name: 日テレプラス
  type: CS
  channel: 'CS24'
  serviceId: 300

- name: エンタメ~テレ
  type: CS
  channel: 'CS4'
  serviceId: 301

- name: チャンネル銀河
  type: CS
  channel: 'CS18'
  serviceId: 305

- name: フジテレビONE
  type: CS
  channel: 'CS20'
  serviceId: 307

- name: フジテレビTWO
  type: CS
  channel: 'CS20'
  serviceId: 308

- name: フジテレビNEXT
  type: CS
  channel: 'CS20'
  serviceId: 309

- name: スーパー!ドラマTV
  type: CS
  channel: 'CS14'
  serviceId: 310

- name: AXN海外ドラマ
  type: CS
  channel: 'CS16'
  serviceId: 311

- name: FOX
  type: CS
  channel: 'CS22'
  serviceId: 312

- name: 女性ch/LaLa
  type: CS
  channel: 'CS18'
  serviceId: 314

- name: AXNミステリー
  type: CS
  channel: 'CS16'
  serviceId: 316

- name: スペシャプラス
  type: CS
  channel: 'CS16'
  serviceId: 321

- name: スペースシャワーTV
  type: CS
  channel: 'CS20'
  serviceId: 322

- name: MTV
  type: CS
  channel: 'CS4'
  serviceId: 323

- name: ミュージック・エア
  type: CS
  channel: 'CS6'
  serviceId: 324

- name: エムオン!
  type: CS
  channel: 'CS12'
  serviceId: 325

- name: 歌謡ポップスch
  type: CS
  channel: 'CS6'
  serviceId: 329

- name: キッズステーション
  type: CS
  channel: 'CS12'
  serviceId: 330

- name: カートゥーン
  type: CS
  channel: 'CS6'
  serviceId: 331

- name: AT-X
  type: CS
  channel: 'CS16'
  serviceId: 333

- name: ディズニージュニア
  type: CS
  channel: 'CS2'
  serviceId: 339

- name: ディスカバリーチャンネル
  type: CS
  channel: 'CS6'
  serviceId: 340

- name: アニマルプラネット
  type: CS
  channel: 'CS6'
  serviceId: 341

- name: ヒストリーチャンネル
  type: CS
  channel: 'CS14'
  serviceId: 342

- name: ナショナルジオグラフィック
  type: CS
  channel: 'CS12'
  serviceId: 343

- name: 日テレNEWS24
  type: CS
  channel: 'CS8'
  serviceId: 349

- name: TBS NEWS
  type: CS
  channel: 'CS22'
  serviceId: 351

- name: BBCワールドニュース
  type: CS
  channel: 'CS16'
  serviceId: 353

- name: CNNj
  type: CS
  channel: 'CS6'
  serviceId: 354

- name: 囲碁・将棋チャンネル
  type: CS
  channel: 'CS6'
  serviceId: 363

- name: スポーツライブ+
  type: CS
  channel: 'CS10'
  serviceId: 800

- name: スカチャン1
  type: CS
  channel: 'CS10'
  serviceId: 801

更新が完了したら、Dockerを起動します。

$ cd ~/docker/docker-mirakurun-epgstation
$ docker-compose up -d

ストレージ情報の読み取りに失敗した、というエラーが出る

上述の手順では、録画ファイルの保存先を変更しないままにしています。変更したい場合は以下未検証なので、自己解決お願いします。(解決したら情報提供いただけると幸いです。)

EPGStationにアクセスし、ストレージ情報を開くと「読み取りに失敗した」というエラーが表示されました。

保存先の指定の仕方、フルパスで書いていたのがいけない?とりあえず元に戻したら解決しました。(recordedフォルダではなく、任意のフォルダ「/path/to/dir」としようとした)

ただ、私がやりたかったのは「別の録画データ専用のディスクを用意して、その中に保存したい」だったので、録画専用のディスクのマウント先をデフォルトの保存先フォルダ(recorded)に被せてしまうことで解決しています。

録画コマンド(recpt1)をコピーする位置

上述の手順の中に反映済みのため、以下は参考程度のメモです。

recpt1コマンドをコピーするも、うまくDocker内で動いてくれず録画が出来ないという問題が発生していました。この点については、コピーする位置等含め上述の手順に反映していますので、解決済みです。

/usr/local/mirakurun/opt/にデフォルトでPATHが通る…と公式サイトには記載がありましたが、Mirakurunのソースを見ているとPATHが通されているのは/opt/ではなく/opt/bin/のようでした。/usr/local/binフォルダごとまるっとコピーすればハマらなかったのかも…?

一旦、上述の手順で解決しているためそちらを正とします。

その他、行ったこと

TV録画用UbuntuサーバにHDDを増設、録画先に指定した

私のようにESXiを使った仮想環境内でこのサーバを立てている場合は特に気にされるかと思いますが、複数のOSが乗っているメインのSSDに録画ファイルを日々Read/Writeして寿命を縮めるようなことは防ぎたいです。そのため、新たに録画データ専用のSSDを増設して仮想ディスクを作成、その仮想ディスクを録画領域としてマウントすることでデータの書き込み先を増設したSSDに振り向ける処置をします。

以下手順ではESXi周りの手順については触れません。また、ESXi使ってない、ディスク一本で運用するのでも全然構わない、という方にはこのセクションは関係ありません

まず、増設したディスクを探します。

$ sudo fdisk -l
(略)
ディスク /dev/sdb: 892.59 GiB, 958400477184 バイト, 1871875932 セクタ
Disk model: Virtual disk
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
(略)

パーティションを作成します。コマンドを聞かれたら「d→n→w」、その他はディスク全体をまるっと使うためデフォルトでOK。

$ sudo fdisk /dev/sdb
(略)
コマンド (m でヘルプ): m

ヘルプ:

  DOS (MBR)
   a   起動可能フラグを切り替えます
   b   入れ子の BSD ディスクラベルを編集します
   c   DOS 互換フラグを切り替えます

  一般
   d   パーティションを削除します
   F   パーティションのない領域を一覧表示します
   l   既知のパーティションタイプを一覧表示します
   n   新しいパーティションを追加します
   p   パーティション情報を表示します
   t   パーティションタイプを変更します
   v   パーティション情報を検証します
   i   パーティションの情報を表示します

  その他
   m   このメニューを表示します
   u   表示項目の単位を変更します
   x   特殊機能に移動します (熟練者向け機能)

  スクリプト
   I   ディスクのレイアウトを sfdisk 互換のスクリプトから読み込みます
   O   ディスクのレイアウトを sfdisk 互換のスクリプトに書き出します

  保存と終了
   w   パーティション情報をディスクに書き込んで終了します
   q   変更点を保存せずに終了します

  新しいラベルを作成します
   g   新しい (何もない) GPT パーティションテーブルを作成します
   G   新しい (何もない) SGI (IRIX) パーティションテーブルを作成します
   o   新しい (何もない) DOS パーティションテーブルを作成します
   s   新しい (何もない) Sun パーティションテーブルを作成します

コマンド (m でヘルプ): d
パーティションは何も設定されていません!

コマンド (m でヘルプ): n
パーティションタイプ
   p   基本パーティション (0 プライマリ, 0 拡張, 4 空き)
   e   拡張領域 (論理パーティションが入ります)
選択 (既定値 p): 
パーティション番号 (1-4, 既定値 1):
最初のセクタ (2048-1871875931, 既定値 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-1871875931, 既定値 1871875931):

新しいパーティション 1 をタイプ Linux、サイズ 892.6 GiB で作成しました。

コマンド (m でヘルプ): w
パーティション情報が変更されました。
ioctl() を呼び出してパーティション情報を再読み込みします。
ディスクを同期しています。

 

作成したパーティションが認識されていることを確認。

$ sudo fdisk -l
ディスク /dev/sdb: 892.59 GiB, 958400477184 バイト, 1871875932 セクタ
Disk model: Virtual disk
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x3e4d9cc0

デバイス   起動 開始位置   最後から     セクタ サイズ Id タイプ
/dev/sdb1           2048 1871875931 1871873884 892.6G 83 Linux

 

ディスクをフォーマットする。

$ sudo mkfs.ext4 /dev/sdb1

 

録画先フォルダに、追加したディスクをマウントする。

※マウント作業前にDockerを落としておく
$ docker-compose down

$ sudo mount /dev/sdb1 ~/docker/docker-mirakurun-epgstation/recorded

※マウントするだけだと書き込みが出来ないので、ユーザに権限を付ける。
$ sudo chown $USER.$USER ~/docker/docker-mirakurun-epgstation/recorded/
$ sudo chmod 775 ~/docker/docker-mirakurun-epgstation/recorded/
$ ls -la ~/docker/docker-mirakurun-epgstation/
drwxrwxr-x 3 xxxxx xxxxx 4096  2月  1 18:48 recorded ←こうなっていればOK。

$ df -h
(略)
/dev/sdb1       878G   13G  821G   2% /home/xxxxx/docker/docker-mirakurun-epgstation/recorded
(略)
※マウントされていることを確認する

※一般ユーザで書き込みできるか、確認する
$ touch ~/docker/docker-mirakurun-epgstation/recorded/test.txt
$ ls -a ~/docker/docker-mirakurun-epgstation/recorded/test.txt
$ rm ~/docker/docker-mirakurun-epgstation/recorded/test.txt

※Dockerを起動する
$ docker-compose up -d

 

EPGStationを開いて、ストレージ情報を確認する。追加した容量になっていればOK。適当に番組表を開いて、予約録画して書き込みのテストも忘れずに。

録画も問題なければ、OS起動時に自動的にマウントされるよう設定する。

追加したディスクのUUIDを調べる。(環境によりコマンドの一部が変わることに注意)

$ sudo blkid /dev/sdb1
/dev/sdb1: UUID="f53c7e6f-f5dd-4bf9-9edb-7d1f6cec1857" TYPE="ext4" PARTUUID="3e4d9cc0-01"

$ sudo view /etc/fstab
※以下2行を行末に追記
# Mirakurun+EPGStation Rec Data
UUID=f53c7e6f-f5dd-4bf9-9edb-7d1f6cec1857 /home/xxxxx/docker/docker-mirakurun-epgstation/recorded ext4 defaults 0 0

※OSを再起動して、起動後にマウントされているか確認する

 

OS起動・停止に合わせて自動的にMirakurun+EPGStationを起動・停止する設定

OS再起動時に、毎回Dockerの起動停止コマンドを叩かないといけないのは面倒なので、自動的に起動停止スクリプトが走るよう設定します。

この設定は必須でやっておいたほうが良いと思います。何かの表紙に再起動したとき、毎回ログインして起動コマンド叩いたり、再起動する前に毎回終了コマンド叩くの面倒ですし。

まず、/etc/init.d/に起動停止スクリプトを作成する。

$ sudo view /etc/init.d/Docker-Compose-Mirakurun-EPGStation.sh

スクリプトの中身は以下。

#!/bin/sh

lock_file="/var/lock/subsys/Docker-Compose-Mirakurun-EPGStation"
LOG="/home/xxxxx/docker/docker-mirakurun-epgstation/auto-start-stop.log"
WORKDIR="/home/xxxxx/docker/docker-mirakurun-epgstation"

start()
{
    # lock_fileを生成しないとshutdownの時に実行されない
    touch ${lock_file}

    # 処理
    cd ${WORKDIR}
    touch ${LOG}
    echo '== startup! ===================================================================================' >> ${LOG}
    date >> ${LOG}
    docker-compose up -d
    docker-compose ps >> ${LOG}
    echo '*** startup complete! ***' >> ${LOG}
}

stop()
{
    # lock_fileの削除
    rm -r ${lock_file}

    # 処理
    cd ${WORKDIR}
    touch ${LOG}
    echo '== shutdown! ==================================================================================' >> ${LOG}
    date >> ${LOG}
    docker-compose down
    ps -ef | grep docker >> ${LOG}
    echo '*** shutdown complete! ***' >> ${LOG}
}

case "$1" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    *)
        echo "Usage: $0 {start|stop}"
    ;;
esac

exit 0

 

LOGとWORKDIRのパスは使用している一般ユーザ名に修正すること。

 

スクリプトに実行権を付与する。

$ sudo chmod 755 /etc/init.d/Docker-Compose-Mirakurun-EPGStation.sh

 

シャットダウン時、再起動時に終了スクリプトを実行するよう、rc0.drc6.dにシンボリックリンクを登録する。同様に、スタートアップ時に起動スクリプトを実行するようrc3.drc5.dにシンボリックリンクを登録する。

$ sudo ln -s /etc/init.d/Docker-Compose-Mirakurun-EPGStation.sh /etc/rc0.d/K00Docker-Compose-Mirakurun-EPGStation
$ sudo ln -s /etc/init.d/Docker-Compose-Mirakurun-EPGStation.sh /etc/rc6.d/K00Docker-Compose-Mirakurun-EPGStation
$ sudo ln -s /etc/init.d/Docker-Compose-Mirakurun-EPGStation.sh /etc/rc3.d/S99Docker-Compose-Mirakurun-EPGStation
$ sudo ln -s /etc/init.d/Docker-Compose-Mirakurun-EPGStation.sh /etc/rc5.d/S99Docker-Compose-Mirakurun-EPGStation

 

再起動して動作を確認する。

$ cat ~/docker/docker-mirakurun-epgstation/auto-start-stop.log
== shutdown! ==================================================================================
2021年  2月  2日 火曜日 13:33:10 JST
root        2798    2634  0 13:33 ?        00:00:00 grep docker
*** shutdown complete! ***
== startup! ===================================================================================
2021年  2月  2日 火曜日 13:33:32 JST
         Name                   Command           State           Ports
--------------------------------------------------------------------------------
docker-mirakurun-epgst   npm start                Up      0.0.0.0:8888->8888/tcp
ation_epgstation_1                                        ,
                                                          0.0.0.0:8889->8889/tcp
docker-mirakurun-        docker-entrypoint.sh     Up      0.0.0.0:40772->40772/t
epgstation_mirakurun_1   ./doc ...                        cp,
                                                          0.0.0.0:9229->9229/tcp
docker-mirakurun-        docker-entrypoint.sh     Up      3306/tcp
epgstation_mysql_1       mysql ...
*** startup complete! ***

もし、シャットダウンに失敗している(docker関連のプロセスが残ったままになっている)と、*** shutdown complete! ***の前の行の部分が以下のように出力されます。

== shutdown! ==================================================================================
2021年  2月  2日 火曜日 13:17:42 JST
root         933       1  0 12:39 ?        00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root        1417     933  0 12:39 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8889 -container-ip 172.18.0.2 -container-port 8889
root        1432     933  0 12:39 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8888 -container-ip 172.18.0.2 -container-port 8888
root        1475     933  0 12:39 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 40772 -container-ip 172.18.0.4 -container-port 40772
root        1505     933  0 12:39 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 9229 -container-ip 172.18.0.4 -container-port 9229
root        1604    1544  0 12:39 ?        00:00:00 /bin/bash ./docker/container-init.sh
root        2830    2825  0 13:17 ?        00:00:00 grep docker

こうなるときは、WORKDIRが違う(一般ユーザ名の違い、docker-mirakurun-epgstationのインストールパスの違い、など)ことが考えられるので再度チェックしてください。

また、本稿はUbuntu20.04.1LTSを基準にしているため、他のディストリビューションのLinuxや、バージョン違いなどで異なる部分があるかもしれないので、環境に合わせて調査をお願いします。

 

WindowsPCから録画ディレクトリを参照するためのsamba設定

前述のインストール手順の冒頭でsambaはインストール済みのため、設定ファイルの修正から実施します。

一部、ユーザー名のパス部分等はよしなに書き換えてください。

$ sudo cp -p /etc/samba/smb.conf /etc/samba/smb.conf.org
$ sudo view /etc/samba/smb.conf
$ diff /etc/samba/smb.conf /etc/samba/smb.conf.org
26,28d25 ※以下2行を[global]の項目内に追記する(26行目辺り)
< dos charset = CP932
< unix charset = UTF-8
<
43d39 ※ネットワークアドレスやインターフェース名は「ip address show」コマンドで自身の環境のものを調べて修正する(元々コメントアウトされている項目)
<    interfaces = 192.168.69.0/24 ens160
51d46 ※コメントアウト外す
<    bind interfaces only = yes
248,254d242 ※以下を最終行に追記する。パラメータの意味はggrks。
< [TV-Recorded]
<    comment = Mirakurun + EPGStation recorded directory
<    path = /home/xxxxx/docker/docker-mirakurun-epgstation/recorded/
<    read only = no
<    create mode = 0777
<    directory mode = 0777
<    guest ok = yes

confファイルのチェック。

$ sudo testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK. ←※編集したconfファイルにミスがないか確認する
(略)

自動起動設定をして、smbを起動する。

$ sudo systemctl enable smbd nmbd
$ sudo systemctl start smbd nmbd
$ sudo systemctl status smbd nmbd

共有するフォルダの属性を変更する。(これをしておかないと、WindowsPCから書き込みしようとした際にエラーが出る)

$ sudo chmod ugo+rwx ~/docker/docker-mirakurun-epgstation/recorded

WindowsPCから接続し、録画データが読み取れることと、書き込みができること(適当にテキストファイルを作成など)を確認する。

おわりに

はい、ざっとここまでで無事構築が完了です。

EPGStationが使えるようになると、スマホで録画の管理や、録画済みの番組、また放送中の番組の視聴まで出来てしまうのでかなり使い勝手が良いです。しかもPWAに対応しているので、スマホのホーム画面にショートカットを配置しておくと専用のアプリのように動作してくれるのも最高です。

あとは、宅外のネットワーク(自宅のWifiに繋がっていない環境)から自宅にVPNを張れる環境があれば、VPN接続越しに録画されたファイルを視聴したり、リアルタイムに放送中の番組を視聴できます。この点、DLNAサーバのようにVPN経由で使えなかったりするややこしい話がないというのはとてもありがたいですね!

…と言うわけで、せっかく導入するなら利便性も考えて上位モデルPX-Q3U4をオススメします!

参考サイト

以下、参考にしたサイト。(メモ)

 

サーバ関連カテゴリの最新記事