本記事は 2021年4月現在のもので、少し内容も古くなっています。2023年2月時点の環境に合わせてリライトした記事をお読みください。
これより下は古い内容であることをご了承いただきたい。
毎週テレビの録画機能でモルカーを録画していたが、テレビと外付けHDDの相性の問題からか短時間の番組の場合うまく録画できないことが続いていた。モルカーの録画失敗の痛手から立ち直れず Raspberry Pi 4 Model B *1 で録画サーバーを構築した。
録画サーバーの運用を開始してから1ヶ月が経った。当初は出費を抑えるためにありもので作ったためストレージ容量がとても少なくてエンコードしては消してと日々のメンテナンスが必要になっていた。またラズパイに実装されているハードウェアエンコーダーh264_omx
を使うとlibx264
と比較して、ファイルサイズが大きくなりストレージの拡張を迫られたため、外付けHDDを別途購入して録画サーバーを構築しなおすことにした。
4月になってからも何度も録画サーバーを壊しては構築しなおしたため、最短距離で録画サーバーを構築できるように構築記事をまとめなおすことにした。
- 使用機材
- Raspberry Pi OS Lite のインストール
- ローカルPCとラズパイの疎通確認
- ラズパイの設定:ライブラリのアップデート
- ラズパイの設定:ネットワークに接続してからブートさせる
- ラズパイの設定:Vimのインストール
- ラズパイの設定:ハードウェアエンコードの有効化
- ラズパイの設定:スワップの無効化
- ラズパイの設定:ログの最小化
- PX-S1UD V2.0 チューナーのドライバのインストール
- ラズパイの設定:外付けHDDの設定をマウントする
- Dockerのインストール
- gitのインストール
- Docker Composeのインストール
- MirakurunとEPGStationのインストール
- Mirakurunのチャンネルスキャン
- トラブルシューティング:長期間稼働しているとepgstationに接続できなくなる/そもそもssh接続できなくなる
- トラブルシューティング:長期間稼働しているとPX-S1UDが認識しなくなる
- Tips: ラズパイからNASへ差分ファイルのみをコピーする
- 関連記事
上から順番に実施していくと録画サーバーが構築できるようになっている。ラスパイの楽しいところは環境を破壊しても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)」を選択する。
OSには「Raspberry Pi OS Lite (32bit)」を選択する。
(2021/05/29追記) 複数の方からコメントをいただきました。ここで選択しているのは「Raspberry Pi OS」ではなく「Raspberry Pi OS Lite」です。デスクトップ表示機能付きのRaspberry Pi OS Fullを使いたい場合はこのエントリに書かれている方法では上手くいかないのでご注意ください。
Command + Shift + X を同時に押すと Advanced options が表示される。[Enable SSH]を有効にして、pi userのパスワードを入力する。ここはあとあとの説明と合わせるために「raspberry」としておく。
[Configure wifi]を有効にする。自宅のWi-FiのSSIDとパスワードを入力する。Wifi countryを JP に設定しておく。
これでラズパイが起動後に即時Wi-Fi接続するので有線LANに繋げて作業する必要がなくなる。もちろんssh接続もできる。
あとは適切なmicroSDカードを選択して、[WRITE]ボタンをクリックするだけである。
[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]を選択する。
[Network at Boot]を選択して、ネットワーク接続後にブートするように設定する。
ラズパイの設定: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時点でのリポジトリの動作確認はできている。基本的にはカスタマイズした部分を最小限にして本流と同じ状態を維持していきたいと考えている。
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月の最初に録画サーバーを構築した時の記録は以下の通り。本記事とは内容的に被っている部分が多い。
- 録画サーバー構築① 先行例の調査と機材の購入
- 録画サーバー構築② Raspberry Pi 4の設定
- 録画サーバー構築③ Dockerを利用してMirakurunとEPGStationをインストールする
- 録画サーバー構築④ ラズパイからNASへファイルを転送する
*1:以下ラズパイと記す