PT2 と PX-Q3U4 で 12 チューナー録画サーバーを組む — Ubuntu 24.04 完全構築ガイド

Linux・サーバー構築
はじめにお読みください
本記事は、正規に受信契約したうえで、自分が正規に入手した B-CAS カードを使い、放送を私的利用の範囲で録画・視聴するための技術情報です。録画物の配布・公衆送信、B-CAS カードの不正な改変、契約していない有料放送の受信は、著作権法や不正競争防止法に抵触します。機材の破損やデータ消失を含め、実行はすべて自己責任でお願いします。

PT2 がいまだに現役でいられるのは、地デジ 2 本と BS/CS 2 本を 1 枚でまかなう素直な設計と、枯れきったドライバのおかげです。一方 PX-Q3U4 は、USB 1 本で 8 チューナーを追加できる、現在もっとも手軽な増設手段。この 2 枚を同じマシンに載せると、地上デジタル 6 本・BS/CS 6 本、合計 12 チューナーという、家庭用としては過剰なくらいの録画環境ができあがります。

問題は「同居させると設定が二重になる」ことです。デバイスファイルの命名規則が違い、ドライバの入れ方も違い、カーネルが上がるたびにどちらかが黙って死ぬ。この記事では、その面倒をまとめて片付けます。Docker は使わず、すべてホストに直接インストールしていく構成です。

この記事の前提
Ubuntu Server 24.04 LTS / Mirakurun + EPGStation / チューナー計 12 本 / 所要 2〜3 時間

STEP 00|完成する環境と機材

最初にゴールを固定します。この手順を最後まで通すと、ブラウザから番組表を開いて予約でき、キーワードでの自動録画が回り、スマートフォンからも視聴できる状態になります。

役割採用するもの備考
OSUbuntu Server 24.04 LTS (amd64)カーネル 6.8 系
チューナー Aアースソフト PT2PCI 接続。地デジ×2 / BS・CS×2
チューナー BPLEX PX-Q3U4USB 接続。地デジ×4 / BS・CS×4
カードリーダーSCR3310-NTTComPC/SC (CCID) 対応
PT2 ドライバpt1_drv(chardev 版)自前で DKMS 化して自動再ビルド
PX-Q3U4 ドライバtsukumijima/px4_drvDKMS 標準対応
デコードライブラリlibarib25tsukumijima 版(CMake)
録画コマンドrecpt1stz2012 版
チューナーサーバーMirakurun 3.9 系ポート 40772
録画管理EPGStation v2ポート 8888
Node.js20.x LTSNodeSource から導入

STEP 01|ハードウェア構成と配線

ソフトの前に、ここでつまずく人がいちばん多いポイントを潰しておきます。

PT2 は PCI であって PCI Express ではない

2010 年前後のカードなので、接続は旧来の PCI スロットです。最近のマザーボードにはまず載っていません。PCI スロットを持つ中古ワークステーション向けボードを選ぶか、PCIe→PCI 変換ブリッジ(ASMedia ASM1083 / ITE IT8892 系)を挟むことになります。ブリッジ経由は「動く個体」と「延々とドロップする個体」があるため、可能なら PCI スロット直挿しを強く推奨します。

PX-Q3U4 は付属 AC アダプタが必須

USB バスパワーだけでは 8 チューナー分の電力が足りません。付属の AC アダプタを必ず接続してください。ここを省略すると、録画中に突然ドロップが増える・デバイスが消えるという、再現性が低くて最も厄介な種類の不具合に一晩溶かすことになります。

アンテナ分配

PT2 に 2 系統(地デジ・BS/CS)、PX-Q3U4 に 2 系統。合計 4 本の入力が必要です。分配器は全端子通電型を選び、BS/CS の LNB 電源をどこから供給するかを決めておきます。ブースターや分配器側から給電しているなら、後述する --lnb 15 は付けません。

信号の流れ
アンテナ(UHF / BS・CS)
 ↓
分配器(全端子通電)
 ↓
PT2 / PX-Q3U4(計 12 チューナー)
 ↓
recpt1 + libarib25(カードリーダー SCR3310)
 ↓
Mirakurun(ポート 40772)
 ↓
EPGStation(ポート 8888)

STEP 02|Ubuntu 24.04 の初期設定

Ubuntu Server 24.04 LTS を最小構成でインストールした直後から始めます。デスクトップ版でも手順は同じです。

