酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Raspberry Pi 4とdocker-mirakurun-epgstationで録画サーバーを構築する (2021年4月版)

毎週テレビの録画機能でモルカーを録画していたが、テレビと外付けHDDの相性の問題からか短時間の番組の場合うまく録画できないことが続いていた。モルカーの録画失敗の痛手から立ち直れず Raspberry Pi 4 Model B *1 で録画サーバーを構築した。

録画サーバーの運用を開始してから1ヶ月が経った。当初は出費を抑えるためにありもので作ったためストレージ容量がとても少なくてエンコードしては消してと日々のメンテナンスが必要になっていた。またラズパイに実装されているハードウェアエンコーダーh264_omxを使うとlibx264と比較して、ファイルサイズが大きくなりストレージの拡張を迫られたため、外付けHDDを別途購入して録画サーバーを構築しなおすことにした。

4月になってからも何度も録画サーバーを壊しては構築しなおしたため、最短距離で録画サーバーを構築できるように構築記事をまとめなおすことにした。

上から順番に実施していくと録画サーバーが構築できるようになっている。ラスパイの楽しいところは環境を破壊しても5分あれば再構築が可能なところである。何度も壊して遊ぼう!

使用機材

録画サーバーを構築するにあたって購入した機材は以下の通り。

本記事で紹介するのは「Raspberry Pi OS 32bit」での運用方法についてなので4GBで十分だと判断した。

将来的に64bit運用したい場合には8GBを購入しておくのもよいかもしれない。数千円でメモリが倍になるとはとても良いが先達によれば 64bit ならではの問題も多いようだ。

PX-S1UDも2台までであればラスパイのバスパワーで動作することを確認している。

Aliexpressで「vastdtv」で検索すると同等品を購入することができるらしい。3,000円ほどなので届くまでに1ヶ月ほど待てるのであればAliexpressで購入するのもアリかもしれない。プリペイド式クレカサービスの Revolut を使うと為替レートが最小で済むので個人的にオススメしたい。

当初は外付けSSDを使っていた。SSDの消費電力は少ないので、その時はラズパイ本体のバスパワーだけで安定して稼働させることができていた。

この外付けHDDに変えたところ途端にラスパイの挙動が不安定になってしまった。動くのは動くのだがいつの間にかマウントが外れていたりとまともに動かなくなってしまった。2.5インチHDDなら電力消費量も低いので大丈夫だと考えたが外部から給電が必要なようだ。Y字Wパワーケーブルを利用することで安定して稼働させることができた。

USB-Cはラズパイとの接続用、USB-Aは外付けHDD側に給電用に使っている。Y字ケーブルは安いものもあるが、逆流防止装置が付いていないので多少高くてもこの製品を使って欲しい。

NTT-Com SCR3310のOEM品が新品で購入することができる。メルカリだと1,000円くらいで販売されていることもある。以前は500円くらいで売られていたが確定申告の時期と被っているので中古でも値段が上がっているのかもしれない。

Raspberry Pi OS Lite のインストール

ラズパイはmicroSDに書き込まれたOSで動く。現在ではRaspberry Pi Imagerを使うと指定した設定とOSを書き込んでくれる。v1.6からはsshの有効化とWi-Fiの有効化もこの時点で設定できるようになった。

Raspberry Pi Imagerを公式ページからダウンロードする。2021年4月時点では v1.6.1 が最新となっている。

Raspberry Pi Imagerを起動して[CHOOSE OS]ボタンをクリックする。デスクトップ機能は不要なので「Raspberry Pi OS (other)」を選択する。

f:id:ch3cooh393:20210403083157p:plain

OSには「Raspberry Pi OS Lite (32bit)」を選択する。

(2021/05/29追記) 複数の方からコメントをいただきました。ここで選択しているのは「Raspberry Pi OS」ではなく「Raspberry Pi OS Lite」です。デスクトップ表示機能付きのRaspberry Pi OS Fullを使いたい場合はこのエントリに書かれている方法では上手くいかないのでご注意ください。

f:id:ch3cooh393:20210403083203p:plain

Command + Shift + X を同時に押すと Advanced options が表示される。[Enable SSH]を有効にして、pi userのパスワードを入力する。ここはあとあとの説明と合わせるために「raspberry」としておく。

f:id:ch3cooh393:20210403083219p:plain

[Configure wifi]を有効にする。自宅のWi-FiのSSIDとパスワードを入力する。Wifi countryを JP に設定しておく。

f:id:ch3cooh393:20210403083214p:plain

