KVM上に録画サーバーの構築

作成日:2021/09/25
最終更新日:2021/09/27

KVM上に録画サーバーの構築

作成日:2021/09/25
最終更新日:2021/09/27

概要

かつて録画サーバーを構築した際、仮想環境ではなく実機上に構築したため保守が非常に大変でした。今回は仮想環境上に録画サーバーを構築し、環境を切り離して運用できるようにしたいと考えました。

前提条件

録画サーバーを構築するにあたって以下のデバイスが必要になります。

  • チューナーカード
    • アースソフト PT1[1]
  • USB カードリーダー
    • SCR3310v2.0[2]

これらをKVM上で動作させるのに、CPUに仮想化支援機能があることとPCIパススルーができる必要があります。 KVMのホストに使用しているCPUがA10-7860Kなので、仮想化支援機能とPCIパススルー(IOMMU)に対応可能です。それぞれBIOSで有効化しておきます。

HOSTの設定

HOSTに物理的に接続しているチューナーカードやUSBカードリーダーをGUESTから扱えるようにします。

Kernelの起動オプションの設定

IOMMUを有効化するためにLinux Kernelに起動オプションを追加します。Intel系のCPUの場合はintel_iommu=onを、AMD系のCPUの場合はamd_iommu=onを設定します[3]。UbuntuにおいてKernelの起動オプションを設定するには以下の手順で行います[4]。実行後、問題がなければ再起動します。

コマンド1. Kernelの起動オプションの編集
sudo vi /etc/default/grub # GRUB_CMDLINE_LINUX に amd_iommu=on を追加する
sudo mv /boot/grub/grub.cfg /boot/grub/grub.cfg.org
sudo grub-mkconfig -o /boot/grub/grub.cfg
sudo reboot

デバイスドライバの無効化

PT1のデバイスドライバを無効化します。lspciコマンドでデバイスドライバとなるKernelモジュールを特定し、/etc/modprove.d/blacklist.confに登録します。登録後再起動し、Kernelモジュールが読み込まれていないことを確認します。

コマンド2. デバイスドライバの無効化
# PT1のデバイスを特定
 lspci | grep Xilinx
(ここから)
03:05.0 Multimedia controller: Xilinx Corporation Device 222a (rev 01)
(ここまで)
lspci -n | grep ^03:05.0
(ここから)
03:05.0 0480: 10ee:222a (rev 01)
(ここまで)
# PT1のドライバとKernelモジュールを特定
lspci -v -d 10ee:222a | grep Kernel
(ここから)
	Kernel driver in use: earth-pt1
	Kernel modules: earth_pt1
(ここまで)
# PT1のドライバを無効化
sudo vi /etc/modprove.d/blacklist.conf
(ここから)
blacklist earth_pt1 # これを末尾に追記
(ここまで)
lsmod | grep earth
(ここから)
earth_pt1              24576  0
dvb_core              143360  2 tc90522,earth_pt1
(ここまで)
sudo reboot
lsmod | grep earth
(ここから)
# 何も表示されないこと
(ここまで)

GUESTにPCIデバイスとUSBデバイスを追加

PT1は先程lspciでデバイスを特定しました。しかし、SCR3310v2.0はまだ特定していません。USBデバイスを特定する際にはlsusbコマンドを使用します。特定したID 04e6:5116 のうち、 04e6 が Vendor ID、 5116 が Product IDになります。

コマンド3. USBカードリーダーの探索
lsusb | grep SCR
(ここから)
Bus 003 Device 002: ID 04e6:5116 SCM Microsystems, Inc. SCR331-LC1 / SCR3310 SmartCard Reader
(ここまで)

PT1は 03:05.0 から、03 が Bus、 05 が Slot、 0 がFunctionになります。これらの情報をKVMのGUESTに追記します。

コマンド4. GUESTの編集
virsh edit guest

編集内容としては以下になります。

ソース1. GUESTの編集内容
# 以下の内容を<devices></devices>の間に追記します。
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address domain='0x0000' bus='0x03' slot='0x05' function='0x0'/>
      </source>
    </hostdev>
    <hostdev mode='subsystem' type='usb' managed='no'>
      <source startupPolicy='optional'>
        <vendor id='0x04e6'/>
        <product id='0x5116'/>
      </source>
    </hostdev>

GUESTの設定

GUESTに録画サーバーを構築します。各種ドライバ[5][6]やテレビ放送受信サーバー[7]、録画サーバー[8]を参考文献を基に構築します。GUESTにはUbuntu Server 20.04.3 LTSを用いました。概ね「PT2録画ドライバ[5]」を参考に構築しましたが、ドライバ周りは「PT2への移行[6]」の内容に沿った形でないと録画されませんでした。

B-CASカード対応

まずは、B-CASカードを読み取れるようにします。インストール後、pcsc_scanコマンドを実行し、 Japanese Chijou Digital B-CAS Card と表示されれば問題ありません。表示を確認後 Ctrl + C で終了します。

コマンド5. B-CASカードを読み取れるようにする
sudo apt install pcscd pcsc-tools
pcsc_scan

GUESTのデバイスドライバの無効化

デバイスドライバの無効化の項と同様にGUESTもデバイスドライバを無効化します。

コマンド6. 既存のドライバを無効化する
sudo rmmod earth_pt1
sudo vi /etc/modprobe.d/blacklist.conf
(ここから)
blacklist earth_pt1
(ここまで)

各種開発ツールの導入