sudo apt update && sudo apt full-upgrade -y

sudo apt install -y \
  build-essential git curl wget unzip cmake pkg-config \
  autoconf automake libtool \
  dkms linux-headers-$(uname -r) \
  pcscd pcsc-tools libpcsclite-dev libccid \
  libudev-dev mercurial

時刻がずれていると EPG の取得と予約がまとめて狂います。systemd-timesyncd が動いていることを確認しておきましょう。

sudo timedatectl set-timezone Asia/Tokyo

# System clock synchronized: yes を確認
timedatectl status
Secure Boot に注意
DKMS でビルドした署名なしカーネルモジュールは、Secure Boot が有効なままだとロードを拒否されます。UEFI 設定で Secure Boot を無効にするのがいちばん簡単です。有効のまま使いたい場合は sudo mokutil --import /var/lib/shim-signed/mok/MOK.der で MOK 鍵を登録し、再起動時の MokManager で承認してください。

STEP 03|SCR3310-NTTCom を認識させる

SCR3310-NTTCom は CCID 準拠なので、Ubuntu 24.04 では追加ドライバなしで動きます。pcscd を起動し、B-CAS カードを正しい向き(金色の接点面を上、矢印の向きに奥まで)で挿してから確認します。

sudo systemctl enable --now pcscd pcscd.socket

# SCM Microsystems ... と出れば認識OK
lsusb | grep -i -e scm -e scr

pcsc_scan

pcsc_scan の出力に Japanese Chijou Digital B-CAS Card のような ATR 解析結果が出れば成功です。Ctrl+C で抜けてください。Waiting for the first reader... のまま止まる場合は、USB ポートを変える・USB ハブを外して直挿しにする・sudo systemctl restart pcscd を試します。

STEP 04|libarib25 のビルド

arib25ライブラリです。メンテナンスが続いている CMake ベースの tsukumijima 版を使います。

mkdir -p ~/src && cd ~/src
git clone https://github.com/tsukumijima/libarib25.git
cd libarib25
cmake .
make -j"$(nproc)"
sudo make install
sudo ldconfig

# /usr/local/bin/arib-b25-stream-test と出れば成功
which arib-b25-stream-test

/usr/local/bin/arib-b25-stream-test/usr/local/lib/libarib25.so が入ります。この arib-b25-stream-test は、あとで Mirakurun の decoder として使います。

STEP 05|recpt1 のビルド

実際にチューナーを叩く録画コマンドです。PT2 の /dev/pt1video* と PX-Q3U4 の /dev/px4video* は、どちらもこの 1 本の recpt1 で扱えます。ここが「2 枚を同居させても設定が破綻しない」最大の理由です。

cd ~/src
git clone https://github.com/stz2012/recpt1.git
cd recpt1/recpt1
./autogen.sh
./configure --enable-b25
make -j"$(nproc)"
sudo make install

recpt1 --version
ポイント
--enable-b25 を付けると recpt1 --b25 が使えるようになります。Mirakurun 側では decoder にデコード処理を任せるため本番では --b25 を付けませんが、切り分け用の単体テストで必ず役に立つのでビルドしておきます。

STEP 06|PT2 ドライバを DKMS 化する

ここが PT2 側の山場です。Ubuntu のカーネルには earth-pt1 という DVB 版の PT1/PT2 ドライバが最初から入っており、放っておくとこれがカードを掴んでしまいます。recpt1 が使う chardev 版 pt1_drv と競合するので、先にブラックリストへ登録します。

sudo tee /etc/modprobe.d/blacklist-earth-pt1.conf >/dev/null <<'EOF'
blacklist earth-pt1
blacklist earth-pt3
EOF

sudo update-initramfs -u

ソースの取得

PT1/PT2 の chardev ドライバの原典は honeyplanet の Mercurial リポジトリです。近年は GitHub 上のミラー/フォークを使うのが一般的になっています。

cd ~/src

# 原典(Mercurial)
hg clone http://hg.honeyplanet.jp/pt1/

# 上記が落ちている場合は GitHub 上のミラー/フォークを利用する
# 例: git clone https://github.com/stz2012/pt1.git
リポジトリ URL について
PT1/PT2 ドライバはミラーが移り変わりやすく、上記の URL が将来も生きている保証はありません。取得に失敗したら「pt1_drv chardev」で検索し、driver/ ディレクトリに pt1_drv.cMakefile を含むリポジトリを探してください。入手元が変わっても、以降の手順はそのまま通用します。