これでラズパイが起動後に即時Wi-Fi接続するので有線LANに繋げて作業する必要がなくなる。もちろんssh接続もできる。

あとは適切なmicroSDカードを選択して、[WRITE]ボタンをクリックするだけである。

f:id:ch3cooh393:20210403083224p:plain

[WRITE]ボタンをクリックすると書き込みが開始する。Lite版なので容量も少なく10分もせずに書き込みは完了する。最初の1回目はOSをダウンロードするため少し時間がかかる。

ローカルPCとラズパイの疎通確認

初回起動時は起動まで2〜3分かかる。電源投入から少し待ってから疎通確認をする。ネットワーク内にラズパイが1台だけだった場合は raspberrypi.local で接続できる。これは超便利。

ssh pi@raspberrypi.local

Raspberry Pi Imagerで設定したパスワードは raspberry を入力するとログインできる。

$ ssh pi@raspberrypi.local
The authenticity of host 'raspberrypi.local' can't be established.

... (中略)

pi@raspberrypi:~ $ 

ラズパイの設定:ライブラリのアップデート

ラスパイに初期導入されているライブラリをアップデートする。

sudo timedatectl set-timezone 'Asia/Tokyo'
sudo apt update && sudo apt upgrade -y && sudo apt install locales-all
sudo localectl set-locale 'LANG=ja_JP.UTF-8'

ラズパイの設定:ネットワークに接続してからブートさせる

通常はラズパイが起動してからネットワーク接続する流れだが、NASのドライブをマウントしている場合などはネットワークに接続してから起動して欲しい。

sudo raspi-config

[System Options]を選択する。

f:id:ch3cooh393:20210403095529p:plain

[Network at Boot]を選択して、ネットワーク接続後にブートするように設定する。

f:id:ch3cooh393:20210403095341p:plain

ラズパイの設定:Vimのインストール

ラズパイには vim-tiny が標準でインストールされているが、さくさんは vim を使うのでインストールする。

sudo apt --purge remove vim-common vim-tiny -y
sudo apt install vim -y

ラズパイの設定:ハードウェアエンコードの有効化

ラズパイは非力なのでエンコードにはハードウェアエンコーダー h264_omx を利用したい。

echo 'SUBSYSTEM=="vchiq",GROUP="video",MODE="0666"' | sudo tee /etc/udev/rules.d/10-vchiq-permissions.rules

ラズパイの設定:スワップの無効化

microSDを保護するため、スワップによるアクセスを最小化させる。

sudo swapoff --all
sudo apt remove dphys-swapfile -y
sudo sed -i 's/$/ coherent_pool=4M dwc_otg.host_rx_fifo_size=2048/' /boot/cmdline.txt
sudo sed -i 's/^CONF_SWAPSIZE=100/CONF_SWAPSIZE=1024/' /etc/dphys-swapfile
sudo apt autoremove

ラズパイの設定:ログの最小化

microSDを保護するため、ログによるアクセスを最小化させる。

sudo vim /etc/rsyslog.conf

rsyslog.conf を編集して下記を参考にしてコメントアウトする。

###############
#### RULES ####
###############

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                         /var/log/cron.log
#daemon.*                        -/var/log/daemon.log
#kern.*                          -/var/log/kern.log
#lpr.*                           -/var/log/lpr.log
#mail.*                          -/var/log/mail.log
#user.*                          -/var/log/user.log

PX-S1UD V2.0 チューナーのドライバのインストール

地上波チューナーとして「PX-S1UD」を採用している。

ドライバをインストールする。

wget http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zip
unzip PX-S1UD_driver_Ver.1.0.1.zip
sudo cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware/
rm PX-S1UD_driver_Ver.1.0.1.zip
rm -rf PX-S1UD_driver_Ver.1.0.1

下記のコマンドでチューナーデバイスが正しく認識しているかどうか確認することができる。

$ dmesg | grep PX-S1UD
[    2.424997] usb 1-1.1: Product: PX-S1UD Digital TV Tuner

ラズパイの設定:外付けHDDの設定をマウントする

録画したデータは外付けHDDに保存する。すでに外付けHDDをUSB接続しているので、ラズパイでHDDが接続されていることを認識しているか調べる。

$sudo fdisk -l

(中略)

Device      Start        End    Sectors  Size Type
/dev/sda1      40     409639     409600  200M EFI System
/dev/sda2  411648 3907028991 3906617344  1.8T Microsoft basic data

外付けHDDは /dev/sda2 として認識されていることがわかったのでマウントする。

sudo mkfs.ext4 /dev/sda2
sudo mkdir /data
sudo mount /dev/sda2 /data