録画サーバーを構築するにあたって必要なツールをインストールします。何度かやり直しているため、不要なツールがある可能性もあります。

コマンド7. 各種開発ツールを導入する
sudo apt install autoconf build-essential cmake curl git libssl-dev libtool \
libboost-all-dev pkg-config yasm mercurial libpcsclite-dev ffmpeg \
libavformat-dev libdlna-dev libupnp-dev pkg-config linux-headers-`uname -r`

地上波デジタル放送対応

地上波デジタル放送を復号するために、libarib25を導入します。

コマンド8. 地上波デジタル放送を復号できるようにする
mkdir ~/arib25
cd ~/arib25
git clone https://github.com/stz2012/libarib25.git
cd libarib25/
cmake .
make
sudo make install
sudo /sbin/ldconfig
cd

PT1用ドライバと録画ツールの導入

PT1用のドライバと録画ツールを導入します。まずは、ドライバを導入した上で録画ツールを導入します。

コマンド9. PT1のドライバや録画ツールを導入する
wget http://hg.honeyplanet.jp/pt1/archive/tip.tar.bz2
tar xvf tip.tar.bz2 
cd pt1-17b4f7b5dccb/driver/
make all
sudo make install
sudo modprobe pt1_drv
cd
cd pt1-17b4f7b5dccb/recpt1/
./autogen.sh
./configure --enable-b25
make
sudo make install
sudo reboot

録画サーバーの構築

録画サーバーを構築していきます。まずは、各種ツールを動かすために必要なNode.jsをインストールします。

コマンド10. Node.jsの導入
sudo apt install curl
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt install -y nodejs
sudo npm install n -g

Node.jsアプリケーションのプロセス管理を行うためにPM2をインストールします。

コマンド11. PM2の導入
sudo npm install pm2 -g

テレビ放送受信サーバーのMirakurunをインストールします。

コマンド12. Mirakurunの導入
sudo npm install mirakurun -g --unsafe-perm --production
sudo npm install mirakurun -g --production
sudo mirakurun init 
sudo mirakurun restart

Mirakurunのクライアントとして動作するRivarunをインストールします。

コマンド13. Rivarunの導入
sudo npm install rivarun -g
sudo npm install arib-b25-stream-test -g --unsafe
sudo mirakurun restart

Mirakurunの設定を変更し、

serverで、Mirakurun自体の設定をします。使用するポート番号やログの設定をしますがデフォルトのままで特に問題はなさそうです。

tunersでPT1との接続設定をします。BS、CS放送用のチューナーの有効化と地上波デジタル放送(GR)用のチューナーを有効化するために「 isDisabled: false」を追加します。

channelsで受信するチャネルを修正します。地域に合わせて修正が必要です。

コマンド14. Mirakurunの設定変更
sudo EDITOR=vim mirakurun config server
sudo EDITOR=vim mirakurun config tuners
sudo EDITOR=vim mirakurun config channels
sudo mirakurun restart

logrotateの設定をしておきます。

コマンド15. logrotateの設定
sudo pm2 install pm2-logrotate
sudo vi /etc/logrotate.d/mirakurun

Mirakurun用のlogrotateの設定ファイルは以下のようにします。

ソース2. Mirakurunのlogrotateの設定
/usr/local/var/log/mirakurun.stdout.log
/usr/local/var/log/mirakurun.stderr.log
{
        daily
        compress
        rotate 7
        missingok
        notifempty
}

録画サーバーのUIとして動作するChinachuをインストールします。

コマンド16. Chinachuの導入
git clone -b gamma git://github.com/kanreisa/Chinachu.git ~/chinachu
cd ~/chinachu
./chinachu installer
echo "[]" > rules.json
cp config.sample.json config.json
vi config.json
sudo vi /etc/logrotate.d/chinachu
cd ~/chinachu
./chinachu service wui execute
sudo pm2 start processes.json
sudo pm2 status
sudo pm2 save

Chinachu用のlogrotateの設定ファイルは以下のようにします。

ソース3. Chinachuのlogrotateの設定
/usr/local/var/log/chinachu-operator.stderr.log
/usr/local/var/log/chinachu-operator.stdout.log
/usr/local/var/log/chinachu-wui.stderr.log
/usr/local/var/log/chinachu-wui.stdout.log
{
        daily
        compress
        rotate 28
        missingok
        notifempty
}

Chinachuへのアクセス

http://GUESTのIPアドレス:20772/ へアクセスするとChinachuにアクセスできます。

まとめ

  • KVM環境のGUEST上に録画サーバーを構築した。
  • GUESTで扱うためには、CPUの仮想化支援機能と、PCIパススルーの有効化が必要。
  • PT1やPT2の動作例から、再現可能な方法を見つけるのに試行錯誤した。

参考文献

  1. 有限会社アースソフト, PT1/PT2 共通目次, libvirt, 2008-2019
  2. Identiv, Inc., SCR3310v2.0 USBスマートカードリーダー, Identiv, 2021
  3. ArchWiki:メンテナンスチーム, OVMF による PCI パススルー, ArchWiki, 2016-2021
  4. 西村めぐみ, 【 grub2-mkconfig/grub-mkconfig 】コマンド――GRUB 2の起動メニューを生成する, @IT, 2019
  5. kazu99, PT2録画ドライバ, Memorandum, 不明
  6. ねこった, PT2への移行, ねこったの日々, 2017-2021
  7. kazu99, mirakurun_html, Memorandum, 不明
  8. kazu99, chinachu_gamma_html, Memorandum, 不明