まず手動ビルドで通す

DKMS 化する前に、素の状態でビルドが通るか確かめます。ここで失敗するなら DKMS でも失敗します。

cd ~/src/pt1/driver
make
sudo make install
sudo modprobe pt1_drv

# /dev/pt1video0 〜 /dev/pt1video3 の 4 本が出れば成功
ls -l /dev/pt1video*

DKMS に登録してカーネル更新に備える

PT2 のドライバは DKMS に対応していないため、dkms.conf を自分で書きます。プロジェクト側 Makefile の変数名に依存しないよう、kbuild を直接呼ぶ形にしておくのが安全です。

PT1_VER=1.0
sudo mkdir -p /usr/src/pt1_drv-${PT1_VER}
sudo cp -a ~/src/pt1/driver/. /usr/src/pt1_drv-${PT1_VER}/

sudo tee /usr/src/pt1_drv-${PT1_VER}/dkms.conf >/dev/null <<EOF
PACKAGE_NAME="pt1_drv"
PACKAGE_VERSION="${PT1_VER}"
BUILT_MODULE_NAME[0]="pt1_drv"
DEST_MODULE_LOCATION[0]="/kernel/drivers/misc"
MAKE[0]="make -C /lib/modules/\${kernelver}/build M=\${dkms_tree}/\${PACKAGE_NAME}/\${PACKAGE_VERSION}/build modules"
CLEAN="make -C /lib/modules/\${kernelver}/build M=\${dkms_tree}/\${PACKAGE_NAME}/\${PACKAGE_VERSION}/build clean"
AUTOINSTALL="yes"
EOF

sudo dkms add     pt1_drv/${PT1_VER}
sudo dkms build   pt1_drv/${PT1_VER}
sudo dkms install pt1_drv/${PT1_VER}
sudo dkms status

dkms statuspt1_drv/1.0, 6.8.x-xx-generic, x86_64: installed と表示されれば、以後カーネルが更新されても自動で再ビルドされます。

最後に、root 以外のユーザーからも叩けるよう udev ルールを入れておきます。

sudo tee /etc/udev/rules.d/99-pt1.rules >/dev/null <<'EOF'
KERNEL=="pt1video*", GROUP="video", MODE="0660"
EOF

sudo usermod -aG video "$USER"
sudo udevadm control --reload && sudo udevadm trigger

STEP 07|px4_drv で PX-Q3U4 を動かす

PLEX 公式ドライバは使いません。tsukumijima/px4_drv は、非公式ながら新しいカーネルへの追従が続いており、DKMS に最初から対応しているのが最大の利点です。カーネルが上がっても手動で入れ直す必要がありません。

ファームウェアの抽出

PX-Q3U4 は起動時に IT9305E 用ファームウェアを必要とします。これは Windows 用公式ドライバから抜き出します(PX-W3U4 用の配布物に同じものが入っています)。

cd ~/src
git clone https://github.com/tsukumijima/px4_drv.git
cd px4_drv/fwtool

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/x64/PXW3U4.sys

make
./fwtool PXW3U4.sys it930x-firmware.bin

sudo mkdir -p /lib/firmware
sudo cp it930x-firmware.bin /lib/firmware/
配布 URL が変わることがあります
PLEX 公式サイトのファイル名・パスは改訂されることがあります。wget が 404 になったら、PLEX のサポートページから PX-W3U4 用 BDA ドライバ(64bit)をダウンロードし、その中の PXW3U4.sysfwtool に渡してください。抽出後の it930x-firmware.bin は PX-W3U4 / Q3U4 / W3PE4 / Q3PE4 で共通です。

DKMS でインストール

リポジトリ直下に dkms.conf が同梱されています。バージョン番号を直書きすると更新時にズレるので、dkms.conf から読み取る形にしておくと事故がありません。

cd ~/src/px4_drv
PX4_VER=$(grep -oP 'PACKAGE_VERSION="\K[^"]+' dkms.conf)
echo "px4_drv version: ${PX4_VER}"

sudo cp -a ~/src/px4_drv /usr/src/px4_drv-${PX4_VER}
sudo dkms add     px4_drv/${PX4_VER}
sudo dkms install px4_drv/${PX4_VER}