さらにffmpegで h264_omx を使ってエンコードする際に支障がでないように、ユーザーが /data にアクセスできるように変更しておく。

sudo chown 1000:1000 /data

起動時に外付けHDDを自動マウントさせる

ラズパイの起動時に外付けHDDが自動でマウントさせるように設定する。まずは /dev/sda2 の UUID または PARTUUID を調べる。

$ sudo blkid /dev/sda2
/dev/sda2: UUID="82d9561e-7af8-4b7c-9d5e-fb153b102b46" TYPE="ext4" PARTUUID="66fbea03-9b65-4b0b-9928-cc4d6698c230"

/dev/sda2のPARTUUIDがわかった。

sudo vim /etc/fstab

下記を参考に fstab を編集する。

PARTUUID="66fbea03-9b65-4b0b-9928-cc4d6698c230" /data           ext4    defaults,nofail 0 0

ラズパイを再起動して、再度きちんとマウントされるか確認する。

sudo reboot

Dockerのインストール

Dockerをインストールする。

$ curl -sSL https://get.docker.com/ | CHANNEL=stable sh
$ docker -v
Docker version 20.10.5, build 55c4c88

インストールが完了したらDockerを起こしておく。

sudo systemctl enable docker

gitのインストール

gitをインストールする。

sudo apt install -y git

Docker Composeのインストール

aptコマンドでインストールする docker-compose はバージョンが古いので手元でビルドする必要がある。docker-composeの最新版は v1.28.5 だがうまくビルドできなかったので v1.27.4 をビルドすることにした。

cd /data
git clone https://github.com/docker/compose.git
cd compose
git checkout 1.27.4
sudo ./script/build/linux

ビルドが完了するまで15分くらいかかる。

cd dist
sudo cp docker-compose-Linux-armv7l /usr/local/bin/docker-compose
sudo chown root:root /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

インストールできたかどうか確認する。

$ docker-compose -v
docker-compose version 1.27.4, build 40524192

MirakurunとEPGStationのインストール

docker-mirakurun-epgstationをforkして、ラズパイ用にカスタマイズしたリポジトリを用意した。2021/04/06時点でのリポジトリの動作確認はできている。基本的にはカスタマイズした部分を最小限にして本流と同じ状態を維持していきたいと考えている。

github.com

git clone でソースコードを取得する。

cd /data
git clone https://github.com/CH3COOH/docker-mirakurun-epgstation.git
sudo chown pi:pi docker-mirakurun-epgstation

configファイルをコピーする。

cd docker-mirakurun-epgstation
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

docker-composeを使ってビルドを開始する。

cd /data/docker-mirakurun-epgstation
sudo docker-compose run --rm -e SETUP=true mirakurun
sudo docker-compose up -d

問題なければ約25分でビルドが完了して、MirakurunとEPGStationが起動する。

Mirakurunのチャンネルスキャン

放置しておけばMirakurunが勝手にチャンネルをスキャンしてくれている気もするが、たまに特定のチャンネルが抜けることがあるので、一度は明示的に呼んでおいた方がよいかもしれない。

curl -X PUT "http://raspberrypi.local:40772/api/config/channels/scan"

チャンネルスキャン後にラズパイを再起動して1時間も待てば、EPGStationで番組表が観られる状態になっている。以上で録画サーバーの構築方法は終了だ。

トラブルシューティング:長期間稼働しているとepgstationに接続できなくなる/そもそもssh接続できなくなる

原因は謎だ。冬場に発生したので熱は関係ないと思う。

1週間くらい起動しっぱなしで運用していると無線LAN接続できなくなった。有線LANで接続することでトラブルなく稼働している。

トラブルシューティング:長期間稼働しているとPX-S1UDが認識しなくなる

これも原因は謎だ。

2本接続しているPX-S1UDのうちの1本が認識されなくなった。当初はepgstationやmirakurunを疑ったが、そもそもラズパイ自身がPX-S1UDを認識できていなかった。

3週間程度の連続運用で発生したので、1週間に1回は再起動させることにした。

Tips: ラズパイからNASへ差分ファイルのみをコピーする

うちではラズパイに余計な負荷を掛けないように、NASへ録画したデータを転送して、NASのDLNAサーバー経由で動画を観ている。ラズパイからNASへ差分ファイルのみを転送する方法を紹介した。

ラズパイ側はいつでも壊れても(壊しても)良いようにこまめにバックアップするようにしたい。

関連記事

2021年3月の最初に録画サーバーを構築した時の記録は以下の通り。本記事とは内容的に被っている部分が多い。

*1:以下ラズパイと記す