sudo modprobe px4_drv
sudo dkms status

USB を挿し直すか再起動すると、デバイスファイルが生えます。

ls -l /dev/px4video*
dmesg | grep -i px4 | tail -n 20
確認しておくこと
px4_drv のデバイス番号の割り当ては機種によって異なります。PX-Q3U4 は内部的に PX-W3U4 が 2 組入った構成で、一般的には px4video0/1px4video4/5 が ISDB-S(BS・CS)、px4video2/3px4video6/7 が ISDB-T(地デジ)になります。次の STEP で必ず実測して確定させてください。この対応表が 1 つずれるだけで「BS だけ全部失敗する」状態になります。

STEP 08|デバイス確認と録画テスト

Mirakurun を入れる前に、コマンドラインで 12 本すべてが録れることを確認します。ここを飛ばすと、後で「Mirakurun の設定ミスなのかハードの問題なのか」が切り分けられなくなります。

デバイス割り当て表(想定)

デバイスファイルカード種別
/dev/pt1video0PT2ISDB-S(BS・CS)
/dev/pt1video1PT2ISDB-S(BS・CS)
/dev/pt1video2PT2ISDB-T(地デジ)
/dev/pt1video3PT2ISDB-T(地デジ)
/dev/px4video0PX-Q3U4ISDB-S(BS・CS)
/dev/px4video1PX-Q3U4ISDB-S(BS・CS)
/dev/px4video2PX-Q3U4ISDB-T(地デジ)
/dev/px4video3PX-Q3U4ISDB-T(地デジ)
/dev/px4video4PX-Q3U4ISDB-S(BS・CS)
/dev/px4video5PX-Q3U4ISDB-S(BS・CS)
/dev/px4video6PX-Q3U4ISDB-T(地デジ)
/dev/px4video7PX-Q3U4ISDB-T(地デジ)

単体テスト

地デジは物理チャンネル番号(例: 東京の NHK 総合なら 27)、BS は BS15_0 のような論理指定で叩きます。10 秒録って、ファイルサイズが数十 MB になっていれば成功です。

# PT2 地デジ(物理ch 27 を 10 秒)
recpt1 --device /dev/pt1video2 --b25 --strip 27 10 /tmp/t_pt2.ts

# PT2 BS(分配器側から給電しているなら --lnb 15 は外す)
recpt1 --device /dev/pt1video0 --lnb 15 --b25 --strip BS15_0 10 /tmp/s_pt2.ts

# PX-Q3U4 地デジ
recpt1 --device /dev/px4video2 --b25 --strip 27 10 /tmp/t_px4.ts

# PX-Q3U4 BS
recpt1 --device /dev/px4video0 --lnb 15 --b25 --strip BS15_0 10 /tmp/s_px4.ts

ls -lh /tmp/*.ts

実行中に Recording... と受信レベル(dB)が表示されます。地デジで 20dB 以上、BS で 10dB 以上あれば実用範囲です。数 KB のファイルしかできない場合はチャンネル指定かアンテナ、b25 decode failed が出る場合はカードリーダー側の問題です。

全 12 本を一気に確かめるなら、次のワンライナーが便利です。

for d in /dev/pt1video2 /dev/pt1video3 /dev/px4video2 /dev/px4video3 \
         /dev/px4video6 /dev/px4video7; do
  echo "=== $d (GR) ==="
  recpt1 --device $d --b25 --strip 27 5 /tmp/chk.ts >/dev/null 2>&1
  ls -l /tmp/chk.ts | awk '{print $5" bytes"}'
done

STEP 09|Node.js のインストール

Mirakurun と EPGStation はどちらも Node.js アプリです。Ubuntu 標準リポジトリのものではバージョンが古いことがあるため、NodeSource から 20.x LTS を入れます。

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs

node -v    # v20.x.x
npm -v

STEP 10|Mirakurun のセットアップ

Mirakurun は 12 本のチューナーを 1 つの HTTP API に束ねてくれるサーバーです。「どの番組をどのチューナーで受けるか」の排他制御を全部引き受けてくれるので、EPGStation 側はチューナーの存在を意識しなくて済みます。

sudo npm install pm2 -g
sudo pm2 startup

sudo npm install mirakurun -g --unsafe-perm --production

sudo mirakurun status

設定ファイルは /usr/local/etc/mirakurun/ に置かれます。

ファイル役割
server.yml待ち受けポート・ログレベルなどサーバー設定
tuners.ymlチューナーの定義(今回いちばん重要)
channels.ymlチャンネル定義。スキャンで自動生成できる

LAN 内の他端末から EPGStation 経由でアクセスする構成なら、Mirakurun 自体は localhost だけで十分です。必要に応じて server.yml を編集します。

port: 40772
logLevel: 2
highWaterMark: 25165824
overflowTimeLimit: 30000
maxBufferBytesBeforeReady: 8388608
eventEndTimeout: 1000

STEP 11|12 チューナーの定義とスキャン

tuners.yml に 12 本すべてを書き下します。PT2 と PX-Q3U4 が同じ recpt1 で扱えるので、--device の値が違うだけの、ほぼコピペで済む定義になります。

編集は sudo mirakurun config tuners、または直接エディタで開きます。

# ============ PT2 (PCI) ============
- name: PT2-S0
  types: [BS, CS]
  command: recpt1 --device /dev/pt1video0 --lnb 15 <channel> - -
  decoder: arib-b25-stream-test -v 0
  isDisabled: false

- name: PT2-S1
  types: [BS, CS]
  command: recpt1 --device /dev/pt1video1 --lnb 15 <channel> - -
  decoder: arib-b25-stream-test -v 0
  isDisabled: false

- name: PT2-T0
  types: [GR]
  command: recpt1 --device /dev/pt1video2 <channel> - -
  decoder: arib-b25-stream-test -v 0
  isDisabled: false

- name: PT2-T1
  types: [GR]
  command: recpt1 --device /dev/pt1video3 <channel> - -
  decoder: arib-b25-stream-test -v 0
  isDisabled: false

# ============ PX-Q3U4 (USB) ============
- name: Q3U4-S0
  types: [BS, CS]
  command: recpt1 --device /dev/px4video0 <channel> - -
  decoder: arib-b25-stream-test -v 0
  isDisabled: false

- name: Q3U4-S1
  types: [BS, CS]
  command: recpt1 --device /dev/px4video1 <channel> - -
  decoder: arib-b25-stream-test -v 0
  isDisabled: false

- name: Q3U4-S2
  types: [BS, CS]
  command: recpt1 --device /dev/px4video4 <channel> - -
  decoder: arib-b25-stream-test -v 0
  isDisabled: false

- name: Q3U4-S3
  types: [BS, CS]
  command: recpt1 --device /dev/px4video5 <channel> - -
  decoder: arib-b25-stream-test -v 0
  isDisabled: false

- name: Q3U4-T0
  types: [GR]
  command: recpt1 --device /dev/px4video2 <channel> - -
  decoder: arib-b25-stream-test -v 0
  isDisabled: false

- name: Q3U4-T1
  types: [GR]
  command: recpt1 --device /dev/px4video3 <channel> - -
  decoder: arib-b25-stream-test -v 0
  isDisabled: false

- name: Q3U4-T2
  types: [GR]
  command: recpt1 --device /dev/px4video6 <channel> - -
  decoder: arib-b25-stream-test -v 0
  isDisabled: false

- name: Q3U4-T3
  types: [GR]
  command: recpt1 --device /dev/px4video7 <channel> - -
  decoder: arib-b25-stream-test -v 0
  isDisabled: false
LNB 電源は一箇所から
上の例では PT2 側だけに --lnb 15 を付けています。複数のチューナーから同時に給電すると、機器によっては不安定になったり保護回路が働いたりします。分配器やブースターから給電しているなら、すべての行から --lnb 15 を外してください

チャンネルスキャン

channels.yml は手書きせず、Mirakurun のスキャン API に作らせます。地デジは全物理チャンネルを順に試すため 10〜20 分かかります。

sudo mirakurun restart
sleep 10

# 地上デジタル
curl -X PUT "http://localhost:40772/api/config/channels/scan?type=GR"

# BS(既存定義を残したまま追記する場合)
curl -X PUT "http://localhost:40772/api/config/channels/scan?type=BS&refresh=false"

# CS
curl -X PUT "http://localhost:40772/api/config/channels/scan?type=CS&refresh=false"

sudo mirakurun restart

完了したら、サービス一覧が取れるか確認します。

curl -s http://localhost:40772/api/status | head -n 40
curl -s http://localhost:40772/api/services | grep -o '"name":"[^"]*"' | head -n 30
curl -s http://localhost:40772/api/tuners | grep -o '"name":"[^"]*"'

/api/tuners に 12 本すべての名前が並べば、チューナー側の作業は完了です。

STEP 12|EPGStation のセットアップ

番組表・予約・ルール録画・視聴を担当する Web アプリです。root で動かす必要はないので、通常ユーザーのホームに置きます。

cd ~
git clone https://github.com/l3tnun/EPGStation.git
cd EPGStation

npm run all-install
npm run build

ビルドには数分かかります。続いて設定ファイルをテンプレートから作成します。

cp config/config.yml.template config/config.yml
cp config/operatorLogConfig.sample.yml   config/operatorLogConfig.yml
cp config/epgUpdaterLogConfig.sample.yml config/epgUpdaterLogConfig.yml
cp config/serviceLogConfig.sample.yml    config/serviceLogConfig.yml

録画先ディレクトリを用意します。システムディスクとは別の HDD を割り当てるのが定石です。

sudo mkdir -p /mnt/recorded /mnt/recorded/tmp
sudo chown -R "$USER":"$USER" /mnt/recorded
df -h /mnt/recorded

config/config.yml の要点だけ書き換えます。まずは SQLite で動かし、必要になってから MySQL に移行するのが無難です。

port: 8888
socketioPort: 8888
clientSocketioPort: 8888

mirakurunPath: http://localhost:40772

dbtype: sqlite

epgUpdateIntervalTime: 10
conflictPriority: 1
recPriority: 2

isEnabledDropCheck: true

recorded:
  - name: recorded
    path: '/mnt/recorded'

recordedTmp: '/mnt/recorded/tmp'

recordedFormat: '%YEAR%%MONTH%%DAY%_%HOUR%%MIN%-%TITLE%'
cd ~/EPGStation
npm start

エラーが出なければ、別の端末から http://<サーバーのIP>:8888/ を開きます。番組表が空でも慌てないでください。EPG は取得に時間がかかるため、しばらく(放送波の EPG 周期に依存して数分〜数十分)待つと埋まります。Ctrl+C で一度止めます。

STEP 13|自動起動と運用設定

Mirakurun は PM2 の管理下に入っているので、sudo pm2 save で起動時復帰します。EPGStation は systemd ユニットにしておくと、依存関係とログの扱いが素直になります。

sudo pm2 save
sudo pm2 list
sudo tee /etc/systemd/system/epgstation.service >/dev/null <<EOF
[Unit]
Description=EPGStation
After=network-online.target pm2-root.service
Wants=network-online.target

[Service]
Type=simple
User=${USER}
WorkingDirectory=${HOME}/EPGStation
ExecStart=/usr/bin/npm start
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now epgstation
systemctl status epgstation --no-pager

ログの確認は次のとおりです。

# EPGStation
journalctl -u epgstation -f

# Mirakurun
sudo mirakurun log server
sudo tail -f /usr/local/var/log/mirakurun.stdout.log
最後に一度、再起動テストを
sudo reboot したあと、何も操作せずに ls /dev/pt1video* /dev/px4video* で 12 本のデバイスが揃い、http://<IP>:8888/ が開くことを確認してください。ここまで通れば構築は完了です。DKMS のおかげで、カーネル更新後も同じ状態が保たれます。

トラブルシューティング

再起動したらチューナーが 1 本も見えなくなった

まず sudo dkms status カーネル更新後にビルドが失敗していると、ここに added のまま残ります。sudo dkms autoinstall で再ビルドし、失敗するなら sudo apt install linux-headers-$(uname -r) でヘッダが入っているか確認してください。Secure Boot を有効にしたまま UEFI 設定を触った場合も、この症状になります。

/dev/px4video* が生成されない

dmesg | grep -i px4 を確認します。firmware: failed to load it930x-firmware.bin と出ていれば、STEP 07 のファームウェア配置が漏れています。ls -l /lib/firmware/it930x-firmware.bin で存在を確認し、置いたあとで USB を挿し直してください。

/dev/pt1video* が生成されない

lsmod | grep -e pt1 -e earth を確認します。earth_pt1 がロードされていれば、ブラックリスト(STEP 06)が効いていません。/etc/modprobe.d/ のファイル名は必ず .conf で終わらせ、sudo update-initramfs -u のあと再起動が必要です。

録画はできるが再生すると真っ黒/b25 decode failed

スクランブルが解けていません。pcsc_scan でカードが見えるか、カードの向きが正しいかを確認します。pcscd が落ちていることもあるので systemctl status pcscd も見てください。カードリーダーを USB ハブ経由にしている場合は直挿しに変えると直ることがあります。

BS/CS だけ受信できない

LNB 電源です。分配器やブースターから給電していないなら、recpt1--lnb 15 が必要です。逆に、すでに他機器から給電されている状態で複数チューナーから重ねて給電すると不安定になります。給電元は必ず 1 箇所に統一してください。

PX-Q3U4 でだけドロップが多発する

順に潰します。①付属 AC アダプタを接続しているか。②USB 3.0 ポートで不安定なら USB 2.0 ポートに変えてみる(IT9305E は USB 2.0 デバイスです)。③8 本同時録画時は瞬間的な書き込み帯域が問題になるので、録画先を SMR ではない HDD か SSD にする。④それでも残るなら、後述のモジュールパラメータを調整します。

番組表がいつまでも埋まらない

EPG は放送波から少しずつ流れてくるため、初回は時間がかかります。まず curl -s http://localhost:40772/api/status で Mirakurun 側の EPG 取得が進んでいるか確認してください。Mirakurun 側が空なら、原因は EPGStation ではなくチューナーかチャンネル定義です。

EPGStation が起動しない

journalctl -u epgstation -n 50 --no-pager を読みます。config.yml の YAML インデント崩れが最頻出の原因です。次に多いのが、録画先ディレクトリの権限不足(chown 漏れ)と、npm run build の実行忘れです。

安定運用のためのチューニング

px4_drv のモジュールパラメータ

多重録画時のドロップが減らない場合は、転送バッファ関連のパラメータを調整します。値は環境依存なので、README の説明を読んだうえで少しずつ変えてください。

sudo tee /etc/modprobe.d/px4_drv.conf >/dev/null <<'EOF'
options px4_drv tsdev_max_packets=2048
EOF

sudo update-initramfs -u
sudo reboot

録画ディスクの選び方

  • 地デジ 1 番組で約 7〜8GB/時、BS で 11〜13GB/時。12 本フル稼働は現実的でなくても、4〜6 本同時は普通に起こります。
  • SMR 方式の HDD は避ける。連続書き込み中にキャッシュが尽きると数秒間ストールし、そのままドロップになります。CMR を選んでください。
  • /mnt/recordedext4 で十分です。fstab には noatime を付けておくと無駄な書き込みが減ります。

設定のバックアップ

再構築が必要になったとき、この 2 つが残っていれば復旧は一瞬です。

mkdir -p ~/backup
sudo tar czf ~/backup/mirakurun-conf-$(date +%F).tar.gz /usr/local/etc/mirakurun/
tar czf ~/backup/epgstation-conf-$(date +%F).tar.gz -C ~/EPGStation config data

電源とネットワーク

録画中の停電は、ファイル破損だけでなくファイルシステム自体を痛めます。小容量でよいので UPS を挟み、nut で自動シャットダウンさせておくと安心です。またサーバーの IP は DHCP 固定割り当てにしておくと、スマートフォンからのアクセス先が変わりません。

まとめ

PT2 と PX-Q3U4 という世代もインターフェースも違う 2 枚を、recpt1 という共通の入口に揃えてしまえば、Mirakurun から先はまったく同じ扱いになります。そして両方のドライバを DKMS に載せておけば、「カーネルが上がった翌朝に録画が全滅していた」という、この趣味で最も萎える事故を防げます。

組み上がってしまえば、あとは EPGStation のルール録画にキーワードを登録していくだけです。12 チューナーあると、同時間帯の裏番組を気にする必要がなくなり、録画予約という行為そのものを忘れられるようになります。そこまで来て初めて、この構成の本当の価値がわかります。

免責事項
本記事の内容は執筆時点の情報にもとづくもので、動作を保証するものではありません。リポジトリの URL、ドライバのバージョン、公式配布ファイルの所在は予告なく変更されることがあります。本手順の実行によって生じたいかなる損害についても、筆者は責任を負いません。放送の受信・録画は、受信契約および著作権法の定める私的使用の範囲内で行ってください。

コメント

タイトルとURLをコピーしました